192.168.199.75 MySQL 、 MyCAT master
192.168.199.74 MySQL slave
192.168.199.76 MySQL standby master

如果说上面这张表不足以说明实验模型,那接下来再给一张图好了,如下所示:

实验模型

我想这样看来的话,各个节点布了哪些组件,节点间的角色关系应该一目了然了吧

实验环境规划好了以后,接下来进行具体的部署与实验过程,首先当然是 MyCAT代理的部署


MyCAT 部署

关于该部分,网上教程实在太多了,但最好还是参考官方文档来吧,下面也简述一下部署过程

  • 下载 MyCAT并解压安装

这里安装的是 MyCAT 1.5

wget https://raw.githubusercontent.com/MyCATApache/Mycat-download/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
tar -zxvf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
mv mycat /usr/local/
  • 启动 MyCAT
./mycat start
MyCAT 启动日志

  • MyCAT连接测试
mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB 
MyCAT 连接成功


MyCAT 配置

官网上对于这一部分的描述是非常详细的,MyCAT 配置主要涉及三个 XML配置文件:

  • server.xml:MyCAT框架的系统参数/用户参数配置文件
  • schema.xml: MyCAT框架的逻辑库表与分片的配置文件
  • rule.xml :MyCAT框架的逻辑库表分片规则的配置文件

用如下图形可以形象地表示出这三个 XML配置文件的配置内容和相互关系:

三个与 MyCAT相关的 xml配置

下面来进入具体的实验环节 ,这也是围绕 MyCAT提供的几大主要功能展开的,主要涉及三个方面

  • 分库分表
  • 读写分离
  • 主备切换

实验之前,我们先给出公共的 server.xml文件的配置,这部分后续实验过程中并不修改,其也就是定义了系统参数和用户参数:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <system> <property name="defaultSqlParser">druidparser</property> <!-- <property /> 这块诸多的property配置在此就不配置了,参照官网按需配置 --> </system> <user name="test"> <property name="password">test</property> <property name="schemas">TESTDB</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> </mycat:server> 

分库分表实验

预期实验效果:通过 MyCAT代理往一张逻辑表中插入的多条数据,在后端自动地分配在不同的物理数据库表上

我们按照本文 第二节【环境规划】中给出的实验模型图来给出如下的 MyCAT逻辑库配置文件 schema.xml 和 分库分表规则配置文件 rule.xml

  • 准备配置文件

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/" > <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="travelrecord" dataNode="dn1,dn2" rule="sharding-by-month" /> </schema> <dataNode name="dn1" dataHost="testhost" database="db1" /> <dataNode name="dn2" dataHost="testhost" database="db2" /> <dataHost name="testhost" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="localhost:3306" user="root" password="xxxxxx"> <readHost host="hostS1" url="192.168.199.74:3306" user="root" password="xxxxxx" /> </writeHost> <writeHost host="hostM2" url="192.168.199.76:3306" user="root" password="xxxxxx"> </writeHost> </dataHost> </mycat:schema> 

其中定义了实验用到的 hostM1、hostS1 和 hostM2

rule.xml

    <tableRule name="sharding-by-month"><rule> <columns>create_date</columns> <algorithm>partbymonth</algorithm> </rule> </tableRule> <function name="partbymonth" class="org.opencloudb.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2018-11-01</property> </function> 

这里配置了 sharding-by-month的分库分表规则,即按照表中的 create_date字段进行分割,从 2018-11-01日期开始,月份不同的数据落到不同的物理数据库表中

  • 在三个物理节点数据库上分别创建两个库 db1和 db2
create database db1;
create database db2;
  • 连接 MyCAT
mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB 
  • 通过 MyCAT来创建数据库 travelrecord
create table travelrecord (id bigint not null primary key,city varchar(100),create_date DATE); 
  • 通过 MyCAT来往travelrecord表中插入两条数据
insert into travelrecord(id,city,create_date)  values(1,'NanJing','2018-11-3'); insert into travelrecord(id,city,create_date) values(2,'BeiJing','2018-12-3'); 
通过 MyCAT往逻辑库中插入数据

由于插入的这两条记录的 create_date分别是 2018-11-3和 2018-12-3,而我们配的分库分表的规则即是根据 2018-11-01这个日期为起始来进行递增的,按照前面我们配的分片规则,理论上这两条记录按照 create_date日期字段的不同,应该分别插入到 hostM1的 db1和 db2两个不同的数据库中。

  • 验证一下数据分片的效果
