Mycat 笔记 2:双主双从
1. 结构
192.168.0.100 master1
192.168.0.101 slave1
192.168.0.190 master2
192.168.0.191 slave2
192.168.0.170 mycat
slave1 是 master1 的从库
slave2 是 master2 的从库
master1 和 master2 互为主从,
建议 mysql 实例是 gtid + semi sync + mts,或者 PXC,或者 MGR
此处演示为了方便采用普通异步复制。
2. 双主双从高可用
据说 mycat 推荐的底层节点架构是双主双从来保证高可用。
在 mycat 的配置中,
- master1 为第一个 write host,
- master2 为第二个 write host,也就是 stand for write host
如果 master1 宕机的话,因为有 switchType=1 会自动切换到 master2 上面
<dataHost> 标签中配置 writeType=0,也就是:
- 所有写操作均由第一个 write host 承担,第一个宕机再由第二个负担
<dataHost> 标签中配置 balance=1,也就是:
- 所有的读操作在 read host 和 stand for write host 之间负担
由此,在双主双从中,往 master1 写数据,从 master2、slave1、slave2 中读数据,
由此来实现高可用。
3. 双主双从的搭建
-
slave1 是 master1 的从库
-
slave2 是 master2 的从库
-
master1 和 master2 互为主从
-
master1 是 master2 的从库
-
master2 是 master1 的从库
-
搭建过程 略
4. mycat 的 schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100"
dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="2m2s" database="world" />
<dataHost name="2m2s" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.0.100:3306"
user="root" password="123456">
<readHost host="hostS1" url="192.168.0.101:3306"
password="123456" user="root" />
</writeHost>
<writeHost host="hostM2" url="192.168.0.190:3306"
user="root" password="123456">
<readHost host="hostS2" url="192.168.0.191:3306"
password="123456" user="root" />
</writeHost>
</dataHost>
</mycat:schema>
如上:
逻辑库依旧是 TESTDB
对应的数据节点是 dn1
数据节点对应的主机组是 2m2s
2m2s 下:
hostM1 作为写节点(100),其从库 hostS1(101)作为读节点
hostM2 作为 stand by 写节点(190),其从库 hostS2(191)作为读节点
5. 启动 mycat 测试读写分离和高可用
(1)读写分离
写操作:
如上,写操作在 hostM1(100)上完成
读操作:
如上,
读操作分别在几个节点中进行,(并非轮询)
(2)高可用
先停掉 master1
再次查看读写分离
如上,
master1 宕机后,其从库 slave1 也不再参与到读中,
如上,写操作切换到 master2(190)
在 master1 宕机期间,插入一些数据,
还是建议写 use database; SQL; 的方式
重新启动 master1
master1 和 slave1 重新加入,并且已经同步了数据