MySQL并發(fā)復(fù)制系列二:多線程復(fù)制-創(chuàng)新互聯(lián)

并發(fā)復(fù)制(Parallel Replication系列二: Enhanced Multi-threaded Slaves

作者:沃趣科技MySQL數(shù)據(jù)庫工程師  麻鵬飛

公司主營業(yè)務(wù):成都網(wǎng)站制作、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出巴楚免費(fèi)做網(wǎng)站回饋大家。

首先梳理下傳統(tǒng)MySQL/MariaDB主備復(fù)制基本原理:

        主從復(fù)制通過三個線程來完成,在master節(jié)點(diǎn)運(yùn)行的binlog dump的線程,I/O線程和SQL線程運(yùn)行在slave 節(jié)點(diǎn)

  •         master節(jié)點(diǎn)的Binlog dump線程,當(dāng)slave節(jié)點(diǎn)與master正常連接的時候,master把更新的binlog 內(nèi)容推送到slave節(jié)點(diǎn)。

  •        slave節(jié)點(diǎn)的I/O 線程 ,該線程通過讀取master節(jié)點(diǎn)binlog日志名稱以及偏移量信息將其拷貝到本地relay log日志文件。

  •     slave節(jié)點(diǎn)的SQL線程,該線程讀取relay log日志信息,將在master節(jié)點(diǎn)上提交的事務(wù)在本地回放,達(dá)到與主庫數(shù)據(jù)保持一致的目的。

問題1:

        Master節(jié)點(diǎn)的數(shù)據(jù)庫實例并發(fā)跑多個線程同時提交事務(wù),提交的事務(wù)按照邏輯的時間(數(shù)據(jù)庫LSN號)順序地寫入binary log日志,,slave節(jié)點(diǎn)通過I/O線程寫到本地的relay log日志,但是slave節(jié)點(diǎn)只有SQL單線程來執(zhí)行relay log中的日志信息重放主庫提交得事務(wù),造成主備數(shù)據(jù)庫存在延遲(lag)

思考1:

        那么為了減少主備數(shù)據(jù)同步延遲時間,由于備庫只有單線程補(bǔ)償數(shù)據(jù)的原因而造成延遲,那么能否使slave節(jié)點(diǎn)同時運(yùn)行多個如SQL線程一樣的功能來重放在主庫執(zhí)行的事務(wù)?答案當(dāng)然是:可以!但是我們需要解決以下問題:

        1、slave本地的relay log記錄的是master 的binary log日志信息,日志記錄的信息按照事務(wù)的時間先后順序記錄,那么為了保證主備數(shù)據(jù)一致性,slave節(jié)點(diǎn)必須按照同樣的順序執(zhí)行,如果順序不一致容易造成主備庫數(shù)據(jù)不一致的風(fēng)險。

        如:

                在master節(jié)點(diǎn)提交T1和T2事務(wù)按照以下順序

 MySQL并發(fā)復(fù)制系列二:多線程復(fù)制

            slave節(jié)點(diǎn)執(zhí)行T1和T2相反的順序:

  MySQL并發(fā)復(fù)制系列二:多線程復(fù)制

MySQL 5.6改進(jìn):

        MySQL 5.6版本引入并發(fā)復(fù)制(schema級別),基于schema級別的并發(fā)復(fù)制核心思想:“不同schema下的表并發(fā)提交時的數(shù)據(jù)不會相互影響,即slave節(jié)點(diǎn)可以用對relay log中不同的schema各分配一個類似SQL功能的線程,來重放relay log中主庫已經(jīng)提交的事務(wù),保持?jǐn)?shù)據(jù)與主庫一致”??梢奙ySQL5.6版本的并發(fā)復(fù)制,一個schema分配一個類似SQL線程的功能。

實現(xiàn)1:

         slave節(jié)點(diǎn)開啟并發(fā)復(fù)制(slave_parallel_workers=3)如下圖,當(dāng)前的slave的SQL線程為Coordinator(協(xié)調(diào)器),執(zhí)行relay log日志的線程為worker(當(dāng)前的SQL線程不僅起到協(xié)調(diào)器的作用,同時也可以重放relay log中主庫提交的事務(wù))

 MySQL并發(fā)復(fù)制系列二:多線程復(fù)制

