目录
上一篇博客我们讲到mycat实现mysql主从复制和读写分离,但是上一篇讲到有一个小问题,就是当主从切换后,不管是一主几从,切换后,虽然可以插入数据,但是再通过mycat去获取数据时发现当恢复主的时候,负载的时候就会获取到主上面的数据,这时候主上数据和从上的数据不一致了。下面对于这个问题,我们来看看双主的情况。上一篇博客
1 机器准备
机器名 | ip | 角色 |
wyl01 | 192.168.52.128 | mycat,mysql客户端 |
wyl02 | 192.168.52.129 | master |
wyl03 | 192.168.52.130 | master |
设计思路:部署2个数据库服务,分别存放在192.168.52.129 和192.168.52.130 ,这里数据库采用的mysql-5.7.20版本,mycat为mycat-1.6版本。
2. 安装服务
2.1 mysql的双主部署
mysql的双主前面有介绍过,包括手动部署和ansible部署。这里我们直接执行ansible的playbook剧本即可。
看到上面的4个yes状态即表示双主集群搭建成功。
2.2 mycat的安装
mycat的安装可以看上一篇博客,这里给出两个配置文件的内容
server.xml
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
</user>
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="test01" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.52.129:3306" user="root" password="123456">
<readHost host="slave1" url="192.168.52.130:3306" user="root" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.52.130:3306" user="root" password="123456">
<readHost host="slave2" url="192.168.52.129:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
3 验证读写分离
3.1 验证写操作
这里我们直接看结果,具体的操作上一篇博客有介绍。在wyl01的mycat的入口,插入几条数据,是从wyl02上插入的。
3.2 验证读操作
这里由于wyl02和wyl03是做了双向主从复制(双主),按照上一篇博客,去修改wyl03数据库中的值,再去查看是不可取的。因为wyl03上去修改了,wyl02上也会修改,取得的数据是看不出来来自哪个数据库的,不过我们可以看日志的信息
根据schema.xml中的配置我们也可以知道,获取数据是负载的,两个节点都会去获取。
3.3 故障演练
停掉wyl02上的mysql服务,然后进行插入数据
到这里,和上一篇博客讲到的都是一样的,也是可以插入数据的,那么当我们再把wyl02上数据库服务给恢复,数据是否还是保持一致的。启动wyl02上的mysql服务,进行查看发现数据还是一样的。
我们看到wyl02上也有这一条数据,这样就保证了当主挂了,后续即使有数据写入,我们恢复挂的mysql服务,也不会导致数据的不一致。