MySQL主从半同步复制

Posted 永不止步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从半同步复制相关的知识,希望对你有一定的参考价值。

一、半同步复制

1.半同步复制概念

mysql5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,
是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。
简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。

半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。
出发点是保证主从数据一致性问题,安全的考虑。

5.5 出现概念,但是不建议使用,性能太差
5.6 出现group commit 组提交功能,来提升开启半同步复制的性能
5.7 更加完善了,在group commit基础上出现了MGR
5.7 的增强半同步复制的新特性:after commit; after sync;

#缺点:
1.性能差,影响主库效率
2.半同步复制,有一个超时时间,超过这个时间恢复主从复制

# 半同步复制原理:
主要为了保证主库的binlog事务被可靠写入到从库中,主库在每次事务成功提交时,并不及时反馈给前端应用用户,
而是等待其中的一个从库也接收到Binlog事务并成功写入中继日志后,由从库的binlog返回一个ack给主库,主库只有接到从库发来的ACK确认,主库事务才能commit成功。
半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的Binlog日志上,另一份在至少一个从库的中继日志Relay log上,从而更近一步保证了数据的完整性。

# 半同步复制和全同步的区别:
和mysql全同步复制的区别为,全同步复制需要保证每一个binlog事务都写入到从库中,而半同步复制只需要保证所有的从库中有一个binlog事务写入到从库中即可。

2.配置半同步

1)主库操作

#登录数据库
[root@db01 ~]# mysql -uroot -p123
#查看是否有动态支持
mysql> show global variables like ‘have_dynamic_loading‘;
#安装自带插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME‘semisync_master.so‘;
#启动插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
#设置超时
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
#修改配置文件
[root@db01 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加如下内容(不用重启库)
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
检查安装:
mysql> show variables like‘rpl%‘;
mysql> show global status like ‘rpl_semi%‘;

2)从库操作

#登录数据库
[root@mysql-db02 ~]# mysql -uroot -poldboy123
#安装slave半同步插件
mysql>  INSTALL PLUGIN rpl_semi_sync_slave SONAME‘semisync_slave.so‘;
#启动插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
#重启io线程使其生效
mysql> stop slave io_thread;
mysql> start slave io_thread;
#编辑配置文件(不需要重启数据库)
[root@mysql-db02 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加如下内容
[mysqld]
rpl_semi_sync_slave_enabled =1

3)额外参数

rpl_semi_sync_master_timeout=milliseconds
设置此参数值(ms),为了防止半同步复制在没有收到确认的情况下发生堵塞,如果Master在超时之前没有收到任何确认,将恢复到正常的异步复制,
并继续执行没有半同步的复制操作。

rpl_semi_sync_master_wait_no_slave={ON|OFF}
如果一个事务被提交,但Master没有任何Slave的连接,这时不可能将事务发送到其它地方保护起来。默认情况下,Master会在时间限制范围内继续等待Slave的连接,
并确认该事务已经被正确的写到磁盘上。
可以使用此参数选项关闭这种行为,在这种情况下,如果没有Slave连接,Master就会恢复到异步复制。

以上是关于MySQL主从半同步复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL学习(二十四)主从同步-半同步

MySQL学习(二十四)主从同步-半同步

MySQL主从复制和半同步复制

MySQL主从复制和半同步复制

MySQL主从复制半同步复制原理及搭建

mysql主从之半同步复制和lossless无损复制