前提:
MySQL版本:5.7.44
系统版本:Centos 7.8
| IP地址 |
master-A | 192.168.10.11 |
master-B | 192.168.10.12 |
配置
1. 创建用户并设置权限
(1)master-A
create user 账户名 identified by '密码';
grant replication slave on *.* to '账户名'@'master-B的IP' identified by '密码';
(2)master-B跟上面操作一样
create user 账户名 identified by '密码';
grant replication slave on *.* to '账户名'@'master-A的IP' identified by '密码';
2. master-A和master-B创建数据库(已有可以忽略)
create database 数据库名 character set utf8;
3. 配置文件
vim /etc/my.cnf
需要注意的点
[mysqld]
server-id = 1 #[必须]服务器唯一ID,每台服务器需不同
log-bin = /home/mysql/mysql-bin #[必须]启用二进制文件
binlog_format = mixed #[不是必须]二进制文件启用混合模式
expire-logs-days = 14 #[不是必须]二进制文件过期时间,单位是天
sync-binlog = 1 #[不是必须]当每进行1次事务提交之后,MySQL将进行一次磁盘同步指令来将binlog_cache中的数据强制写入磁盘
# MASTER DB #
binlog-do-db = test,androidpnserver #[不是必须]只将对应的数据库变动写入二进制文件。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
binlog-ignore-db = mysql,information_schema,performance_schema #[必须]不需要记录二进制日志的数据库。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项。一般为了保证主主同步不冲突,会忽略mysql数据库。
auto-increment-increment = 10 #[必须]
auto-increment-offset = 1 #[必须]
#做主主备份的时候,因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。
#解决这个问题的办法就是让每个数据库的自增主键不连续。上面两项说的是,假设需要将来可能需要10台服务器做备份,将auto-increment-increment设为10。而auto-increment-offset=1表示这台服务器的序号。从1开始,不超过auto-increment-increment。
# SLAVE DB #
replicate-do-db = test,androidpnserver #[不是必须]只同步对应的数据库。如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项
replicate-ignore-db = mysql,information_schema,performance_schema #[必须]不需要同步的数据库。如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项。一般为了保证主主同步不冲突,会不同步mysql数据库。
relay_log = /home/mysql/relay-bin #[不是必须]开启中继日志,复制线程先把远程的变化复制到中继日志中,再执行。
log-slave-updates = ON #[必须]中继日志执行之后将变化写入自己的二进制文件
slave-skip-errors = all #[不是必须]跳过所有的sql语句失败
(1)master-A
(2)master-B
(3)2台服务器都重启
systemctl restart mysqld
4. 配置master
(1)两边先锁表,防止新的数据写入。同时查看master状态
记住 File 和 Position ,下面会用到
flush tables with read lock; #锁表
show master status; #查看master状态
master-A
master-B
(2)master-A
change master to master_host='master-B的IP',
master_user='master-B创建的账户名',
master_password='对应账户密码',
master_log_file='master-B的File',
master_log_pos=master-B的Position;
(3)master-B
change master to master_host='master-A的IP',
master_user='master-A创建的账户名',
master_password='对应账户密码',
master_log_file='master-A的File',
master_log_pos=master-A的Position;
5. 启动服务
(1)2台数据库都启动主从
unlock tables; #把表解开
start slave;
(2) 查看连接情况
show slave status \G
出现2个YES则成功
6. 测试
(1)在master-A的test库中插入数据
在 master-B中查看,能看到数据则成功
反过来测试,在B中插入数据在A中看
能看到则成功
(2)A修改B的数据,B修改A的数据
都能修改成功
主主同步配置完成
参考链接:
MySQL配置主主同步