数据分片的效果

由于 hostM1和 hostS1组成了 主-从库 关系,因此刚插入的两条数据也应该相应自动同步到 hostS1的 db1和 db2两个数据库中,不妨也来验证一下:

主从数据库同步也是OK的


读写分离实验

预期实验效果:开启了 MyCAT的读写分离机制后,读写数据操作各行其道,互不干扰

此节实验用到的配置文件 schema.xml 和 rule.xml基本和上面的【分库分表】实验没什么不同,只是我们需要关注一下 schema.xml配置文件中 <dataHost />标签里的 balance字段,它是与读写分离息息相关的配置:

因此我们就需要弄清楚 <dataHost /> 标签中 balance参数的含义:

  • balance="0":不开启读写分离机制,即读请求仅分发到 writeHost上
  • balance="1":读请求随机分发到当前 writeHost对应的 readHost和 standby writeHost上
  • balance="2":读请求随机分发到当前 dataHost内所有的 writeHost / readHost上
  • balance="3":读请求随机分发到当前 writeHost对应的 readHost上

我们验证一下 balance="1"的情况,即开启读写分离机制,且读请求随机分发到当前 writeHost对应的 readHost和 standby writeHost上,而对于本文来讲,也即:hostS1 和 hostM2 上

我们来做两次数据表的 SELECT读操作:

mysql> select * from travelrecord limit 6;
+----+----------+-------------+
| id | city     | create_date |
+----+----------+-------------+
| 3 | TianJing | 2018-11-04 | | 5 | ShenYang | 2018-11-05 | | 4 | Wuhan | 2018-12-04 | | 6 | Harbin | 2018-12-05 | +----+----------+-------------+ 4 rows in set (0.08 sec) mysql> select * from travelrecord limit 6; +----+---------+-------------+ | id | city | create_date | +----+---------+-------------+ | 2 | BeiJing | 2018-12-03 | | 8 | WuXi | 2018-12-06 | | 1 | NanJing | 2018-11-03 | | 7 | SuZhou | 2018-11-06 | +----+---------+-------------+ 4 rows in set (0.01 sec) 

然后我们取出 mycat.log日志查看一下具体详情,我们发现第一次 select读操作分发到了 hostM2上:

第一次 select读操作分发到了 hostM2上

而第二次 select读操作分发到了 hostS1上:

第二次 select读操作分发到了 hostS1上


主备切换实验

预期实验效果:开启 MyCAT的主备机制后,当主库宕机时,自动切换到备用机进行操作

关于主备切换,则需要弄清楚 <dataHost /> 标签中 switchType参数的含义:

  • switchType="-1":不自动切换主备数据库
  • switchType="1":自动切换主备数据库
  • switchType="2":基于MySQL主从复制的状态来决定是否切换,需修改heartbeat语句:show slave status
  • switchType="3":基于Galera(集群多节点复制)的切换机制,需修改heartbeat语句:show status like 'wsrep%'

此处验证一下 Mycat的主备自动切换效果。为此首先我们将 switchType="-1" 设置为 switchType="1",并重启 MyCat服务:

<dataHost name="testhost" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 

在本实验环境中,在 hostM1 和 hostM2均正常时,默认写数据时是写到 hostM1

  • 接下来手动停止 hostM1 上的 MySQL数据库来模拟 hostM1 宕机:
systemctl stop mysqld.service 

接下来再通过 MyCat插入如下两条数据:

insert into travelrecord(id,city,create_date)  values(3,'TianJing','2018-11-4'); insert into travelrecord(id,city,create_date) values(4,'Wuhan','2018-12-4'); 

效果如下:

hostM1宕机后,备用hostM2升级为主写节点

  • 此时,我们恢复 hostM1,但接下来的数据写入依然进入 hostM2
insert into travelrecord(id,city,create_date)  values(5,'ShenYang','2018-11-5'); insert into travelrecord(id,city,create_date) values(6,'Harbin','2018-12-5'); 
虽然hostM1恢复,但依然不是主写节点

  • 接下来手动让 hostM2宕机,看 hostM1 是否能升级为主写节点

再插入两条数据:

