一 前言
前文 介紹了5.5/5.6 版本的MySQL semi sync 基礎(chǔ)原理和配置,隨著MySQL 5.7 的發(fā)布,新版本的MySQL修復(fù)了semi sync 的一些bug 并且增強(qiáng)了功能。
-
支持發(fā)送binlog和接受ack的異步化;
-
支持在事務(wù)commit前等待ACK;
-
在server層判斷備庫(kù)是否要求半同步以減少Plugin鎖沖突;
-
解除binlog dump線程和lock_log的沖突等等。
本文重點(diǎn)分析 第1,2個(gè)改進(jìn)項(xiàng),因?yàn)樵瓉?lái)的模式的確會(huì)影響系統(tǒng)的tps,新的異步模式可以提高半同步模式下的系統(tǒng)事務(wù)處理能力。
二 優(yōu)化
1 支持發(fā)送binlog和接受ack的異步化
通過(guò)前面的介紹,我們知道Semisynchronous Replication模式下,app在主庫(kù)上提交一個(gè)事務(wù)/event,MySQL將每個(gè)事務(wù)寫(xiě)入binary并且同步到到slave ,master會(huì)等待至少一個(gè)slave通知:slave 已經(jīng)接收到傳過(guò)來(lái)的events并寫(xiě)入relay log,才返回給回話層 寫(xiě)入成功,或者直到傳送日志發(fā)生超時(shí),系統(tǒng)自動(dòng)將為異步復(fù)制模式。
整體流程的邏輯圖
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),丹棱網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:丹棱等地區(qū)。丹棱做網(wǎng)站價(jià)格咨詢:13518219792
5.5 版本semi sync 設(shè)計(jì)的缺點(diǎn):
從原理以及上圖來(lái)看,舊版本的semi sync 受限于dump thread ,原因是dump thread 承擔(dān)了兩份不同且又十分頻繁的任務(wù):傳送binlog 給slave ,還需要等待slave反饋信息,而且這兩個(gè)任務(wù)是串行的,dump thread 必須等待 slave 返回之后才會(huì)傳送下一個(gè) events 事務(wù)。dump thread 已然成為整個(gè)半同步提高性能的瓶頸在高并發(fā)業(yè)務(wù)場(chǎng)景下,這樣的機(jī)制會(huì)影響數(shù)據(jù)庫(kù)整體的TPS .
為了解決上述問(wèn)題,在5.7.4版本的semi sync 框架中,獨(dú)立出一個(gè) ack collector thread ,專門(mén)用于接收slave 的反饋信息。這樣master 上有兩個(gè)進(jìn)程獨(dú)立工作,可以同時(shí)發(fā)送binlog 到slave ,和接收slave的反饋。整體流程的邏輯圖
大體的實(shí)現(xiàn)思路是:
備庫(kù)IO線程使用TCP協(xié)議和主庫(kù)交互,讀寫(xiě)socket可以同時(shí)進(jìn)行,在開(kāi)啟主庫(kù)semisync時(shí),啟動(dòng)一個(gè)后臺(tái)線程,使用select監(jiān)聽(tīng)備庫(kù)連接socket;
dump線程不再等待備庫(kù)ACK;在ack reciver線程等待ACK時(shí),dump線程還能繼續(xù)發(fā)送下一組group commit的binlog,進(jìn)而提升TPS.
2 支持在事務(wù)commit前等待ACK;
新版本的semi sync 增加了rpl_semi_sync_master_wait_point參數(shù) 來(lái)控制半同步模式下 主庫(kù)在返回給會(huì)話事務(wù)成功之前提交事務(wù)的方式。
該參數(shù)有兩個(gè)值:
AFTER_SYNC (默認(rèn)值):master 將每個(gè)事務(wù)寫(xiě)入binlog ,傳遞到slave,并且刷新到磁盤(pán)。master等待slave 反饋接收到事務(wù)并刷新到磁盤(pán)。一旦接到slave反饋,master在主庫(kù)提交事務(wù)并且返回結(jié)果給會(huì)話。 在AFTER_SYNC模式下,所有的客戶端在同一時(shí)刻查看已經(jīng)提交的數(shù)據(jù)。假如發(fā)生主庫(kù)crash,所有在主庫(kù)上已經(jīng)提交的事務(wù)已經(jīng)同步到slave并記錄到relay log。此時(shí)切換到從庫(kù),可以保障最小的數(shù)據(jù)損失。
AFTER_COMMIT:master 將每個(gè)事務(wù)寫(xiě)入binlog ,傳遞到slave 刷新到磁盤(pán)(relay log),然后在主庫(kù)提交事務(wù)。master在提交事務(wù)后等待slave 反饋接收到事務(wù)并刷新到磁盤(pán)。一旦接到slave反饋,master將結(jié)果反饋給客戶端。
在AFTER_COMMIT模式下,如果slave 沒(méi)有應(yīng)用日志,此時(shí)master crash,系統(tǒng)failover到slave,app將發(fā)現(xiàn)數(shù)據(jù)出現(xiàn)不一致,在master提交而slave 沒(méi)有應(yīng)用。
三 推薦閱讀
注:最后三個(gè)來(lái)自于MySQL replication 開(kāi)發(fā)小組的blog,需要翻墻,請(qǐng)自備梯子。
[1] 5.7 Semisynchronous Replication
[2] loss-less-semi-synchronous-replication
MySQL 5.7 修改了半同步中主庫(kù)提交的事務(wù)的順序,after sync 模式避免了幻讀發(fā)生。
[3] enforced-semi-synchronous-replication
MySQL 5.7 半同步增強(qiáng),增加 rpl_semi_sync_master_wait_slave_count 參數(shù)控制主庫(kù)接收多少個(gè)slave 寫(xiě)事務(wù)成功反饋 才返回 成功給客戶端 。
[4] faster-semisync-replication
修改原來(lái)有dump thread 發(fā)送event和接收slave ack 模式,獨(dú)立出 單獨(dú) 接收slave 返回 ack的進(jìn)程,提高半同步模式的tps 。
文章標(biāo)題:【MySQL】5.7版本SemisyncReplication增強(qiáng)
本文網(wǎng)址:
http://weahome.cn/article/gihjps.html