【MySQL(二十二)】一主一從換主

絕世好阿狸發表於2020-11-04

一主一從架構切主的兩種方案

可靠性優先:
先等seconds_behind_master小於一個閾值;
設定Master為只讀;
等待Slave完全同步了Master的資料;
設定Slave可寫;
切寫的流量到Slave;

這中間,當設定Master為只讀時,整個系統不可寫,所以又不可用的時間。這也是為什麼一開始就最好等seconds_behind_master很小時在做這個事情,不然主從延遲很大,不可用的視窗期就很久。

可用性優先:
不等Slave完全同步,直接設定Slave可寫,並且切流量。
這個方案系統幾乎沒有不可用的視窗期,但是因為Slave同時接收了業務寫請求以及之前Master未同步過來的資料,就會造成資料不一致。
簡單的理解就是執行順序可能有問題。比如a操作先在Master上執行,然後b操作發生在切主以後,也就是在Slave上執行,並且由於主從延遲,之前的a操作還沒有同步到Slave,那麼就會出現對於Slave而言,b先執行,a後執行,但是對於Master而言,a先執行,b後執行的不一致問題。
比如a和b都是插入有自增主鍵的表的操作,那麼如果是row模式,可能發生主鍵衝突,如果是statement模式,可能發生資料不一致;其實衝突還是比較好的,起碼可以暴露問題。如果資料不一致,後面修復資料可能相當難。
這兩種方案用哪個,取決於具體的場景,對一致性有要求的,必須可靠性優先;如果沒有要求,比如離線日誌類的,可用性優先也無妨。

 

其實從這裡我們也可以理解到,雙活架構的難點,如果同時有多個Master節點,在接受寫請求和binlog時,類似上面的情況,就可能會發生資料不一致問題。

相關文章