新聞中心
MySQL主從復(fù)制包括異步模式、半同步模式、GTID模式以及多源復(fù)制模式,本篇文章重點講解一下mysql的半同步模式。

創(chuàng)新互聯(lián)建站主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)西市,十多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
一,為什么要使用半同步復(fù)制?
MySQL復(fù)制默認是異步復(fù)制,Mysql Master Server將自己的Binary Log通過復(fù)制線程傳輸出去以后,Mysql Master Sever就自動返回數(shù)據(jù)給客戶端,但并不知道Slave是否或何時已經(jīng)接收且已處理,因此存在一定的概率備庫與主庫的數(shù)據(jù)是不對等的。在異步復(fù)制的機制的情況下,如果Master宕機,事務(wù)在Master上已提交,但很可能這些事務(wù)沒有傳到任何的Slave上。假設(shè)有Master->Salve故障轉(zhuǎn)移的機制,此時Slave也可能會丟失事務(wù)。有些情況下需要保持主備庫的強一致性,此時啟用MySQL的半同步復(fù)制特性則是非常完美的。semi_sync_replication是google為mysql開發(fā)的一個基于半同步的補丁,從mysql5.5之后,mysql為了保證主從庫數(shù)據(jù)一致性,引進了semi-sync功能。
在半同步復(fù)制的架構(gòu)下,當master在將自己binlog發(fā)給slave上的時候,要確保slave已經(jīng)接受到了這個二進制日志以后,才會返回數(shù)據(jù)給客戶端。對比兩種架構(gòu):異步復(fù)制對于用戶來說,可以確保得到快速的響應(yīng)結(jié)構(gòu),但是不能確保二進制日志確實到達了slave上;半同步復(fù)制對于客戶的請求響應(yīng)稍微慢點,但是他可以保證二進制日志的完整性。
二,半同步復(fù)制原理
半同步復(fù)制的概念:
1,當Slave主機連接到Master時,能夠查看其是否處于半同步復(fù)制的機制。
2,當Master上開啟半同步復(fù)制的功能時,至少應(yīng)該有一個Slave開啟其功能。此時,一個線程在Master上提交事務(wù)將受到阻塞,直到得知一個已開啟半同步復(fù)制功能的Slave已收到此事務(wù)的所有事件,或等待超時。
3,當一個事務(wù)的事件都已寫入其relay-log中且已刷新到磁盤上,Slave才會告知已收到。在 Master 實例上,有一個專門的線程(ack_receiver)接收備庫的響應(yīng)消息,并以通知機制告知主庫備庫已經(jīng)接收的日志,可以繼續(xù)執(zhí)行。
4,如果等待超時,也就是Master沒被告知已收到,此時Master會自動轉(zhuǎn)換為異步復(fù)制的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉(zhuǎn)換為半同步復(fù)制的機制。
5,半同步復(fù)制的功能要在Master,Slave都開啟,半同步復(fù)制才會起作用;否則,只開啟一邊,它依然為異步復(fù)制。
6,半同步特性的出現(xiàn),就是為了保證在任何時刻主備數(shù)據(jù)一致的問題。相對于異步復(fù)制,半同步復(fù)制要求執(zhí)行的每一個事務(wù),都要求至少有一個備庫成功接收后,才返回給用戶。
二,半同步復(fù)制的實現(xiàn)
配置主節(jié)點:
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;#設(shè)置超時時間
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是否開啟半同步,開啟或不開啟,將其設(shè)置為ON或OFF(1or0).
rpl_semi_sync_master_timeout是控制Master等待多長時間被告知Slave已收到,也就是所謂的超時時間。
rpl_semi_sync_slave_enabled是控制Slave是否開啟半同步,開啟或不開啟,將其設(shè)置為ON或OFF(1or0)。
監(jiān)控半同步復(fù)制的狀態(tài)變量(幾個常用的):
Rpl_semi_sync_master_clients:查看有多少個開啟半同步復(fù)制的插件的Slave
Rpl_semi_sync_master_status:查看在Master上半同步復(fù)制是否正在運行,其值為ON時,說明Master已啟用半同步且已被告知有Slave收到;其值為OFF時,說明Master沒啟用半同步或是沒被告知,由于timeout等原因。
Rpl_semi_sync_master_no_tx:查看有多少事務(wù)沒有用半同步復(fù)制的機制進行復(fù)制。
Rpl_semi_sync_master_yes_tx:查看有多少事務(wù)是通過半同步復(fù)制機制成功復(fù)制。
Rpl_semi_sync_slave_status:查看Slave上半同步復(fù)制是否正常運行,其值為ON時,說明Slave正通過半同步復(fù)制且Slave I/O正在運行;為OFF時,反之。
使用相同步驟配置從節(jié)點,完成后需要重啟io_thread,不重啟當執(zhí)行時會超時,超時后則自動降為異步:
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)
然后自行驗證吧!
總結(jié):使用半同步復(fù)制機制,性能也許會受到影響,但其主要是為了維持數(shù)據(jù)完整性,安全性的的一個策略,雖會損失一點性能,但還是值得的。
分享名稱:講解一下MySQL半同步模式機制
本文地址:http://fisionsoft.com.cn/article/ccshoho.html


咨詢
建站咨詢
