MySQL 資料庫主從複製架構

2022-03-18 11:43:17 字數 2132 閱讀 8890

前文《mysql 資料庫事務與複製》分析了 mysql 複製過程中如何保證 binlog 和事務資料之間的一致性,本文進一步分析引入從庫後需要保證主從的資料一致性需要考慮哪些方面。

mysql 的原生複製架構原理如上圖所示。從庫的 i/o thread 執行緒負責不斷讀取主庫的 binlog 日誌檔案並寫入本地的 relay log 臨時快取。從庫的 sql thread 執行緒則不斷讀取 relay log 重放事件入庫。整個過程看起來是比較簡單清晰的,但其中有幾個點對主從資料一致性有關鍵影響,我們下面逐一分析。

主從複製的場景下,產生資料不一致的現象有兩種:

資料丟失

資料重複

從庫的 i/o thread 是通過網路讀取主庫的 binlog 的,若出現網路故障,有可能產生資料丟失。為避免網路故障導致的資料丟失,網路恢復後從庫重新連線上來需要知道從主庫 binlog 的哪個位置重新傳輸資料。從庫需要記住中斷發生時 binlog 的位置,並從該斷點處重新讀取,這個斷點我們稱為從庫的重傳檢查點。乙個可靠的重傳檢查點必須是在從庫讀到資料並寫入到本地 relay log 持久化之後才可建立,否則都有丟失資料的可能。

由於主從複製過程的分布式特徵,需要保證複製過程的冪等性,也就是重複複製同一條資料最終不會產生重複的資料。防重策略是必須的,一般符合正規化特徵的資料庫表設計通過主鍵來防重,而無主鍵表資料可以通過所有字段聯合唯一索引來防重。有了防重策略就可以任意回溯複製過程,而不必考慮從庫產生重複資料。

為了保證主從資料一致性,複製過程不僅要保證不丟失、不重複,還需要保證操作順序一致。binlog 的事件日誌反應了主庫併發事務的操作序列,最終這種序列也要原樣反應到從庫上。所以原生複製架構為了做到這點,採用了單執行緒模型的序列化操作。這也是沒辦法的,因為在資料庫層面是無法知道不同資料之間的因果和依賴關係,因此無法並行入庫。

原生的複製架構做到了無丟失、無重複和順序一致性,普通場景下基本可用,但也存在一些不足:

一些特殊場景下的資料庫複製分布,使用原生複製架構則不一定合適,可能的場景有:

所以我們才需要考慮針對特殊場景自定義複製架構,下面我們看乙個自定義複製架構的概念原理圖。

pull worker,作用類似於原生的 i/o thread。

buffer + persistent storage,作用類似於原生的 relay log。

load worker,作用類似於原生的 sql thread。

由於是自定義程式實現則可以在無改造 mysql 的前提下提供額外的功能,相對應用和 mysql 都可以做到透明。相對原生複製架構的不足,自定義複製架構可以提供更好的複製過程監控和管理能力,並支援異構資料轉換等等。而對於需要跨地域、跨機房且延時敏感的大型庫複製,則可以通過適當的策略來加速複製過程。

比如前面提到的大型電商的訂單、交易類資料庫,一般都是分庫分表的。分庫分表後,不同庫表之間的資料其實在業務上是完全獨立的,是可以支援並行寫入的。所以我們看上圖為什麼畫了兩個 load worker,就是表達可以針對業務獨立的表進行並行寫入。一條資料的複製延時包括:

總時長 t = p + n + l; 其中 p 是 pull worker 處理時長,n 是網路傳輸時長, l 是 load worker 處理時長。

同乙個庫的 binlog 是順序的不好並行拉取,傳輸過程的網路時長也是剛性的,唯一能加速的就是入庫處理。按業務獨立的不同表可以做到並行的多執行緒入庫操作,以縮短 l 的整體時長,如下圖所示。

[1] mysql internals manual. replication.

[2] mysql internals manual. the binary log.

[3] in355hz. 資料庫 acid 的實現.

[4] jb51. mysql 對 binlog 的處理說明.

[5] repls. ** innodb_support_xa 與 innodb_flush_log_at_trx_commit.

[6] 68idc. mysql 5.6 之 dba 與開發者指南.

[7] csdn. 高效能 mysql 主從架構的複製原理及配置詳解

mysql資料庫主從複製

mysqld the tcp ip port the mysql server will listen on port 3307 path to installation directory.all paths are usually resolved relative to this.basedi...

資料庫(十) MySQL主從複製

複製的基本原理 複製的基本原則 複製的最大問題 說一說三個正規化 百萬級別或以上的資料如何刪除 關於索引 由於索引需要額外的維護成本,因為索引檔案是單獨存在的檔案,所以當我們對資料的增加,修改,刪除,都會產生額外的對索引檔案的操作,這些操作需要消耗額外的io,會降低增 改 刪的執行效率。所以,在我們...

mysql主從複製

罪過啊,博主最近好久沒有更新部落格了,轉有道雲筆記了,筆記裡還有些乾貨,最近慢慢分享出來吧。博主最近發現有好多想學,但是發現精力有限啊,博主本來是搞個開發的,但是偏偏想把運維,dba的技術全都學了 mysql集群,nginx等等等 但是發現精力有限,所以簡單了解一下,mysql的主從複製,後面還有m...