首先,上一篇我们建立了一主一丛模式的MySQL读写分离 点击这里 那么接下来,我们搭建双主双从模式的读写分离,并且使用MyCat登录访问
原理:master1,master2,slave1,slave2 —> master1 和 slave1主从复制,master2 和 slave2主从复制,同时 master2 做为master1的从机,进行互备主从
当然,如果你之前没有搭建过主从复制,下面这两步骤可以不需要做
server-id=1 # 定义服务器唯一ID
log-bin=mysql-bin # 启用二进制日志
binlog-ignore-db=mysql # 忽略 mysql 库(如果配置了binlog-do-db的话可以不需要设置这个)
binlog-do-db=testdb # 设置需要主从复制的库
binlog_format=STATEMENT
log-slave-updates # 在做为从数据库的时候,有写入的操作也需要记录下二进制日志文件
auto-increment-increment=2 #表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1~65535
auto-increment-offset=1 # 表示自增字段从哪个数开始,一次递增多少,取值范围是 1~65535
二、master2配置文件:
server-id=3
log-bin=mysql-bin
binlog-ignore-db=mysql
binlog-do-db=testdb
binlog_format=STATEMENT
log-slave-updates
auto-increment-increment=2
auto-increment-offset=2 # 注意起始值不一样
三、slave1配置文件:
server-id=2
relay-log=mysql-relay
四、slave1配置文件:
server-id=4
relay-log=mysql-relay
五、双主机,双从机重启 mysql 服务
六、主机从机都必须关闭防火墙
七、在两台主机上建立账户并授权 slave
create user 'slave'@'%' identified by 'qkm19981013';
grant replication slave on *.* to 'slave'@'%';
flush privileges;
八、查看 master1 的主机状态,记录下binlog日志文件名和position点的值,在slave1上执行以下语句:
change master to master_host='192.168.0.12',master_port=3307,master_user='slave',master_password='qkm19981013',master_log_file='mysql-bin.000001',master_log_pos=156;
九、查看 master2 的主机状态,记录下binlog日志文件名和position点的值,在salve2上执行以下语句:
change master to master_host='192.168.0.12',master_port=3309,master_user='slave',master_password='qkm19981013',master_log_file='mysql-bin.000001',master_log_pos=156;
十、在slave1和slave2上开启主从复制
start slave;
show slave status\G;
十一、最后一步,搭建 master1和master2的互备主从,即master1复制master2,master2复制,master1:
master1设置master2为主机:
change master to master_host='192.168.0.12',master_port=3309,master_user='slave',master_password='qkm19981013',master_log_file='mysql-bin.000001',master_log_pos=156;
start slave;
show slave status\G;
master2设置master1为主机:
change master to master_host='192.168.0.12',master_port=3307,master_user='slave',master_password='qkm19981013',master_log_file='mysql-bin.000001',master_log_pos=156;
start slave;
show slave status\G;
最后的效果就是,我们在 master1上面建立 testdb 数据库之后,其他三个MySQL都同步建立 testdb 数据库了,接着再建立 mytbl 表,其他三个也都建立,往表中插入 insert into mytbl values(1, @@hostname); 之后出现了四个数据库的数据不一致,@@hostname是系统变量,每个系统不一样,所以不同,这也验证了bin-log默认的格式是复制 SQL 语句这一说法。
mysql 8.0 默认使用 caching_sha2_password 身份验证机制 —— 从原来的 mysql_native_password 更改为 caching_sha2_password。
从 5.7 升级 8.0 版本的不会改变现有用户的身份验证方法,但新用户会默认使用新的 caching_sha2_password 。
所以在 slave 连接 master的时候,show slave status\G; 可能会出现:authentication plugin 'caching_sha2_password’的异常,这是因为MySQL8.0之后改变了密码验证器,我们只需要把在主机建立的授权用户的密码验证器改成mysql_native_password就好了,语句如下:
ALTER USER 'slave'@'192.168.0.12' IDENTIFIED WITH mysql_native_password BY 'qkm19981013';
balance 设置成 1,再添加上 写主机信息
<dataHost name="host1" 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.12:3307" user="root" password="qkm19981013">
<readHost host="hostS1" url="192.168.0.12:3308" user="root" password="qkm19981013"/>
writeHost>
<writeHost host="hostM2" url="192.168.0.12:3309" user="root" password="qkm19981013">
<readHost host="hostS2" url="192.168.0.12:3310" user="root" password="qkm19981013"/>
writeHost>
dataHost>