454
技術社區[雲棲]
Waiting for Slave Worker to release partition
實為吾之愚見,望諸君酌之!聞過則喜,與君共勉
第一節 並行複製
Mysql5.6的mts(並行複製)是基於database來分發事務的,coordinator(原來的sql thread)按照slave worker與db的對應關係進行處理來分發事務給相應的slave worker,slave worker代替了sql thread來執行事務中的event。並且mysql默認認為數據是以database來分布的,跨庫的事務在slave應用的時候可能就需要等待了。
Waiting for Slave Worker to release partition第一次看到是在開啟MTS的mysql5.6主從複製的時候,在Slave_SQL_Running_State:出現Waiting for Slave Worker to release partition,Slave_SQL_Running_State的狀態比較多,但是這個狀態翻譯過來是指“等待slave worker 釋放 分區(partitions)”,其中的partitions解釋成中文不是很正確,partitions可以理解成”按照slave worker與db的對應關係進行分發事務後的對象”(有更好的解釋請留言),它既不是事務也不是event,也不是單純的對應關係,起碼可以確定這種情況並不是異常的情況(大部分時候),slave worker正在應用coordinator分配的內容,下麵嚐試測試和複現Waiting for Slave Worker to release partition。
當不開啟並行複製時(slave_parallel_workers
為0),show processlist是這樣的:
當開啟並行複製時(slave_parallel_workers為2),show processlist是這樣的:
區別是增加了兩個slave worker進程,原來的sql thread變成了 coordinator。
第二節 測試和複現
2.1 創建測試數據
1,創建兩個測試的database:slavetest,slavetest1
2,在這兩個db中分布創建一張表test,向裏麵寫入200w左右的測試數據
通過測試一些場景,通過其結果來反應一些問題
2.2 測試1
確認slave worker與db的在串行執行時對應關係,先打開一個session,分別執行
update slavetest.test set trade='slavetest';
update slavetest1.test set trade='slavetest1';
查看slave的slave worker狀態,找到slavetest對應的slave worker
通過上麵測試slavetest對應的slave worker的進程id為5812476
使用同樣的方法,得出如下對應:
slavetest 5812476
slavetest1 5812476
這樣單線程執行的時候,兩個db在執行update更新時,coordinator都分配給了5812476的slave worker
2.3 測試2
確認slave worker與db的在並行執行時對應關係,同事打開2個session,每個session分別執行更新,中間間隔10s
update slavetest.test set trade='slavetest11';
update slavetest1.test set trade='slavetest22';
查看slave的slave worker狀態,找到slavetest對應的slave worker(可以寫一個腳本來循環執行show processlist監控)
通過執行信息看,slavetest1的事務先完成,slavetest2的事務後完成,看下slave的進程信息:
過濾後如下:
通過上麵測試並不能在slave上執行完這兩個事務的時候,保證一個slave worker完全對應其中的一個dbname(個人以為上一個事務裏麵,slave worker與db的對應是不會變的),暫且得出的結論是當並行執行兩個db的事務的時候,其中的兩個slave worker都產生了影響。
這樣多線程執行的時候,兩個db在執行update更新時,coordinator會把事務分配給兩個slave worker同時並行執行,並且也出現了Waiting for Slave Worker to release partition,並且還出現了Waiting for Slave Worker queue,按照之前的描述,mysql假設數據是按照database來分布的,所以不會存在跨庫的情況,下麵進行事務跨庫的測試
2.4 測試3
確認slave worker與db的在一個事務裏跨庫執行時對應關係,隻打開1個session,執行:
begin;
update slavetest.test set trade='slavetest1';
update slavetest1.test set trade='slavetest2';
commit;
查看slave的slave worker狀態,找到slavetest對應的slave worker(可以寫一個腳本來循環執行show processlist監控)
模擬一個事務內跨庫執行更新,查看slave的進程信息:
通過過濾的結果看,執行event的進程隻有一個5812476,coordinator並沒有分配給5812475的slave worker來執行,且也出現了Waiting for Slave Worker to release partition
通過測試和複現問題,Waiting for Slave Worker to release partition一般來說是一個正常的中間狀態,但是也有可能出現問題,有一些特殊情況可以參考:
https://bugs.mysql.com/bug.php?id=73066
https://bugs.mysql.com/bug.php?id=72794
另外包括Waiting for Slave Worker queue,System lock等狀態大部分也是正常的中間狀態
最後更新:2017-09-02 01:33:08