一、半同步复制

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就会恢复到异步复制。