MySQL DBA
分类: Mysql/postgreSQL
2013-03-07 13:17:36
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运行后,程序端需做逻辑回滚。