問題2:

        MySQL 5.6基于schema級別的并發(fā)復(fù)制能夠解決當(dāng)業(yè)務(wù)數(shù)據(jù)的表放在不同的database庫下,但是實際生產(chǎn)中往往大多數(shù)或者全部的業(yè)務(wù)數(shù)據(jù)表都放在同一個schema下,在這種場景即使slave_parallel_workers>0設(shè)置也無法并發(fā)執(zhí)行relay log中記錄的主庫提交數(shù)據(jù)。 高并發(fā)的情況下,由于slave無法并發(fā)執(zhí)行同個schema下的業(yè)務(wù)數(shù)據(jù)表,依然會造成主備延遲的情況。

思考2:

      那么如果slave同時可以用多線程的方式,同時執(zhí)行一個schema下的所有業(yè)務(wù)數(shù)據(jù)表,將能大大提高slave節(jié)點(diǎn)執(zhí)行ralay log中記錄的主庫提交事務(wù)達(dá)到與主庫數(shù)據(jù)同步的目的,實現(xiàn)該功能我們需要解決什么問題?

  • 1、前面提到過為了保證主庫數(shù)據(jù)一致性,master節(jié)點(diǎn)寫入的binary log日志按照數(shù)據(jù)庫邏輯時間先后的順序并且slave節(jié)點(diǎn)執(zhí)行relay log中主庫提交的事務(wù)必須按照一致的順序否則會造成主備數(shù)據(jù)不一致的情況。

  • 2、既然要實現(xiàn)scehma下所有的業(yè)務(wù)數(shù)據(jù)表能夠并發(fā)執(zhí)行,那么slave必須得知道并發(fā)執(zhí)行relay log中主庫提交的事務(wù)不能相互影響而且結(jié)果必須和主庫保持一致。

實現(xiàn)2:

        MySQL 5.7 引入Enhanced Muti-threaded slaves,當(dāng)slave配置slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’,可支持一個schema下,slave_parallel_workers個的worker線程并發(fā)執(zhí)行relay log中主庫提交的事務(wù)。但是要實現(xiàn)以上功能,需要在master機(jī)器標(biāo)記binary log中的提交的事務(wù)哪些是可以并發(fā)執(zhí)行,雖然MySQL 5.6已經(jīng)引入了binary log group commit,但是沒有將可以并發(fā)執(zhí)行的事務(wù)標(biāo)記出來。

我們用命令 mysqlbinlog -vvv mysqlbinlog.0000003 | grep -i last_committed    MySQL 5.7master機(jī)器上可以看到last_committed 和sequence_number

 MySQL并發(fā)復(fù)制系列二:多線程復(fù)制

slave機(jī)器的relay log last_committed相同的事務(wù)(sequence_num不同)可以并發(fā)執(zhí)行。從上面截取的信息可以看出last_committed=26的事務(wù)一共有8個:從sequence_number=27~24。假設(shè)當(dāng)slave_parallel_workers=7時,Coordinator線程(SQL線程)分配這一組事務(wù)到worker中排隊去執(zhí)行。這里可以看出增加master庫binary log group commit組中事務(wù)的數(shù)量可以提高slave機(jī)器并發(fā)處理事務(wù)的數(shù)量,MySQL5.7引入 binlog_group_commit_sync_delay和 binlog_group_commit_sync_no_delay_count參數(shù)即提高binary log組提交并發(fā)數(shù)量。MySQL等待binlog_group_commit_sync_delay毫秒的時間直到binlog_group_commit_sync_no_delay_count個事務(wù)數(shù)時,將進(jìn)行一次組提交。

總結(jié):

    MySQL 5.7 GA版本推出的 Enhanced Multi-threaded Slaves功能,徹底解決了之前版本主備數(shù)據(jù)復(fù)制延遲的問題,開啟該功能參數(shù)如下:

 MySQL并發(fā)復(fù)制系列二:多線程復(fù)制

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁題目:MySQL并發(fā)復(fù)制系列二:多線程復(fù)制-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article24/dieice.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、面包屑導(dǎo)航、網(wǎng)站排名、網(wǎng)站維護(hù)虛擬主機(jī)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)