FAQ系列|如何保證主從複製資料一致性
導讀
MySQL主從複製環境中,如何才能保證主從資料的一致性呢?
關於主從複製
現在常用的MySQL高可用方案,十有八九是基於 MySQL的主從複製(replication)來設計的,包括常規的一主一從、雙主模式,或者半同步複製(semi-sync replication)。
我們常常把MySQL replication說成是MySQL同步(sync),但事實上這個過程是非同步(async)的。大概過程是這樣的:
-
在master上提交事務後,並且寫入binlog,返回事務成功標記;
-
將binlog傳送到slave,轉儲成relay log;
-
在slave上再將relay log讀取出來應用。
步驟1和步驟3之間是非同步進行的,無需等待確認各自的狀態,所以說MySQL replication是非同步的。
MySQL semi-sync replication在之前的基礎上做了加強完善,整個流程變成了下面這樣:
-
首先,master和至少一個slave都要啟用semi-sync replication模式;
-
某個slave連線到master時,會主動告知當前自己是否處於semi-sync模式;
-
在master上提交事務後,寫入binlog後,還需要通知至少一個slave收到該事務,等待寫入relay log併成功重新整理到磁碟後,向master傳送“slave節點已完成該事務”確認通知;
-
master收到上述通知後,才可以真正完成該事務提交,返回事務成功標記;
-
在上述步驟中,當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
相關文章
- load data語句如何保證主備複製資料一致性(一)
- redis系列:主從複製Redis
- 資料庫主從複製資料庫
- 非同步流複製模式如何保證不丟資料?非同步模式
- mysql資料庫的主從複製和主主複製實踐MySql資料庫
- MySQL-主從複製之同步主從資料MySql
- redis系列--主從複製以及redis複製演進Redis
- MySQL主從複製與主主複製MySql
- Redis系列(四):Redis的複製機制(主從複製)Redis
- MySQL主從複製、半同步複製和主主複製MySql
- MySQL-主從複製之搭建主資料庫MySql資料庫
- Mysql(Mariadb)資料庫主從複製MySql資料庫
- mysql資料庫實現主從複製MySql資料庫
- mysql5.7主從複製,主主複製MySql
- MySQL-主從複製之搭建從資料庫MySql資料庫
- 冗餘資料一致性,到底如何保證?
- 如何保證MySQL和Redis資料一致性?MySqlRedis
- MySQL主從複製、半同步複製和主主複製概述MySql
- 主從複製
- MySQL的主從複製、半同步複製、主主複製詳解MySql
- 配置mysql5.5主從複製、半同步複製、主主複製MySql
- mysql複製--主從複製配置MySql
- 解讀MySQL雙主複製的主備資料一致性GPMySql
- 如何保證mongodb和資料庫雙寫資料一致性?MongoDB資料庫
- 【面試普通人VS高手系列】Redis和Mysql如何保證資料一致性面試RedisMySql
- MySQL的主從複製與MySQL的主主複製MySql
- mysql資料庫資料同步/主從複製的配置方法MySql資料庫
- MySQL複製FAQMySql
- Redis - 主從複製Redis
- Redis:主從複製Redis
- MongoDB主從複製MongoDB
- MySQL 主從複製MySql
- 【MySql】主從複製MySql
- Redis主從複製Redis
- MySQL主從複製MySql
- MySQL主從複製_複製過濾MySql
- Redis基礎篇(六)資料同步:主從複製Redis
- mysql的主從複製資料延遲問題MySql