Test report for Semisynchronous replication
Semi: Semisynchronous replication
Async: asynchronous replication
半同同步其实在mysql返回给client之前增加对slave的复制进度校验。为解决异步复制中master crash时的数据的不一致问题。半同步对slave的角色进行细化:异步slave和半同步slave。在连接时slave告知master自己的角色信息。Master在有一个及一个以上的半同步slave 时,每一次事务的提交将等待至少一个slave的响应直到timeout,slave的确认方式为该事务已经写入relay log。无半同步slave或半同步slave 均timeout,master会自动切换为异步复制。如果master在等待slave响应的时间内crash,这个事务将会丢失。详解后续测试。
配置
Semi 配置条件:
1.mysql 5.5 or higher
2.have_dynamic_loading=yes #需支持动态加载插件
3.working replication
配置过程:
1.user manage semisync should have super privilege。
2.pulgin dir shows where where are the plugin install file。
on master:
install plugin rpl_semi_sync_master soname 'semisync_master.so'
on each slave:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so'
#这里出现找不到module一类的问题时,使用命令show variables like 'plugin_dir'。
#在相应目录确认.so文件是否存在,手册中也有提到名字在不同系统中会不一样。
3.configure my.cnf
On master:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # ms
On slave:
rpl_semi_sync_slave_enabled=1
4.monitor
Check the configure and status info:
Show variables like 'rpl_semi_sync%' Show status like 'Rpl_semi_sync%'
On master
mysql> show status like 'Rpl_%';
+--------------------------------------------+---------------+
| Variable_name | Value |
+--------------------------------------------+---------------+
| Rpl_semi_sync_master_clients | 1 | #semi slave 数量
| Rpl_semi_sync_master_net_avg_wait_time | 5887 |#网络平均等待时间
| Rpl_semi_sync_master_net_wait_time | 1100719412 |#网络等待总时间
| Rpl_semi_sync_master_net_waits | 186973 |#网络等待次数
| Rpl_semi_sync_master_no_times | 7 |#
| 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 | 226274 | #事务平均的等待时间
| Rpl_semi_sync_master_tx_wait_time | 2967766510206 | #事务等待总时间
| Rpl_semi_sync_master_tx_waits | 13115775 | #事务等待次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 369378 | #
| Rpl_semi_sync_master_wait_sessions | 0 | #
| Rpl_semi_sync_master_yes_tx | 380108 | #同步成功事务数量
| Rpl_status | AUTH_MASTER |
+--------------------------------------------+---------------+
On slave
mysql> show status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
Test
测试环境:
Master:ubuntu64 2G E5700*2 mysql 5.5.21
Slave: ubuntu64 2G E5700*2 mysql 5.5.21
整体性能
测试工具sysbench
初始化数据:100w
测试1: thread=10 request=10000
Type
Total Time
Per-request avg time
Semi
62.1098s
62.06ms
async
63.0325s
62.97ms
S-A
-0.9227s
-0.91ms
测试2: thread=100 request=10000
Type
Total Time
Per-request avg time
Semi
62.931s
627.42ms
async
42.1309s
418.72ms
S-A
20.8s
208.7ms
测试3:thread=100 request=50000
Type
Total Time
Per-request avg time
Semi
260.2079s
519.76ms
Async
209.101s
417.03ms
S-A
51.1069s
102.73ms
测试4:thread=100 request=100000
Type
Total Time
Per-request avg time
Semi
485.866s
485.67ms
async
433.9654s
433.72ms
S-A
51.9006s
51.95ms
测试5: thread=100 request=200000
Type
Total Time
Per-request avg time
Semi
1086.3302s
543.08ms
async
808.14s
403.83ms
S-A
278.1902
139.25ms
汇总数据:
request
semi
async
semi-async
s-a/async
1w
62.931
42.1309
20.8001
0.49370177
5w
260.2079
209.101
51.1069
0.24441251
10w
485.866
433.9654
51.9006
0.11959617
20W
1086.33
808.14
278.1902
0.34423516
Request-time图:
分析:测试1.在低负载情况下semi与async的性能没有明显的差距。
测试2-5.随着并发数和事务数量的增加,semi将消耗更多的时间在等待slave的响应。使用semi将降低系统10%~30%的事务处理能力。
数据完整性
rpl_semi_sync_master_timeout =10000ms #master commit后等待slave响应超时时间
测试1。Slave crash
Master
slave
Set global rpl_semi_sync_master_enabled=1;
create table t1(id int);
Rpl_semi_sync_master_no_tx | 0
Rpl_semi_sync_master_yes_tx | 380107
Stop slave
Start transaction;
Insert into t1(id)values(1);
Commit; |10.01sec
Rpl_semi_sync_master_no_tx | 1
一个事务未通过半同步复制
Start slave
Insert into t1(id)values(2);
Rpl_semi_sync_master_no_tx | 1
Rpl_semi_sync_master_yes_tx | 380108
自动切回半同步模式
分析:在事务前stop slave,master开始提交事务,commit后等待一个slave的返回信息直到设置的timeout=10s,切换为异步复制模式。此后start slave后,slave将读取master 日志继续同步,并自动切换到半同步模式。Slave crash在多slave情况对整个系统不会造成影响(其他slave将返回信息给master),在单slave情况下,master 切换为异步复制后,对系统应用无影响。
测试2 。master crash
Set autocommit=true
Master
Slave
rpl_semi_sync_master_timeout =20000ms
Stop slave
Insert into t1(id)values(3);
Kill mysqld process
Start slave
Service mysql start
Select count(*) from t1 | 7
Select count (*) from t1(6) |6
分析:通过kill mysql process 模拟master crash,stop slave来模拟master 与slave之间由网络、并发等引起的响应延迟。Master crash 在等待slave响应过程中crash丢失此次事务的数据。处理分为2种情况:
a.master可恢复。则master恢复后slave将同步未同步数据,数据无丢失。
b.master不可恢复(硬盘坏掉)。则最大的损失为crash时刻master等待slave响应的事务数据将丢失,且程序端将捕获该事务master的异常,在新的master运行后,程序端需做逻辑回滚。