MySQL同步原理

image.png

主從復(fù)制是怎么實(shí)現(xiàn)的呢?更新語(yǔ)句會(huì)記錄 binlog,它是一種邏輯日志。
有了這個(gè) binlog,從服務(wù)器會(huì)獲取主服務(wù)器的 binlog 文件,然后解析里面的 SQL 語(yǔ)句,在從服務(wù)器上面執(zhí)行一遍,保持主從的數(shù)據(jù)一致。

這里面涉及到三個(gè)線程,連接到 master 獲取 binlog,并且解析 binlog 寫入中繼日 志,這個(gè)線程叫做 I/O 線程。
Master 節(jié)點(diǎn)上有一個(gè) log dump 線程,是用來(lái)發(fā)送 binlog 給 slave 的。
從庫(kù)的 SQL 線程,是用來(lái)讀取 relay log,把數(shù)據(jù)寫入到數(shù)據(jù)庫(kù)的。

做了主從復(fù)制的方案之后,我們只把數(shù)據(jù)寫入 master 節(jié)點(diǎn),而讀的請(qǐng)求可以分擔(dān)到 slave 節(jié)點(diǎn)。我們把這種方案叫做讀寫分離。


image.png

讀寫分離可以一定程度低減輕數(shù)據(jù)庫(kù)服務(wù)器的訪問壓力,但是需要特別注意主從數(shù) 據(jù)一致性的問題。如果我們?cè)?master 寫入了,馬上到 slave 查詢,而這個(gè)時(shí)候 slave 的 數(shù)據(jù)還沒有同步過來(lái),怎么辦? 所以,基于主從復(fù)制的原理,我們需要弄明白,主從復(fù)制到底慢在哪里?

單線程

在早期的 MySQL 中,slave 的 SQL 線程是單線程。master 可以支持 SQL 語(yǔ)句的并 行執(zhí)行,配置了多少的最大連接數(shù)就是最多同時(shí)多少個(gè) SQL 并行執(zhí)行。
而 slave 的 SQL 卻只能單線程排隊(duì)執(zhí)行,在主庫(kù)并發(fā)量很大的情況下,同步數(shù)據(jù)肯 定會(huì)出現(xiàn)延遲
為什么從庫(kù)上的 SQL Thread 不能并行執(zhí)行呢?舉個(gè)例子,主庫(kù)執(zhí)行了多條 SQL 語(yǔ) 句,首先用戶發(fā)表了一條評(píng)論,然后修改了內(nèi)容,最后把這條評(píng)論刪除了。這三條語(yǔ)句 在從庫(kù)上的執(zhí)行順序肯定是不能顛倒的

insert into user_comments (10000009,'nice'); 
update user_comments set content ='very good' where id =10000009;
 delete from user_comments where id =10000009;

怎么解決這個(gè)問題呢?怎么減少主從復(fù)制的延遲?

異步與全同步

首先我們需要知道,在主從復(fù)制的過程中,MySQL 默認(rèn)是異步復(fù)制的。也就是說, 對(duì)于主節(jié)點(diǎn)來(lái)說,寫入 binlog,事務(wù)結(jié)束,就返回給客戶端了。對(duì)于 slave 來(lái)說,接收 到 binlog,就完事兒了,master 不關(guān)心 slave 的數(shù)據(jù)有沒有寫入成功。

image.png

如果要減少延遲,是不是可以等待全部從庫(kù)的事務(wù)執(zhí)行完畢,才返回給客戶端呢? 這樣的方式叫做全同步復(fù)制。從庫(kù)寫完數(shù)據(jù),主庫(kù)才返會(huì)給客戶端。

這種方式雖然可以保證在讀之前,數(shù)據(jù)已經(jīng)同步成功了,但是帶來(lái)的副作用大家應(yīng) 該能想到,事務(wù)執(zhí)行的時(shí)間會(huì)變長(zhǎng),它會(huì)導(dǎo)致 master 節(jié)點(diǎn)性能下降。
有沒有更好的辦法呢?既減少 slave 寫入的延遲,又不會(huì)明顯增加 master 返回給客 戶端的時(shí)間?

半同步復(fù)制

介于異步復(fù)制和全同步復(fù)制之間,還有一種半同步復(fù)制的方式。
主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端,而是等待至少一個(gè)從庫(kù) 接收到 binlog 并寫到 relay log 中才返回給客戶端。master 不會(huì)等待很長(zhǎng)的時(shí)間,但是 返回給客戶端的時(shí)候,數(shù)據(jù)就即將寫入成功了,因?yàn)樗皇W詈笠徊搅耍壕褪亲x取 relay log,寫入從庫(kù)。


image.png

如果我們要在數(shù)據(jù)庫(kù)里面用半同步復(fù)制,必須安裝一個(gè)插件,這個(gè)是谷歌的一位工 程師貢獻(xiàn)的。這個(gè)插件在 mysql 的插件目錄下已經(jīng)有提供:
cd /usr/lib64/mysql/plugin/
主庫(kù)和從庫(kù)是不同的插件,安裝之后需要啟用:

-- 主庫(kù)執(zhí)行 
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
set global rpl_semi_sync_master_enabled=1; 
show variables like '%semi_sync%'; 


