MySQL 5.5 Semi-sync 半同步複製測試
背景:
在MySQL5.5版本中,引入了半同步複製模式(Semi-synchronous Replication),在這種模式下:master會等到binlog成功傳送並寫入至少一個slave的relay log之後才會提交,這樣,在允許損失一定的事務吞吐量的前提下來保證同步資料的安全。半同步模式其實是作為MySQL5.5的一個plugin實現的,master和slave使用不同的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 5.7半同步複製MySql
- MySQL 8 複製(二)——半同步複製MySql
- MySQL主從複製之半同步複製MySql
- Mysql5.7半同步複製MySql
- mysql半同步複製的設定MySql
- MySQL5.7主從複製-半同步複製搭建MySql
- 半同步複製報錯mysql8.0.25MySql
- MySQL增強(Loss-less)半同步複製MySql
- #MySQL# mysql5.7新特性之半同步複製MySql
- MySQL5.7半同步複製報錯案例分析MySql
- MySQL 8 複製(一)——非同步複製MySql非同步
- MySQL主從複製之非同步複製MySql非同步
- Mariadb之半同步複製叢集配置
- Mysql半同步複製模式說明及配置示例 - 運維小結MySql模式運維
- MySQL半同步複製資料最終一致性驗證MySql
- 多從庫時半同步複製不工作的BUG分析
- MySQL 同步複製及高可用方案總結MySql
- 測試CMS同步測試CMS同步測試CMS同步
- MySQL複製MySql
- MySQL 5.7 多主一從(多源複製)同步配置MySql
- MySQL-主從複製之同步主從資料MySql
- mysql同步(複製)延遲的原因及解決方案MySql
- mysql複製--主從複製配置MySql
- MySQL 半同步 與Raft對比MySqlRaft
- MySQL半同步使用注意事項MySql
- MySQL的半同步是什麼?MySql
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- linux下mysql主從複製,實現資料庫同步LinuxMySql資料庫
- Mysql 非同步複製延遲的原因及解決方案MySql非同步
- MySQL 5.7的安裝及主從複製(主從同步)MySql主從同步
- MySQL面試寶典-主從複製篇MySql面試
- MySQL 8 複製(三)——延遲複製與部分複製MySql
- MySQL主從複製之GTID複製MySql
- MySQL 8 複製(四)——GTID與複製MySql
- MySQL 8 複製(五)——配置GTID複製MySql
- MySQL 複製全解析 Part 11 使用xtrabackup建立MySQL複製MySql
- MySQL案例-並行複製亂序提交引起的同步異常MySql並行
- mysql GTID主從複製故障後不停機恢復同步流程MySql
- 技術分享 | MySQL:從庫複製半個事務會怎麼樣?MySql