您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“MySQL主從同步加速的方案”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“MySQL主從同步加速的方案”吧!
一、問(wèn)題起源
MySQL的主從同步一直有從庫(kù)延遲的問(wèn)題,背景資料網(wǎng)上很多,原因簡(jiǎn)單描述如下:
1、 MySQL從庫(kù)上有一個(gè)IO線程負(fù)責(zé)從主庫(kù)取binlog到寫到本地。另外有一個(gè)SQL線程負(fù)責(zé)執(zhí)行這些本地日志,實(shí)現(xiàn)命令重放;
2、 正常網(wǎng)絡(luò)狀況下IO線程沒(méi)有性能問(wèn)題(這個(gè)待會(huì)會(huì)用到),問(wèn)題是SQL線程只有一個(gè),更新速度跟不上。所以經(jīng)常會(huì)看到從庫(kù)的CPU idle很高,但同步性能就是上不去。
二、方案雛形
單線程的SQL線程是造成這個(gè)問(wèn)題的主要原因。比較直接的想法是把它改成多線程版本,這個(gè)據(jù)說(shuō)官方版本開(kāi)發(fā)中,其實(shí)我們也有一個(gè)這樣的patch,但是直接寫大片代碼在線上提供服務(wù)的slave機(jī)器上這種事兒,都會(huì)因?yàn)閾?dān)心穩(wěn)定性而很難推動(dòng)(寫patch的和運(yùn)維的同學(xué),你們懂的)。
所以打算用一個(gè)“第三方”工具中轉(zhuǎn),來(lái)實(shí)現(xiàn)多線程同步?;窘Y(jié)構(gòu)如下:
說(shuō)明:
1、這些transefer從master上各自同步一部分的數(shù)據(jù),分別獨(dú)立更新slave。多進(jìn)程還是多線程均可。
2、Transfer與master之間異步更新日志,transfer與slve之間同步更新數(shù)據(jù)
3、從這可以看出這個(gè)方案的缺點(diǎn)之一:更新能夠被獨(dú)立分開(kāi)。比較直觀的想法是,按照表分。
三、關(guān)于transfer
作為這個(gè)關(guān)鍵的轉(zhuǎn)發(fā)工具transfer,需要提供如下功能:
1、能夠指定同步master中的哪部分?jǐn)?shù)據(jù),并且能夠方便地修改這個(gè)配置以應(yīng)對(duì)master的加表需求;
2、支持stop slave、start slave。支持快速切換到新主庫(kù)的change master命令。
3、能夠記錄讀取點(diǎn),transfer自己重啟或master重啟后能夠按照記錄點(diǎn)繼續(xù)讀后面的binlog;
4、能夠記錄分發(fā)點(diǎn),transfer自己重啟或slave重啟后能夠按照記錄點(diǎn)繼續(xù)同步給slave
用起來(lái)就會(huì)發(fā)現(xiàn)還有好多要求。。。
四、方案實(shí)現(xiàn)
Transfer的這么多功能,自己造輪子就累了。這里直接用MySQL來(lái)充當(dāng)此角色。為了方便描述,下文還將之稱為transfer。Transfer更新slave在功能上可以使用federated引擎,但由于其糾結(jié)的實(shí)現(xiàn)導(dǎo)致性能上達(dá)不到要求,因此在MySQL框架層中作了一點(diǎn)修改――讀到同步日志后,直接發(fā)送給slave。
方案簡(jiǎn)單描述如下:
1、 Slave機(jī)器上搭另外的若干個(gè)MySQL(transfer),將其設(shè)為Master的從庫(kù),且設(shè)置replicate-do-table, 每個(gè)transfer承擔(dān)一部分的表。
2、 所有Transfer的更新目標(biāo)都設(shè)置為slave,其更新方式是讀到日志后直接_real_query執(zhí)行到slave上。
從這可以看出這個(gè)方案的缺點(diǎn)之二:只能支持statement格式的同步方式。其實(shí)row也能支持,后面再說(shuō)。
五、仍然延遲?
在transfer放棄federated引擎改用直接發(fā)送后,性能提升不少,從庫(kù)同步性能增加一倍,但從本文第一個(gè)圖的數(shù)據(jù)對(duì)比就知道,延遲還很大。
發(fā)現(xiàn)這個(gè)時(shí)候slave的機(jī)器cpu已經(jīng)很忙了,idle 20%一下――這個(gè)算是好消息,總比idle很高但性能上不去好。
實(shí)際上是因?yàn)槊總€(gè)transfer,雖然設(shè)置只同步其中的部分表,但在實(shí)現(xiàn)上是IO線程把master上的所有命令都備份到本地,然后在SQL線程執(zhí)行的時(shí)候再判斷,若不符合replicate-do-table,再放棄。
這樣存在的問(wèn)題,是n個(gè)transfer,磁盤寫了n倍,更嚴(yán)重的是導(dǎo)致SQL線程空轉(zhuǎn)。
我們上文提到整個(gè)流程中IO線程是比較空閑的,因此修改IO線程邏輯,在寫入磁盤前先判斷,若不符合本transfer的replicate-do-table設(shè)置,不寫盤,直接放棄。
六、效果
從庫(kù)的QPS由于線程切換會(huì)有抖動(dòng),但總的執(zhí)行時(shí)間與主庫(kù)相同。從庫(kù)的cpu idle下降,與主庫(kù)幾乎同時(shí)恢復(fù)到100。
七、小結(jié)
描述完了,總結(jié)一下,方案的代價(jià):
1、要求在slave機(jī)器上多配置n個(gè)transfer(是否在從庫(kù)上均可)
2、目前只能支持statement的binlog格式,實(shí)際上row可以支持,方案定了,開(kāi)發(fā)計(jì)劃中。
3、跨表更新的語(yǔ)句,會(huì)按照其更新的第一個(gè)表,分發(fā)到唯一一個(gè)transfer,沒(méi)有重復(fù)更新的問(wèn)題,但有時(shí)序性問(wèn)題。
方案的好處:
1、功能比較齊全。直接使用MySQL,原有的管理功能基本都能用,主庫(kù)從庫(kù)重啟/換庫(kù)的代價(jià)比較小。
2、開(kāi)發(fā)量小,只在transfer上修改兩處,不包括配置讀取部分,300行以內(nèi)
3、風(fēng)險(xiǎn)相對(duì)小。不直接修改master和slve上的代碼,線上比較容易接收。
到此,相信大家對(duì)“MySQL主從同步加速的方案”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。