FAQ系列|如何保證主從複製資料一致性

晚來風急發表於2017-08-02

導讀

MySQL主從複製環境中,如何才能保證主從資料的一致性呢?

關於主從複製

現在常用的MySQL高可用方案,十有八九是基於 MySQL的主從複製(replication)來設計的,包括常規的一主一從、雙主模式,或者半同步複製(semi-sync replication)。

我們常常把MySQL replication說成是MySQL同步(sync),但事實上這個過程是非同步(async)的。大概過程是這樣的:

  1. 在master上提交事務後,並且寫入binlog,返回事務成功標記;

  2. 將binlog傳送到slave,轉儲成relay log;

  3. 在slave上再將relay log讀取出來應用。

步驟1和步驟3之間是非同步進行的,無需等待確認各自的狀態,所以說MySQL replication是非同步的。

MySQL semi-sync replication在之前的基礎上做了加強完善,整個流程變成了下面這樣:

  1. 首先,master和至少一個slave都要啟用semi-sync replication模式;

  2. 某個slave連線到master時,會主動告知當前自己是否處於semi-sync模式;

  3. 在master上提交事務後,寫入binlog後,還需要通知至少一個slave收到該事務,等待寫入relay log併成功重新整理到磁碟後,向master傳送“slave節點已完成該事務”確認通知;

  4. master收到上述通知後,才可以真正完成該事務提交,返回事務成功標記;

  5. 在上述步驟中,當slave向master傳送通知時間超過rpl_semi_sync_master_timeout設定值時,主從關係會從semi-sync模式自動調整成為傳統的非同步複製模式。

半同步複製看起來很美好有木有呢,但如果網路質量不高,是不是出現抖動,觸發上述第5條的情況,會從半同步複製降級為普通複製;此外,採用半同步複製,會導致master上的tps效能下降非常嚴重,最嚴重的情況下可能會損失50%以上。

這樣來看,除非需要非常嚴格保證資料一致性等迫不得已的場景,就不太建議使用半同步複製了。當然了,事實上我們也可以通過加強程式端的邏輯控制,來避免主從資料不一致時發生邏輯錯誤,比如說如果在從上讀取到的資料和主不一致的話,那麼就觸發主從間的一次資料修復工作。或者,我們也可以用 pt-table-checksum & pt-table-sync 兩個工具來校驗並修復資料,只要執行頻率適當,是可行的。

真想要提高多節點間的資料一致性,可以考慮採用PXC方案。現在已知用PXC規模較大的有qunar、sohu,如果團隊裡初期沒有人能比較專注PXC的話,還是要謹慎些,畢竟和傳統的主從複製差異很大,出現問題時需要花費更多精力去排查解決。

如何保證主從複製資料一致性

上面說完了非同步複製、半同步複製、PXC,我們回到主題:在常規的主從複製場景裡,如何能保證主從資料的一致性,不要出現資料丟失等問題呢?

在MySQL中,一次事務提交後,需要寫undo、寫redo、寫binlog,寫資料檔案等等。在這個過程中,可能在某個步驟發生crash,就有可能導致主從資料的不一致。為了避免這種情況,我們需要調整主從上面相關選項配置,確保即便發生crash了,也不能發生主從複製的資料丟失。

1. 在master上修改配置

innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

上述兩個選項的作用是:保證每次事務提交後,都能實時重新整理到磁碟中,尤其是確保每次事務對應的binlog都能及時重新整理到磁碟中,只要有了binlog,InnoDB就有辦法做資料恢復,不至於導致主從複製的資料丟失。

2. 在slave上修改配置

master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1

上述前兩個選項的作用是:確保在slave上和複製相關的後設資料表也採用InnoDB引擎,受到InnoDB事務安全的保護,而後一個選項的作用是開啟relay log自動修復機制,發生crash時,會自動判斷哪些relay log需要重新從master上抓取回來再次應用,以此避免部分資料丟失的可能性。

通過上面幾個選項的調整,就可以確保主從複製資料不會發生丟失了。但是,這並不能保證主從資料的絕對一致性,因為,有可能設定了ignoredo
ewrite等replication規則
,或者某些SQL本身存在不確定因素,或者人為在slave上修改資料,最終導致主從資料不一致。這種情況下,可以採用pt-table-checksum  pt-table-sync 工具來進行資料的校驗和修復。

文章轉自老葉茶館公眾號,原文連結:https://mp.weixin.qq.com/s/0LkpKDbosYZ3gWPp4AZFqg


相關文章