Mycat+mysql双主双从高可用读写分离实现
前面我们搭建了mycat实现一主一从读写分离,今天我们来搭建一个双主双从高可用的读写分离,抗风险能力强,企业级架构必须是双主双从
M1 S1 主从复制 M2 S2 主从复制; M1,M2 互为主从复制 实现数据同步;无论哪个挂掉,Mycat可以自动切换,依然系统可用;
我们来搭建两对Mysql主从复制;
前面我们搭建过一对,下面再搭建一对和之前的一样
docker run -p 3308:3306 --name master2 -d -v /home/mysql3/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql3/log/:/var/log --net extnetwork --ip 172.20.0.5 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
docker run -p 3309:3306 --name slave2 -d -v /home/mysql4/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/mysql4/log/:/var/log --net extnetwork --ip 172.20.0.6 -e MYSQL_ROOT_PASSWORD=123456 镜像ID
mysql3可以直接复制mysql1,mysql4可以直接复制mysql2的
m1,m2我们要加配置:涉及到数据插入id不冲突,以及数据同步;
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1(这里m2中写成2)
m2 的 server-id=5
s2的 server-id=6
配置OK后,我们重新搭界主从复制;
m1 删除user里的原先slave用户,重新授权;
#删除user后要重新授权
FLUSH PRIVILEGES;
CREATE USER 'slave'@'172.20.0.%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.20.0.%';
FLUSH PRIVILEGES;
RESET MASTER
s1 配置主从复制;
CHANGE MASTER TO MASTER_HOST='172.20.0.2', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
START SLAVE
SHOW SLAVE STATUS 测试
m2 创建slave用户,授权
CREATE USER 'slave'@'172.20.0.%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.20.0.%';
FLUSH PRIVILEGES;
RESET MASTER
s2 配置主从复制;
CHANGE MASTER TO MASTER_HOST='172.20.0.5', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
START SLAVE
SHOW SLAVE STATUS 测试;
到此我们把两个主从给搭建好了,下面我们配置两个主之间的互为主从复制
m2复制m1配置;
#m1先reset
RESET MASTER
#m2里配置:
CHANGE MASTER TO MASTER_HOST='172.20.0.2', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
START SLAVE
SHOW SLAVE STATUS 测试
m1复制m2配置
#m2先rest
RESET MASTER
#m1里配置:
CHANGE MASTER TO MASTER_HOST='172.20.0.5', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
START SLAVE
SHOW SLAVE STATUS 测试;
两个主之间的互为主从复制已经完成,再加一个读写分离配置即可
<dataHost name="host1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="172.20.0.2:3306" user="root"
password="123456">
<readHost host="hostS1" url="172.20.0.3:3306" user="root"
password="123456"/>
</writeHost>
<writeHost host="hostM2" url="172.20.0.5:3306" user="root"
password="123456">
<readHost host="hostS2" url="172.20.0.6:3306" user="root"
password="123456"/>
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
m2 s2 注意IP别写错以及balance要改成1 现在是双主双从;
balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡
我们搭建完成双主双从高可用读写分离,下面进行读写测试
insert into test values(null,@@hostname)
执行会发现m1 s1 m2 s2都有数据;不断刷新表数据;会发现值从s1 m2 s2随机读取;可以判断m1是作为写主机的;
还有一个高可用测试:
假如我们让m1挂掉再执行
insert into test values(null,@@hostname)
我们发现依然可以插入,m2 s2有值;说明mycat实现了自动切换主机功能;
如果我们恢复m1,这时候 我们测试发现 m2作为了写主机,m1 s1 s2成为了读主机;
到此我们Mycat+mysql双主双从高可用读写分离实现完成,有什么疑问欢迎留言评论,谢谢!