mysql並行複製降低主從同步延時的思路與啟示

2021-08-15 13:53:54 字數 2803 閱讀 9098

mysql主從複製,讀寫分離

是網際網路用的非常多的mysql架構,主從複製最令人詬病的地方就是,在資料量較大併發量較大的場景下,主從延時會比較嚴重。

為什麼mysql主從延時這麼大?

回答:從庫使用

【單執行緒】重放

relaylog

。優化思路是什麼?

回答:使用單執行緒重放relaylog使得同步時間會比較久,導致主從延時很長,優化思路不難想到,可以

【多執行緒並行】重放relaylog

來縮短同步時間。

mysql如何「多執行緒並行」來重放relaylog,是本文要分享的主要內容。

通過多個執行緒來並行重放

relaylog

是乙個很好縮短同步時間的思路,但實施之前要解決這樣乙個問題:

如何來分割relaylog,才能夠讓多個work-thread並行運算元據data時,使得data保證一致性?

首先,【隨機的分配relaylog肯定是不行的】

,假設relaylog中有這樣三條序列的修改記錄:

update account set money=100 where uid=58;

update account set money=150where uid=58;

update account set money=200where uid=58;

序列執行

:肯定能保證與主庫的執行序列一致,最後得到money=200

隨機分配並行執行

:3個工作執行緒併發執行這3個語句,誰最後執行成功是不確定的,故得到的資料可能與主庫不同

好,對於這個問題,可以用什麼樣的思路來解決呢(大夥怎麼想,mysql團隊其實也就是這麼想的)

【方法一:相同庫上的寫操作,用

相同的work-thread

來重放relaylog;不同庫上的寫操作,可以用多個work-thread併發來重放relaylog】

如何做到呢?

回答:不難,

hash(db-name) % thread-num

,庫名hash之後再模上線程數,就能夠做到。

存在的不足?

很多公司對mysql的使用是「單庫多表」,如果是這樣的話,仍然是同乙個work-thread在序列執行,

還是不能提高relaylog的重放速度。

優化方案

:將「單庫多表」的模式公升級為「多庫多表」的模式。

其實,資料量大併發量大的網際網路業務場景,「多庫」模式還具備著其他很多優勢,例如:

(1)非常方便的例項擴充套件:dba很容易將不同的庫擴充套件到不同的例項上

(2)按照業務進行庫隔離:業務解耦,進行業務隔離,減少耦合與相互影響

(3)…

對於架構師進行架構設計的啟示是:

使用多庫的方式設計db架構,能夠降低主從同步的延時。

新的想法:「單庫多表」的場景,還有並行執行優化餘地麼?

仔細回顧和思考,即使只有乙個庫,資料的修改和事務的執行在主庫上也是並行操作的,既然在主庫上可以並行操作,在從庫上為啥就不能並行操作,而要按照庫來序列執行呢(表示不服)?

新的思路:

將主庫上同時並行執行的事務,分為一組

,編乙個號,這些事務在從庫上的回放可以並行執行(事務在主庫上的執行都進入到prepare階段,說明事務之間沒有衝突,否則就不可能提交),沒錯,mysql正是這麼做的。

【方法二:基於gtid的並行複製】

新版的mysql,將組提交的資訊存放在gtid中,使用mysqlbinlog工具,可以看到組提交內部的資訊:

和原來的日誌相比,多了

last_committed

和sequence_number

。last_committed表示事務提交時,上次事務提交的編號,

如果具備相同的last_committed,說明它們在乙個組內,可以併發回放執行

。從mysql並行複製縮短主從同步時延的思想可以看到,架構的思路是相同的:

(1)多執行緒

是一種常見的縮短執行時間的方法

(2)多執行緒併發分派任務時必須保證冪等性

:mysql的演進思路,提供了「按照庫冪等」,「按照commit_id冪等」兩種方式,思路大夥可以借鑑

另,mysql在並行複製上的逐步優化演進:

mysql5.5 -> 不支援並行複製,對大夥的啟示:

公升級mysql吧

mysql5.6 -> 按照庫並行複製,對大夥的啟示:使用「多庫」架構吧

mysql5.7 -> 按照gtid並行複製

HDFS並行複製Distcp

1 distcp 分布式拷貝 是用於大規模集群內部和集群之間拷貝的工具。2 distcp命令是以mr作業 沒有r任務 的形式實現的,把檔案和目錄的列表作為m任務的輸入。每乙個檔案是由乙個m任務來拷貝的,distcp盡量把大小之和相同的各個檔案匯入到同乙個m任務中。這樣可以每個m任務拷貝的資料量大致相...

mysql5 6並行複製體系結構

說明 如果在mysql5.6開啟並行複製功能,sql執行緒就變成了coordinator執行緒,那麼coordinator執行緒主要負責兩部分內容 1.若判斷可以並行執行,那麼選擇worker執行緒執行事務的二進位制日誌 2.若判斷不可以並行執行,如該操作是ddl,亦或者是事務跨schema操作,則...

hadoop 通過distcp進行並行複製

通過distcp進行並行複製 前面的hdfs訪問模型都集中於單執行緒的訪問。例如通過指定檔案通配,我們可以對一部分檔案進行處理,但是為了高效,對這些檔案的並行處理需要新寫乙個程式。hadoop有乙個叫distcp 分布式複製 的有用程式,能從hadoop的檔案系統並行複製大量資料。distcp一般用...