Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273464
  • 博文数量: 52
  • 博客积分: 120
  • 博客等级: 民兵
  • 技术积分: 1189
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-03 15:41
个人简介

MySQL DBA

文章分类

全部博文(52)

文章存档

2013年(51)

2011年(1)

分类: 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运行后,程序端需做逻辑回滚。

阅读(1693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~