mysql Server version: 5.5.18-log MySQL Community Server (GPL)
1.安装插件
检查mysql是否支持动态添加插件:
root@localhost (none)>select @@have_dynamic_loading ;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.00 sec)
在master上安装插件:rpl_semi_sync_master
二进制安装的mysql插件一般放在:$MYSQL_HOME/lib/plugin
root@localhost wjlcn>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
root@localhost (none)>show global variables like 'rpl_semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF | #启动master 支持半同步复制
| rpl_semi_sync_master_timeout | 10000 | #主库等待半同步复制信息返回的超时间隔,默认10秒(单位毫秒)
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
rpl_semi_sync_master_trace_level 监控等级:
1 = general level (for example, time function failures)
16 = detail level (more verbose information)
32 = net wait level (more information about network waits)
64 = function level (information about function entry and exit)
rpl_semi_sync_master_wait_no_slave :是否允许master 每个事物提交后都要等待slave的receipt信号。默认为on ,每一个事务都会等待,如果slave当掉后,当slave追赶上master的日志时,可以自动的切换为半同步方式,如果为off,则slave追赶上后,也不会采用半同步的方式复制了,需要手工配置。
root@localhost (none)>show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 | #记录支持半同步的slave的个数
| Rpl_semi_sync_master_net_avg_wait_time | 0 | #master 等待slave回复的平均等待时间,单位微秒
| Rpl_semi_sync_master_net_wait_time | 0 | #master 总的等待时间
| Rpl_semi_sync_master_net_waits | 0 | #master 等待slave回复的的总的等待次数
| Rpl_semi_sync_master_no_times | 0 | #master 关闭半同步复制的次数
| Rpl_semi_sync_master_no_tx | 0 | #master 没有收到slave的回复而提交的次数
| Rpl_semi_sync_master_status | OFF | #标记master现在是否是半同步复制状态
| Rpl_semi_sync_master_timefunc_failures | 0 | #时间函数未正常工作的次数
| Rpl_semi_sync_master_tx_avg_wait_time | 0 | #开启Semi-sync,事务返回需要等待的平均时间
| Rpl_semi_sync_master_tx_wait_time | 0 | #事务等待备库响应的总时间
| Rpl_semi_sync_master_tx_waits | 0 | #事务等待备库响应的总次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | #改变当前等待最小二进制日志的次数
| Rpl_semi_sync_master_wait_sessions | 0 | #当前有多少个session 因为slave 的回复而造成等待
| Rpl_semi_sync_master_yes_tx | 0 | #master 成功接收到slave的回复的次数
+--------------------------------------------+-------+
(注:status中rpl相关的时间单位是微秒)
在slave上安装插件:rpl_semi_sync_slave
root@localhost wjlcn>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
root@localhost (none)>show global variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF | #启动slave 支持半同步复制
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
动态设置rpl_semi_sync_slave_enabled =ON,然后重启replication(stop slave;start slave;)即可。记得一定要重启,否则master无法确认该slave是否开启了半同步。相同的操作可以在任意多个slave中进行设置。
root@localhost (none)>show global status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF | #表示当前处于异步模式还是半同步模式
+----------------------------+-------+
2.上面比较重要的状态值有:
Rpl_semi_sync_master_tx_avg_wait_time:事务因开启Semi_sync,平均需要额外等待的时间
Rpl_semi_sync_master_net_avg_wait_time:事务进入等待队列后,到网络平均等待时间
依据上面两个状态值可以知道,Semi-sync的网络消耗有多大,给某个事务带来的额外的消耗有多大。
Rpl_semi_sync_master_status 则表示当前Semi-sync是否正常工作。
从Rpl_semi_sync_master_no_times变量,可以知道一段时间内,Semi-sync是否有超时失败过,该计数器则记录了这样的失败次数。
3.简单测试
3.1 开启半同步复制
设置master rpl_semi_sync_master_enabled=1 and rpl_semi_sync_master_timeout=12000
设置slave rpl_semi_sync_slave_enabled=1
3.2 创建测试表
CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
3.3 插入一些数据,一切正常
root@localhost wjlcn>select count(*) from test;
+----------+
| count(*) |
+----------+
| 8 |
+----------+
查看status变量:
master中:Rpl_semi_sync_master_status ON and Rpl_semi_sync_master_clients 1
slave 中:Rpl_semi_sync_slave_status ON
3.4 停止slave
root@localhost (none)>stop slave;
slave 中:Rpl_semi_sync_slave_status OFF
而master中仍然是:Rpl_semi_sync_master_status ON and Rpl_semi_sync_master_clients 1
3.5 插入数据
执行:
root@localhost wjlcn>insert into test values(12,'kakak');
Query OK, 1 row affected (12.00 sec)
因为从库已停止,时间刚刚好是前面设置的 rpl_semi_sync_master_timeout 的值
再看master的status变成:Rpl_semi_sync_master_status OFF and Rpl_semi_sync_master_clients 1
3.6 启动slave
start slave
当同步追上master时,
slave 中变回:Rpl_semi_sync_slave_status ON
master中变回:Rpl_semi_sync_master_status ON and Rpl_semi_sync_master_clients 1
3.7 rpl 的一些状态
root@localhost wjlcn>show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 5392 |
| Rpl_semi_sync_master_net_wait_time | 59312 |
| Rpl_semi_sync_master_net_waits | 11 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 3115 |
| Rpl_semi_sync_master_tx_wait_time | 15577 |
| Rpl_semi_sync_master_tx_waits | 5 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
+--------------------------------------------+-------+
可以看到关闭半同步复制的次数(Rpl_semi_sync_master_no_times)和 没有收到slave的回复而提交的次数(Rpl_semi_sync_master_no_tx)都变成1;可以查看Semi-sync的网络消耗有多大,给某个事务带来的额外的消耗有多大等