1. 程式人生 > 其它 >半同步複製

半同步複製

 

原文沒有看完,感興趣的:https://www.percona.com/blog/face-to-face-with-semi-synchronous-replication/

非同步複製和半同步複製的區別

非同步複製

這是標準的半同步複製。

 

在複製中有兩個步驟:

1.資料拷貝。通常很快。資料從源端的二進位制日誌拷貝到從庫的relay log中(io_thread)

2.資料應用。從庫從relay log中讀取資料,寫入到資料庫(sql_thread)。這一步通常會是瓶頸的所在,可以通過一些引數進行調優。應用日誌的效率與很多因素有關,甚至與schema設計都有關。

 

半同步複製

半同步複製在返回ack之前,多了一個檢查。這個檢查階段發生在資料拷貝階段,即源庫二進位制日誌資料被拷貝到從庫的relay日誌階段。

這種機制的引入,服務可能會有顯著延遲,沒有提供100%的資料一致性保證。負載較高的時候,可能會降低服務的可用性,因為源庫在等待從庫的訊息反饋。

預設的半同步複製rpl_semi_sync_source_wait_point設定是after_sync:源庫發生failure的時候,源庫上所有提交的事務已經被複制到從庫的relay log。源庫發生異常退出或failover時,是無損的,因為從庫已經有的同步的資料。

 

簡單總結一下:

·標準的複製,分成兩步:(1)從源端拷貝資料;(2)從庫端應用資料

·標準複製不能保證主從資料的一致性

·半同步複製,源庫將資料寫入二進位制日誌,並等待T秒,接收N個從庫的ack資訊

 

建立半同步複製,請參考:https://dev.mysql.com/doc/refman/8.0/en/replication-semisync-installation.html

簡單可以歸納為:

·安裝外掛

·源庫端開啟rpl_semi_sync_source_enabled=1

·從庫端開啟rpl_semi_sync_replica_enabled=1;如果複製已經在執行,stop/start replicat ion_thread

 

接下里我們談談上面提到的T秒和N個從庫中的T和N。

T是超時設定,預設是10秒。引數rpl_semi_sync_source_timeout控制了源庫的等待時間。超時後就會變成非同步複製。根據(

https://dev.mysql.com/worklog/task/?id=1720 )從庫追上後又會變成半同步複製。但是根據(https://github.com/mysql/mysql-server/blob/beb865a960b9a8a16cf999c323e46c5b0c67f21f/plugin/semisync/semisync_source.cc#L844),並不能百分百切換回來。

測試發現,並不會切換回去!!!

 

N表示必須提供ACK的從庫的數量。

如果你有10個從庫,而半同步複製中,你可能只需要2個,並不需要所有的都必須返回ACK。

半同步複製中,源庫的rpl_semi_sync_source_enabled必須開啟。在半同步複製因為超時切換到非同步複製的時候,檢查該設定:

select @@rpl_semi_sync_source_enabled;
+--------------------------------+
| @@rpl_semi_sync_source_enabled |
+--------------------------------+
|                             1 |
+--------------------------------+

還是顯示值為1。

 

在文件中,檢查半同步複製狀態的時候,我們應該檢查Rpl_semi_sync_source_status。即表示,可能發生Rpl_semi_sync_source_status = 0而rpl_semi_sync_source_enabled =1。

那這是一個bug麼?根據文件:

當源由於提交阻塞超時或從庫追趕而在非同步或半同步複製之間切換時,它會適當地設定Rpl_semi_sync_source_status 或 Rpl_semi_sync_master_status 狀態變數的值。在源上從半同步複製自動回退到非同步複製意味著 rpl_semi_sync_source_enabled 或 rpl_semi_sync_master_enabled 系統變數可能在源端具有值 1,即使此時半同步複製實際上無法執行。你可以監控 Rpl_semi_sync_source_status 或 Rpl_semi_sync_master_status 狀態變數以確定源當前是使用非同步複製還是半同步複製。

這不是一個bug。

 

總結一下:

·開啟半同步需要設定全域性變數

·源庫可以在不更改該變數的情況下(靜默)取消半同步複製

·永遠不會自動恢復半同步

·檢查半同步是否有效的方法是使用Status變數,當 Rpl_semi_sync_source_status=0和rpl_semi_sync_source_enabled=1時,你有一個超時並且源現在正在非同步複製中工作

·重新啟用半同步的方法是先將rpl_semi_sync_source_enabled 設定為 OFF,然後 rpl_semi_sync_source_enabled = ON

·從庫可以設定半同步開/關,但除非你不停止/啟動 Replica_IO_THREAD,否則變數的狀態可能與伺服器的狀態不一致。

 

 

 

 

 

https://www.percona.com/blog/face-to-face-with-semi-synchronous-replication/