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一般用...