1. 架构
上一篇我们配置了一主一从,这一篇我们配置一下双主双从。
角色 | ip 地址 | 简称 |
---|---|---|
Master1 | 192.168.183.134 | 134 主 |
Slave1 | 192.168.183.133 | 133 从 |
Master2 | 192.168.183.128 | 128 主 |
Slave2 | 192.168.183.135 | 135 从 |
2. 配置
修改134主配置文件 vi /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候, 有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1, 取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
修改128主配置文件 vi /etc/my.cnf
,只需要修改 server-id 和 auto-increment-offset=2
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)Java
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
修改133从配置文件 vi /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
修改135从配置文件 vi /etc/my.cnf
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay
双主双从重启mysql服务 ,开放3306端口,关闭防火墙
#重启mysql服务器
systemctl restart mysqld
#查看mysql的状态
systemctl status mysqld
# 查看防火墙状态
systemctl status firewalld
# 开启防火墙
systemctl start firewalld
# 开启3306端口
firewall-cmd --permanent --zone=public --add-port=3306/tcp
# 重新加载防火墙
firewall-cmd --reload
# 查看防火墙是否启动成功
firewall-cmd --zone=public --query-port=3306/tcp
# 关闭防火墙
systemctl stop firewalld
在134 主服务器授予133 从服务器访问权限
# 登陆134 mysql
mysql -uroot -proot
# 执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
# 查询master的状态
show master status;
在128 主服务器授予135 从服务器访问权限
# 登陆134 mysql
mysql -uroot -proot
# 执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
# 查询master的状态
show master status;
双从服务重置主从
# 登陆mysql
mysql -uroot -proot
# 停止从服务器复制功能
stop slave;
# 重置主从
reset master;
133从执行复制命令
CHANGE MASTER TO MASTER_HOST='192.168.183.134',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=154;
133 分别执行 启动复制命令start slave;
和查看服务器状态命令 show slave status\G;
135 从执行复制命令
CHANGE MASTER TO MASTER_HOST='192.168.183.128',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=443;
135从 分别执行 启动复制命令start slave;
和查看服务器状态命令 show slave status\G;
两个主机互相复制
主134 执行复制命令
CHANGE MASTER TO MASTER_HOST='192.168.183.128',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=443;
134从主 分别执行 启动复制命令start slave;
和查看服务器状态命令 show slave status\G;
主128 执行复制命令
CHANGE MASTER TO MASTER_HOST='192.168.183.134',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=154;
128主 分别执行 启动复制命令start slave;
和查看服务器状态命令 show slave status\G;
3. 测试
128 主服务器上我们分别执行创建数据库,创建表,表中插入数据。
CREATE DATABASE testdb;
use testdb;
CREATE TABLE user(id INT,NAME VARCHAR(20));
INSERT INTO user VALUES(1,'fengjiaixng');
select * from user;
其它服务器均执行
show databases;
use testdb;
select * from user;
问题
在执行主从复制过程中,134 主服务器可以获取到主128的数据,但是135从无法获取128主的数据。
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
日志错误描述 master and slave 具有相同的 uuid。
解决
在mysql 数据目录下,删除auto.cnf 文件,默认在 /var/lib/mysql文件夹下。删除后,重启mysql 服务器。
cd /var/lib/mysql
rm -rf auto.cnf
#重启mysql服务器
systemctl restart mysqld
#查看mysql的状态
systemctl status mysqld
# 登陆mysql
mysql -uroot -proot
# 停止从服务器复制功能
stop slave;
# 重置主从
reset master;