MySQL的雙主複製介紹

  • 2019 年 11 月 6 日
  • 筆記

MySQL的雙主複製

今天搭建了一套雙主複製的架構,這種架構包含兩台服務器,每一台都被配置成對方的主庫和備庫,是一種特殊的主從,架構圖如下:

這種架構的應用場景是解決兩個處於不同地理位置的服務器都要寫入數據的時候。

這種架構,最容易出現的問題是數據衝突,例如:

1、我們在操作兩台服務器修改同一條記錄,將會產生衝突;

2、在同一個有自增列的表裏面插入數據;

為了解決第二個問題,mysql裏面配置了兩個參數來避免該問題的發生,分別是auto_increment_increment和auto_increment_offset,其中第一個參數是自增長的增長步長,而第二個是自增長的起始值,如果我們有A、B兩個服務器,那麼一般情況下,A、B兩個服務器上這兩個參數的設置如下:

A:

auto_increment_increment=2;

auto_increment_offset=1;

B:

auto_increment_increment=2;

auto_increment_offset=2;

也就是說,A服務器從1開始,每次按照步長為2進行自增,保證它的id值全部都是奇數,B服務器從2開始,每次按照步長為2進行自增,保證它的id值全部都是偶數,這樣,可以在一定程度上解決自增id值帶來的數據衝突問題。

然而,即使這樣設置,還是可能出現問題,看看這個例子,假設col的值為1,同時執行這兩個SQL:

第一台:update tbl1 set col=col+1;

第二台:update tbl2 set col=col*2;

結果呢,第一台服務器先加再乘,結果值為4,另一台服務器先乘再加,結果值為3。

除了數據不同步之外,還可能出現問題,假如正常的複製發生了錯誤停止了,但是應用仍然在像兩台服務器上寫數據,那麼兩台服務器上的數據都成了臟數據,解決這個數據恢復的問題將會非常麻煩。

綜上所述,這種架構,目前來看,是已經被淘汰掉了,可以選用主動—被動模式下的雙主複製來進行替代,具體有時間再分析吧。

時間原因,今天就先到這裡吧。