天天看點

mysql主從複制出現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配置設定的内容但是還沒結束,coordinator需要等待之前配置設定的内容應用完成才可以繼續配置設定(coordinator還沒有将其放入slave worker的queue),下面嘗試測試和複現Waiting for Slave Worker to release partition。

當不開啟并行複制時(

slave_parallel_workers

 為0),show processlist是這樣的:

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

當開啟并行複制時(slave_parallel_workers為2),show

processlist是這樣的:

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

差別是增加了兩個slave worker程序,原來的sql thread變成了

coordinator。

第二節測試和複現

2.1 建立測試資料

1,建立兩個測試的database:slavetest,slavetest1

2,在這兩個db中分布建立一張表test,向裡面寫入200w左右的測試資料

通過測試一些場景,通過其結果來反應一些問題,以下測試多是基于自建mysql進行

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

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

通過上面測試slavetest對應的slave worker的程序id為5812476

使用同樣的方法,得出如下對應:

slavetest     5812476

slavetest1        5812475

這樣單線程執行的時候,兩個db在執行update更新時,coordinator都配置設定給了5812476的slave worker

2.3 測試2

确認slave worker與db的在并行執行時對應關系,同僚打開2個session,每個session分别執行更新,中間間隔10s

update slavetest.test set trade='slavetest11';

trade='slavetest22';

檢視slave的slave worker狀态,找到slavetest對應的slave worker(可以寫一個腳本來循環執行show processlist監控)

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

通過執行資訊看,slavetest1的事務先完成,slavetest2的事務後完成,看下slave的程序資訊:

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

過濾後如下:

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

通過上面測試并不能在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;

trade='slavetest2';

commit;

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

模拟一個事務内跨庫執行更新,檢視slave的程序資訊:

mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 
mysql主從複制出現Waiting for Slave Worker to release partition 實為吾之愚見,望諸君酌之!聞過則喜,與君共勉 

通過過濾的結果看,執行event的程序隻有一個5812476,coordinator并沒有配置設定給5812475的slave worker來執行,且也出現了Waiting for Slave Worker to release partition

通過測試和複現問題,Waiting for Slave Worker to release partition一般來說是一個正常的中間狀态,但是也有可能出現問題,有一些特殊情況可以參考:

https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fbugs.mysql.com%2Fbug.php%3Fid%3D73066 https://bugs.mysql.com/bug.php?id=73066 https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fbugs.mysql.com%2Fbug.php%3Fid%3D72794 https://bugs.mysql.com/bug.php?id=72794

另外包括Waiting for Slave Worker queue,System lock等狀态大部分也是正常的中間狀态