MySQL双主(master-master)+半同步(Semisync Replication)

架构:

1、mysqlA和mysqlB互为主备,即双主架构Master-Master。

2、使用semisync半同步机制,保证双主数据一致。

3、只有一个Master承担写操作,另一个备用,可承担读操作,配合应用实现读写分离。

4、双主加上Keepavlied可搭建高可用MySQL集群,实现单点故障切换。(本文不涉及)

  高可用部分参考 http://blog.csdn.net/qq_16177481/article/details/70241439 

  修改一下haproxy的配置文件链接就可以了 亲测可用

一、准备工作

1)安装最新版MySQL5.7

参考我的上一篇文章http://blog.csdn.net/qq_16177481/article/details/70269774

MySQL5.7改善了半同步复制,降低了主从数据不一致的风险。



2)修改MySQL配置文件

启动MySQL之前先修改/etc/my.cnf,增加下面的配置。

mysqlA的配置文件:

1
2
3
4
5
6
7
8
9
10
server- id  = 1
log-bin=mysql-bin     # 打开二进制日志功能,作为主库时必须设置
log-slave-updates     # 做为从库时,数据库的修改也会写到bin-log里
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
expire_logs_days=5    # 表示自动删除5天以前的binlog,可选

mysqlB的配置文件:

1
2
3
4
5
6
7
8
9
10
server- id  = 2
log-bin=mysql-bin
log-slave-updates
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
expire_logs_days=5


3)在mysqlA和mysqlB上创建专门用于Replication的账户

1
2
GRANT  REPLICATION SLAVE  ON  *.*  TO  'repl_user' @ '172.16.4.%'  IDENTIFIED  BY  'MNVq_YOg9' ;
> FLUSH  PRIVILEGES ;


二、Master-Master配置

mysqlA和mysqlB都是刚安装好的、干净的数据库,可根据下面的步骤搭建Master-Master。

1)配置mysqlA为主库
在mysqlA上配置:

1
2
3
> reset master;(清空master的binlog,平时慎用,可选)
> flush tables  with  read  lock;
> show master status;

wKiom1Sc43njuPCVAAHylRosxp0182.jpg


2)配置mysqlB为mysqlA的从库
在mysqlB上配置:

1
2
3
4
> stop slave;
> CHANGE MASTER  TO  MASTER_HOST= '172.16.4.235' , MASTER_USER= 'repl_user' , MASTER_PASSWORD= 'MNVq_YOg9' , MASTER_LOG_FILE= 'mysql-bin.000001' , MASTER_LOG_POS=120;
> start slave;
> show slave status\G

wKiom1Sc0ObCCwvfAAVTEAvBZNE531.jpg查看Slave_IO_Running和Slave_SQL_Running的状态,如果都为Yes,从库配置成功。

3)将mysqlB设为主库

在mysqlB上设置:

1
2
3
> reset master;(清空master的binlog,平时慎用,可选)
> flush tables  with  read  lock;
> show master status;

wKiom1Sc43njuPCVAAHylRosxp0182.jpg


4)将mysqlA设为mysqlB的从库

在mysqlA上配置:

1
2
3
4
5
> unlock tables;
> stop slave;
> CHANGE MASTER  TO  MASTER_HOST= '172.16.4.236' , MASTER_USER= 'repl_user' , MASTER_PASSWORD= 'MNVq_YOg9' , MASTER_LOG_FILE= 'mysql-bin.000001' , MASTER_LOG_POS=120;
> start slave;
> show slave status\G

wKiom1Sc01awreiPAAUuWZrW9qU421.jpg

最后在mysqlB上:

1
> unlock tables;

至此双主已经配置完成,下面配置半同步。


三、Semisync半同步配置

1)加载semisync_master和semisync_slave插件

mysqlA和mysqlB上执行:

1
2
3
> INSTALL PLUGIN rpl_semi_sync_master SONAME  'semisync_master.so' ;
> INSTALL PLUGIN rpl_semi_sync_slave SONAME  'semisync_slave.so' ;
> show variables  like  '%semi%' ;

wKioL1Sc2LWz_GURAANaexTXimc467.jpg

rpl_semi_sync_master_timeout=10000

表示主库在某次事务中,如果等待时间超过10秒,则降级为普通模式,不再等待备库。如果主库再次探测到备库恢复了,则会自动再次回到semisync模式。
rpl_semi_sync_master_wait_point=AFTER_SYNC

这个参数是MySQL5.7新增的,AFTER_SYNC工作流程:
1、客户端提交一个事务,master将事务写入binlog并刷新到磁盘,发送到slave,master等待slave反馈。
2、slave接收master的binlog,写到本地的relaylog里。发送确认信息给master。
3、当接收到slave反馈,master提交事务并返回结果给客户端。这样就保证了主从数据一致。


2)开启semisync master和slave

mysqlA和mysqlB上执行:

1
2
SET  GLOBAL  rpl_semi_sync_master_enabled = 1;
SET  GLOBAL  rpl_semi_sync_slave_enabled = 1;

并修改my.cnf,添加下面两行:

1
2
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1

wKioL1Sc20-gmDOuAARxtqR4bHI880.jpg

我们看到semi_sync_master_status是ON的,而semi_sync_slave_status是OFF的,下面我们启动它。


3)使半同步机制生效

mysqlA和mysqlB上执行:

1
2
> stop slave;start slave;
> show status  like  '%semi%' ;

wKiom1Sc2u2hxPmOAARIz1JUSpg229.jpg

我们看到semi_sync_slave_status是ON了,已经启动。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安装 MySQL 8.0 的主-主同步备份,需要进行以下步骤: 1. 安装 MySQL 8.0:在官网上下载 MySQL 8.0 的安装包,按照提示进行安装。 2. 配置主-主同步备份:在两个 MySQL 实例中分别进行以下操作: a. 修改 my.cnf 配置文件:在 [mysqld] 段中增加如下配置 ``` server-id=1 # 1为第一个实例,2为第二个实例 log-bin=mysql-bin # 开启二进制日志 binlog_format=ROW # 选择ROW模式 ``` b. 重启 MySQL 服务:在两个实例中都执行以下命令,使配置生效 ``` systemctl restart mysqld ``` c. 创建用于同步的用户:在两个实例中都执行以下命令,创建用于同步的用户 ``` CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ``` d. 查看主服务器状态:在其中一个实例中执行以下命令,查看主服务器状态 ``` SHOW MASTER STATUS; ``` 记录下输出结果中的 File 和 Position,备用。 e. 配置从服务器:在另一个实例中执行以下命令,配置从服务器 ``` CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position; ``` 其中,MASTER_HOST 为主服务器的 IP 地址,recorded_log_file_name 和 recorded_log_position 分别为主服务器状态中记录的 File 和 Position。 f. 启动从服务器:在从服务器中执行以下命令,启动从服务器 ``` START SLAVE; ``` 3. 测试主-主同步备份:在任意一个 MySQL 实例中执行以下命令,创建一个测试表 ``` CREATE TABLE test(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20)); INSERT INTO test(name) VALUES('test'); ``` 在另一个实例中执行以下命令,查询测试表 ``` SELECT * FROM test; ``` 如果查询结果与创建表时的数据一致,则说明主-主同步备份配置成功。 需要注意的是,主-主同步备份会导致数据一致性问题,需要注意避免数据冲突。同时,MySQL 8.0 的主-主同步备份也支持 GTID 模式,可以更好地解决数据冲突问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值