MySQL 5.5 Semi-sync 半同步複製測試

btldxx發表於2014-01-21

背景:

MySQL5.5版本中,引入了半同步複製模式(Semi-synchronous Replication,在這種模式下:master會等到binlog成功傳送並寫入至少一個slaverelay log之後才會提交,這樣,在允許損失一定的事務吞吐量的前提下來保證同步資料的安全。半同步模式其實是作為MySQL5.5的一個plugin實現的,masterslave使用不同的plugin

針對MySQL5.5的這個特性,我們做了一些測試,具體情況如下:

一、環境準備

1、作業系統與資料庫環境情況:

OS:Ubuntu 12.04 LTS \n \l

mysql:Ver 14.14 Distrib 5.5.32, for debian-linux-gnu (x86_64) using readline 6.2

2、開啟semi-sync功能:

Mysql 在編譯後會在plugin目錄生成兩個.so檔案,semisync_slave.so semisync_master.so安裝

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

主庫:

$vi my.cnf

...

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000

...

備庫:

$vi my.cnf

...

rpl_semi_sync_slave_enabled=1

這些引數是可以動態修改的

主庫執行:

set global rpl_semi_sync_master_enabled=1;

set global rpl_semi_sync_master_timeout=1000;

 

從庫執行;

set global rpl_semi_sync_slave_enabled=1;

重啟動slave

 

檢視狀態:

show status like "%rpl_semi%";

mysql> show status like "%rpl_semi%";

+--------------------------------------------+-------+

| Variable_name                              | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients               | 2     |

| Rpl_semi_sync_master_net_avg_wait_time     | 0     |

| Rpl_semi_sync_master_net_wait_time         | 0     |

| Rpl_semi_sync_master_net_waits             | 0     |

| Rpl_semi_sync_master_no_times              | 0     |

| Rpl_semi_sync_master_no_tx                 | 0     |

| Rpl_semi_sync_master_status                | ON    |

| Rpl_semi_sync_master_timefunc_failures     | 0     |

| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |

| 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     |

| Rpl_semi_sync_master_yes_tx                | 0     |

| Rpl_semi_sync_slave_status                 | OFF   |

+--------------------------------------------+-------+

說明半同步已經開啟,主庫連線有2個客戶端。

二、測試情況:

1.       關閉semi_sync功能,使用非同步複製,對主節點持續插入三百萬條資料,在插入過程中reboot主節點主機。

測試結果:

主庫上記錄數:

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  1030000 |

+----------+

備庫1

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   870000 |

+----------+

備庫2

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   690000 |

+----------+

2.       做為測試1的對照,開啟semi_sync功能,使用半同步複製,對主節點持續插入三百萬條資料,在插入過程中reboot主節點主機。

測試結果:

主庫

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  1050000 |

+----------+

1 row in set (0.00 sec)

 

備庫1

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  1050000 |

+----------+

1 row in set (0.00 sec)

mysql>

備庫2

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  1040000 |

+----------+

1 row in set (0.00 sec)

 

結論:在經過反覆測試,發現在使用reboot(與使用servcie mysql stop命令結果相同),關閉主機的情況下,半同步複製會保證至少一臺從節點資料與主節點一致。而非同步複製很少能夠做到從節點資料不丟失。

3.       關閉semi_sync功能,使用非同步複製,對主節點持續插入三百萬條資料,在插入過程中直接關閉主節點電源。

測試結果:

主庫53

Database changed

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  2118997 |

+----------+

1 row in set (0.00 sec)

 

mysql>

從庫74

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  2390000 |

+----------+

1 row in set (0.00 sec

從庫141

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  2390000 |

奇怪的是兩個從庫資料均比主庫多,

第二次測試:

主庫:

Database changed

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   177536 |

+----------+

1 row in set (0.00 sec)

 

mysql>

從庫1

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   450000 |

+----------+

1 row in set (0.00 sec

從庫2

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   430000 |

+----------+

1 row in set (0.00 sec)

 

第二次測試儘管兩個從庫資料不一致,但都不主庫資料多。

此時檢視從節點狀態,報錯資訊:

Last_IO_Errno: 1236

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin.000017' at 27462756, the last event read from '/var/log/mysql/mysql-bin.000017' at 4, the last byte read from '/var/log/mysql/mysql-bin.000017' at 4.'

Last_SQL_Errno: 0

 

結果分析:反覆關電測試,發現每次都會出現從節點比主節點資料多的情況。經過分析,我們認為,mysql中從節點應該是直接讀取的主節點中的快取中的資料,而這些資料如果在沒有寫入磁碟中就出現斷電的話,這部分資料主節點中將會丟失,而此時從節點因為得到了這部分快取了的資料,所以會出現比主節點資料多的情況。

 

4、做為測試3的對照,開啟semi_sync功能,使用半同步複製,對主節點持續插入三百萬條資料,在插入過程中關閉主節點主機電源。

 

測試結果:

 

主庫53

Database changed

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  2118997 |

+----------+

1 row in set (0.00 sec)

 

mysql>

從庫74

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  2390000 |

+----------+

1 row in set (0.00 sec

從庫141

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|  2390000 |

 

第二次測試:

主庫:

Database changed

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   177536 |

+----------+

1 row in set (0.00 sec)

 

mysql>

從庫1

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   450000 |

+----------+

1 row in set (0.00 sec

從庫2

mysql> select count(*) from sbtest;

+----------+

| count(*) |

+----------+

|   430000 |

+----------+

1 row in set (0.00 sec)

 

 

結論:在直接關電的情況下,是否開啟半同步複製區別不大,都會出現從庫比主庫多的情況。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14594028/viewspace-1073519/,如需轉載,請註明出處,否則將追究法律責任。

相關文章