-- 從庫(kù)執(zhí)行 
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 
set global rpl_semi_sync_slave_enabled=1; 
show global variables like '%semi%';

相對(duì)于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性,同時(shí)它也造成了一定程度的延 遲,它需要等待一個(gè) slave 寫入中繼日志,這里多了一個(gè)網(wǎng)絡(luò)交互的過程,所以,半同步 復(fù)制最好在低延時(shí)的網(wǎng)絡(luò)中使用。

這個(gè)是從主庫(kù)和從庫(kù)連接的角度,來(lái)保證 slave 數(shù)據(jù)的寫入。

另一個(gè)思路,如果要減少主從同步的延遲,減少 SQL 執(zhí)行造成的等待的時(shí)間,那有 沒有辦法在從庫(kù)上,讓多個(gè) SQL 語(yǔ)句可以并行執(zhí)行,而不是排隊(duì)執(zhí)行呢?

多庫(kù)并行復(fù)制

怎么實(shí)現(xiàn)并行復(fù)制呢?設(shè)想一下,如果 3 條語(yǔ)句是在三個(gè)數(shù)據(jù)庫(kù)執(zhí)行,操作各自的 數(shù)據(jù)庫(kù),是不是肯定不會(huì)產(chǎn)生并發(fā)的問題呢?執(zhí)行的順序也沒有要求。當(dāng)然是,所以如 果是操作三個(gè)數(shù)據(jù)庫(kù),這三個(gè)數(shù)據(jù)庫(kù)的從庫(kù)的 SQL 線程可以并發(fā)執(zhí)行。這是 MySQL 5.6 版本里面支持的多庫(kù)并行復(fù)制。

image.png

但是在大部分的情況下,我們都是單庫(kù)多表的情況,在一個(gè)數(shù)據(jù)庫(kù)里面怎么實(shí)現(xiàn)并 行復(fù)制呢?或者說,我們知道,數(shù)據(jù)庫(kù)本身就是支持多個(gè)事務(wù)同時(shí)操作的;為什么這些 事務(wù)在主庫(kù)上面可以并行執(zhí)行,卻不會(huì)出現(xiàn)問題呢?

因?yàn)樗麄儽旧砭褪腔ハ嗖桓蓴_的,比如這些事務(wù)是操作不同的表,或者操作不同的 行,不存在資源的競(jìng)爭(zhēng)和數(shù)據(jù)的干擾。那在主庫(kù)上并行執(zhí)行的事務(wù),在從庫(kù)上肯定也是 可以并行執(zhí)行,是不是?比如在 master 上有三個(gè)事務(wù)同時(shí)分別操作三張表,這三個(gè)事務(wù) 是不是在 slave 上面也可以并行執(zhí)行呢?

5 異步復(fù)制之 GTID 復(fù)制

https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html
所以,我們可以把那些在主庫(kù)上并行執(zhí)行的事務(wù),分為一個(gè)組,并且給他們編號(hào), 這一個(gè)組的事務(wù)在從庫(kù)上面也可以并行執(zhí)行。這個(gè)編號(hào),我們把它叫做 GTID(Global Transaction Identifiers),這種主從復(fù)制的方式,我們把它叫做基于 GTID 的復(fù)制。

image.png

如果我們要使用 GTID 復(fù)制,我們可以通過修改配置參數(shù)打開它,默認(rèn)是關(guān)閉的:

show global variables like 'gtid_mode';

無(wú)論是優(yōu)化 master 和 slave 的連接方式,還是讓從庫(kù)可以并行執(zhí)行 SQL,都是從數(shù) 據(jù)庫(kù)的層面去解決主從復(fù)制延遲的問題。

——學(xué)自咕泡學(xué)院

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,165評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,435評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,943評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,175評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,713評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,599評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,788評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,034評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,408評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,747評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • Mysql主從基本原理,主要形式以及主從同步延遲原理 (讀寫分離)導(dǎo)致主庫(kù)從庫(kù)數(shù)據(jù)不一致問題的及解決方案 一、主從...
    薛延祥閱讀 1,105評(píng)論 0 6
  • 一、復(fù)制架構(gòu)衍生史 在談這個(gè)特性之前,我們先來(lái)看看MySQL的復(fù)制架構(gòu)衍生史。 在2000年,MySQL 3.23...
    張偉科閱讀 11,331評(píng)論 0 9
  • 復(fù)制概念 Mysql內(nèi)建的復(fù)制功能是構(gòu)建大型,高性能應(yīng)用程序的基礎(chǔ)。 將Mysql的數(shù)據(jù)分布到多個(gè)系統(tǒng)上去,這種分...
    jiangmo閱讀 653評(píng)論 0 0
  • 獨(dú)不見沈佺期 盧家少婦郁金堂,海燕雙棲玳瑁梁。九月寒砧催下葉,十年征戍憶遼陽(yáng)。白狼河北音書斷,丹鳳城南秋夜長(zhǎng)。誰(shuí)知...
    程三板2閱讀 393評(píng)論 0 10
  • 電話響起,又是某某房產(chǎn),這廣告號(hào)碼已經(jīng)屏蔽過很多次,怎么又來(lái)? 曦破天荒接通了電話,不吭聲,空氣中都是沉默。 電話...
    默心芷語(yǔ)閱讀 314評(píng)論 8 7