测试环境:
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Server version: 5.6.22-log MySQL Community Server (GPL)

mysql的replication协议是异步的,虽然异步效率、性能很好,但是却无法保证主从数据一致性,
如果master crash,已经commit的事务不会被传送到任何的slave上,
从mysql5.5之后,mysql为了保证主从库数据一致性,引进了semi-sync功能,
semi-sync意思是MASTER只需要接收到其中一台SLAVE的返回信息,就会commit;否则需等待直至切换成异步再提交。

优点:
当事务返回客户端成功后,则日志一定在至少两台主机上存在。
MySQL的Semi-sync适合小事务,且两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。

缺点:
完成单个事务增加了额外的等待延迟,延迟的大小取决于网络的好坏。

配置方法:
在主库安装semisync_master插件:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’; //linux
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.dll’; //windows

在备库安装semisync_slave插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’; //linux
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;//windows
主库上,新增如下参数:
$vi /etc/my.cnf

[mysqld]

rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

备库上新增:

$vi /etc/my.cnf

[mysqld]

rpl_semi_sync_slave_enabled=1

重启master和slave,semi_sync插件会自动加载

重启后,master显示如下:
mysql> show variables like ‘%rpl_semi%’;
+————————————+——-+
| Variable_name | Value |
+————————————+——-+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON | #表示即使没有SLAVE也会等待过期时间结束,是默认值
+————————————+——-+
4 rows in set (0.00 sec)

mysql> show status like ‘%semi%’;
+——————————————–+———-+
| Variable_name | Value |
+——————————————–+———-+
| Rpl_semi_sync_master_clients | 3 | #有多少个Semi-sync的备库,我配置了3个
| Rpl_semi_sync_master_net_avg_wait_time | 2525 | #事务提交后,等待备库响应的平均时间
| Rpl_semi_sync_master_net_wait_time | 45892342 | #总的网络等待时间
| Rpl_semi_sync_master_net_waits | 18174 | #等待网络响应的总次数
| Rpl_semi_sync_master_no_times | 0 | #一共有几次从Semi-sync跌回普通状态
| Rpl_semi_sync_master_no_tx | 0 | #备库未及时响应的事务数
| Rpl_semi_sync_master_status | ON | #主库上Semi-sync是否正常开启
| Rpl_semi_sync_master_timefunc_failures | 0 | #时间函数未正常工作的次数
| Rpl_semi_sync_master_tx_avg_wait_time | 1196 | #开启Semi-sync,事务返回需要等待的平均时间
| Rpl_semi_sync_master_tx_wait_time | 7918635 | #事务等待备库响应的总时间
| Rpl_semi_sync_master_tx_waits | 6620 | #事务等待备库响应的总次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | #改变当前等待最小二进制日志的次数
| Rpl_semi_sync_master_wait_sessions | 0 | #当前有几个线程在等备库响应
| Rpl_semi_sync_master_yes_tx | 6549 | #Semi-sync模式下,成功的事务数
+——————————————–+———-+
14 rows in set (0.00 sec)

slave上显示如下:
mysql> show variables like ‘%rpl_semi%’;
+———————————+——-+
| Variable_name | Value |
+———————————+——-+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+———————————+——-+
2 rows in set (0.01 sec)

mysql> show status like ‘%semi%’;
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| Rpl_semi_sync_slave_status | ON |
+—————————-+——-+
1 row in set (0.00 sec)