insert into travelrecord(id,city,create_date)  values(7,'SuZhou','2018-11-6'); insert into travelrecord(id,city,create_date) values(8,'WuXi','2018-12-6'); 
hostM2宕机后,hostM1再次升级为主写节点

很明显,答案是肯定的


后 记

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

作者:CodeSheep
链接:https://www.jianshu.com/p/d8b9da291a89
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/telwanggs/p/10803113.html

基于代理的数据库分库分表框架 Mycat实践相关推荐

  1. 阿里巴巴数据库分库分表的最佳实践

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 1.阿里巴巴分布式数据层发展和演变 业务数据从原来的单库单表模式变成了数据被拆分到多个数据库,甚至多个表中, ...

  2. 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量...

    当团队对系统业务和数据库进行了细致的梳理,确定了切分方案后,接下来的问题就是如何去实现切分方案了,目前在sharding方面有不少的开源框架和产 品可供参考,同时很多团队也会选择自主开发实现,而不管是 ...

  3. 关系型数据库分库分表中间件之选型

    写在前面 本文主要介绍关系型数据库分库分表的中间件,主要包含中间件介绍.选项及其对比.虽然市面上很多分库分表中间件,但是大多数都是不友好或者社区活跃度不高的项目,当然还是有很多淘汰的中间件.目前,在实 ...

  4. 数据库分库分表中间件对比(很全)

    数据库(分库分表)中间件对比 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件( ...

  5. mysql分库分表中间件6_当当开源sharding-jdbc,轻量级数据库分库分表中间件

    近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...

  6. 亿级流量网站架构核心技术之“数据库分库分表策略”

    本文节选自<亿级流量网站架构核心技术--跟开涛学搭建高可用高并发系统>一书 张开涛 著 电子工业出版社出版 小编会从留言中选择获赞最多的前五名用户免费送出此书哦!规则见文末. 数据库分库分 ...

  7. 当当网mysql分库分表策略_当当开源sharding-jdbc,轻量级数据库分库分表中间件

    近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...

  8. 一文搞懂MySQL数据库分库分表

    如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...

  9. 分布式专题-数据库分库分表之Mycat01-数据库性能优化方案

    目录导航 前言 为什么要分库分表 数据库性能瓶颈主要原因 数据性能优化方案 SQL 与索引 表与存储引擎 架构 配置 操作系统与硬件 架构演进与分库分表 单应用单数据库 多应用单数据库 多应用独立数据 ...

最新文章

  1. python内置库之学习configparser库(一)
  2. mysql 数据库快照迁移_快照方式备份mysql 数据库
  3. Spring框架基于AspectJ的AOP开发规范和步骤
  4. 【Windows10下OpenCV 3.4.0 + Visual Studio 2015开发环境的配】
  5. linux find批量替换java文件中字符串
  6. mysql扩展文件_MySQL中的空间扩展
  7. linux 查看http连接等
  8. 最好的3个Windows电脑上的azw3阅读器
  9. Linux 常用的软件包管理器/软件包管理工具详解
  10. Tier1 OEM ODM 区别
  11. 1919:【02NOIP普及组】选数
  12. springboot项目 o.s.b.d.LoggingFailureAnalysisReporter 错误解决方法
  13. 显示如何用最少的20美元来付款
  14. miui怎么用第三方图标包_不打广告的小米APP,比起MIUI桌面还要更好用
  15. 一篇优秀的硕士毕业论文是怎么写成的
  16. 无线网络现状与发展趋势
  17. Elixir - Map
  18. Jenkins+Fastlane+蒲公英+钉钉
  19. 基于Gitee/Github搭建个人博客
  20. 618活动,淘宝/京东/拼多多/苏宁易购/百亿补贴秒杀抢购助手,分享源码,欢迎指教

热门文章

  1. 汽车软件开发的8种颠覆性趋势及国产自主可控的多领域全数字实时仿真平台SkyEye
  2. spark sql 性能优化
  3. Spark源码分析之Master状态改变处理机制原理
  4. (10)FPGA跨时钟域处理
  5. mongodb java 开源_开源的Mongodb java client -- mango发布
  6. 10.FreeRTOS学习笔记-中断管理
  7. 完成端口可用回射服务器
  8. Linux 设备树知识点
  9. 数据结构之图的存储结构二及其实现
  10. Linux内核分析 - 网络[四补]:路由表补充