目录

mycat实现双主双从高可用读写分离

双主双从高可用读写分离介绍

前面我们搭建mycat实现了一主一从读写分离,今天我们来搭建一个双主双从高可用的读写分离,mysql双主其实就是互相同步,互为主从,任意一台都能够执行增删改动作。生产环境用得非常少,因为还是担心数据一致的问题,生产环境一般来说一主多从已经够用。

http://img.cana.space/picStore/20201121160819.png

编号 角色 IP地址
1 Master1 182.30.0.2
2 Slave1 182.30.0.3
3 Master2 182.30.0.4
4 Slave2 182.30.0.5
  • M1 S1 主从复制 M2 S2 主从复制;
  • M1,M2 互为主从复制 实现数据同步;
  • 无论哪个挂掉,Mycat可以自动切换,依然系统可用;

mysql双主双从搭建

mysql双主双从搭建

mycat双主双从读写分离配置实现

在一主一从配置的基础上,再增加一个读写分离配置即可,balance改成1,配上m2、s2,注意ip别写错,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- 将randomDataNode改成dataNode -->
	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
	</schema>

	<!--配置成自己的数据库-->
	<dataNode name="dn1" dataHost="localhost1" database="eden" />

	<!--
	balance="1",  全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
	switchType="1" 自动切换
	-->

	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="182.30.0.2:3306" user="root" password="333">
			 <!-- 配置从库 -->
			 <readHost host="hostS1" url="182.30.0.3:3306" user="root" password="333" />
		</writeHost>
		<writeHost host="hostM2" url="182.30.0.4:3306" user="root" password="333">
			 <!-- 配置从库 -->
			 <readHost host="hostS2" url="182.30.0.5:3306" user="root" password="333" />
		</writeHost>
	</dataHost>
</mycat:schema>

重启mycat

1
$ docker restart 9b

mycat双主双从高可用读写分离测试

使用navicat连接mycat,TESTDB是逻辑库,指向物理库eden

读写分离测试

1
2
3
4
-- 使用逻辑库TESTDB执行插入,可以看到其他4个库(m1,m2,s1,s2)都已经更新了。
insert into student values(3, '王五');
-- 使用逻辑库TESTDB查询,结果ok
select * from student;

如果在配置数据库是binlog_format设置成statement,还可以使用@@hostname很明显地看到查询是从从库中进行的。

高可用测试

m2宕机,$ docker stop 16

继续插入一条数据,insert into student values(4, '麻六');

可以看到m1,s1更新了,m2宕机,s2也就不更新了,再次启动m2,$ docker start 16

可以看到m2数据同步ok,s2也能看到这次更新的数据。

http://img.cana.space/picStore/20201121184204.png

总结

双主双从架构配置主要麻烦在配置mysql双主双从上,mycat配置双主双从还是很简单的。