MySQL半同步複製實現

來源:互聯網
上載者:User

MySQL半同步複製實現
一,為什麼要使用半同步複製?

MySQL複製預設是非同步複製,Mysql Master Server將自己的Binary Log通過複製線程傳輸出去以後,Mysql Master Sever就自動返回資料給用戶端,但並不知道Slave是否或何時已經接收且已處理,因此存在一定的機率備庫與主庫的資料是不對等的。在非同步複製的機制的情況下,如果Master宕機,事務在Master上已提交,但很可能這些事務沒有傳到任何的Slave上。假設有Master->Salve容錯移轉的機制,此時Slave也可能會丟失事務。有些情況下需要保持主備庫的強一致性,此時啟用MySQL的半同步複製特性則是非常完美的。semi_sync_replication是google為mysql開發的一個基於半同步的補丁,從mysql5.5之後,mysql為了保證主從庫資料一致性,引進了semi-sync功能。

在半同步複製的架構下,當master在將自己binlog發給slave上的時候,要確保slave已經接受到了這個二進位日誌以後,才會返回資料給用戶端。對比兩種架構:非同步複製對於使用者來說,可以確保得到快速的響應結構,但是不能確保二進位日誌確實到達了slave上;半同步複製對於客戶的請求響應稍微慢點,但是他可以保證二進位日誌的完整性。

二,半同步複製原理

半同步複製架構圖如下所示:


半同步複製的概念:

 

  1,當Slave主機串連到Master時,能夠查看其是否處於半同步複製的機制。

  2,當Master上開啟半同步複製的功能時,至少應該有一個Slave開啟其功能。此時,一個線程在Master上提交事務將受到阻塞,直到得知一個已開啟半同步複製功能的Slave已收到此事務的所有事件,或等待逾時。

  3,當一個事務的事件都已寫入其relay-log中且已重新整理到磁碟上,Slave才會告知已收到。在 Master 執行個體上,有一個專門的線程(ack_receiver)接收備庫的響應訊息,並以通知機制告知主庫備庫已經接收的日誌,可以繼續執行。

  4,如果等待逾時,也就是Master沒被告知已收到,此時Master會自動轉換為非同步複製的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉換為半同步複製的機制。

  5,半同步複製的功能要在Master,Slave都開啟,半同步複製才會起作用;否則,只開啟一邊,它依然為非同步複製。

  6,半同步特性的出現,就是為了保證在任何時刻主備資料一致的問題。相對於非同步複製,半同步複製要求執行的每一個事務,都要求至少有一個備庫成功接收後,才返回給使用者。

二,半同步複製的實現

配置主節點:

  1. mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';#安裝外掛程式
  2. Query OK,0 rows affected (0.07 sec)
  3.  
  4. mysql> show global variables like '%semi%';
  5. +------------------------------------+--------------+
  6. |Variable_name|Value|
  7. +------------------------------------+--------------+
  8. | rpl_semi_sync_master_enabled | OFF |
  9. | rpl_semi_sync_master_timeout |10000|
  10. | rpl_semi_sync_master_trace_level |32|
  11. | rpl_semi_sync_master_wait_no_slave | ON |
  12. | rpl_semi_sync_master_wait_point | AFTER_COMMIT |
  13. +------------------------------------+--------------+
  14. 5 rows inset(0.00 sec)
  15.  
  16. mysql>setglobal rpl_semi_sync_master_enabled=on;#啟用外掛程式
  17. Query OK,0 rows affected (0.02 sec)
  18.  
  19. mysql>setglobal rpl_semi_sync_master_timeout=2000;#設定逾時時間
  20. Query OK,0 rows affected (0.00 sec)
  21.  
  22. mysql> show global variables like '%semi%';
  23. +------------------------------------+--------------+
  24. |Variable_name|Value|
  25. +------------------------------------+--------------+
  26. | rpl_semi_sync_master_enabled | ON |
  27. | rpl_semi_sync_master_timeout |2000|
  28. | rpl_semi_sync_master_trace_level |32|
  29. | rpl_semi_sync_master_wait_no_slave | ON |
  30. | rpl_semi_sync_master_wait_point | AFTER_COMMIT |
  31. +------------------------------------+--------------+
  32. 5 rows inset(0.00 sec)
  33.  

rpl_semi_sync_master_enabled是控制Master是否開啟半同步,開啟或不開啟,將其設定為ON或OFF(1or0).

rpl_semi_sync_master_timeout是控制Master等待多長時間被告知Slave已收到,也就是所謂的逾時時間。

rpl_semi_sync_slave_enabled是控制Slave是否開啟半同步,開啟或不開啟,將其設定為ON或OFF(1or0)。

 


監控半同步複製的狀態變數(幾個常用的):

 

Rpl_semi_sync_master_clients:查看有多少個開啟半同步複製的外掛程式的Slave

Rpl_semi_sync_master_status:查看在Master上半同步複製是否正在運行,其值為ON時,說明Master已啟用半同步且已被告知有Slave收到;其值為OFF時,說明Master沒啟用半同步或是沒被告知,由於timeout等原因。

Rpl_semi_sync_master_no_tx:查看有多少事務沒有用半同步複製的機制進行複製。

Rpl_semi_sync_master_yes_tx:查看有多少事務是通過半同步複製機製成功複製。

Rpl_semi_sync_slave_status:查看Slave上半同步複製是否正常運行,其值為ON時,說明Slave正通過半同步複製且Slave I/O正在運行;為OFF時,反之。


使用相同步驟配置從節點,完成後需要重啟io_thread,不重啟當執行時會逾時,逾時後則自動降為非同步:

 

  1. MariaDB[mydb]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
  2. MariaDB[mydb]>setglobal rpl_semi_sync_master_enabled=on;
  3.  
  4. MariaDB[mydb]> stop slave io_thread;
  5. Query OK,0 rows affected (0.01 sec)
  6.  
  7. MariaDB[mydb]> start slave io_thread;
  8. Query OK,0 rows affected (0.00 sec)
  9.  
  10. mysql> show global status like '%semi%';#查看半同步用戶端
  11. +--------------------------------------------+-------+
  12. |Variable_name|Value|
  13. +--------------------------------------------+-------+
  14. |Rpl_semi_sync_master_clients|0|
  15. |Rpl_semi_sync_master_net_avg_wait_time|0|
  16. |Rpl_semi_sync_master_net_wait_time|0|
  17. |Rpl_semi_sync_master_net_waits|0|
  18. |Rpl_semi_sync_master_no_times|1|
  19. |Rpl_semi_sync_master_no_tx|3|
  20. |Rpl_semi_sync_master_status| OFF |
  21. |Rpl_semi_sync_master_timefunc_failures|0|
  22. |Rpl_semi_sync_master_tx_avg_wait_time|0|
  23. |Rpl_semi_sync_master_tx_wait_time|0|
  24. |Rpl_semi_sync_master_tx_waits|0|
  25. |Rpl_semi_sync_master_wait_pos_backtraverse|0|
  26. |Rpl_semi_sync_master_wait_sessions|0|
  27. |Rpl_semi_sync_master_yes_tx|0|
  28. +--------------------------------------------+-------+
  29. 14 rows inset(0.00 sec)

然後自行驗證吧!

總結:使用半同步複製機制,效能也許會受到影響,但其主要是為了鑑效組資料完整性,安全性的的一個策略,雖會損失一點效能,但還是值得的。

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.