- MySQL高可用實(shí)踐
- 王雪迎
- 1389字
- 2021-03-26 23:06:31
第2章 半同步復(fù)制
2.1 MySQL半同步復(fù)制簡(jiǎn)介
直到目前的最新版本,MySQL默認(rèn)依然使用異步復(fù)制策略。所謂的異步復(fù)制,指的是主庫寫二進(jìn)制日志、從庫的I/O線程讀主庫的二進(jìn)制日志和寫本地中繼日志、從庫的SQL線程重放中繼日志,這三步操作都是異步進(jìn)行的。如此選擇的主要理由是出于性能的考慮,與同步復(fù)制相比,異步復(fù)制顯然更快,同時(shí)能承載更高的吞吐量。不過,異步復(fù)制的缺點(diǎn)同樣顯而易見,它不能保證主從數(shù)據(jù)實(shí)時(shí)一致,也無法控制從庫的延遲時(shí)間,因此它不適于要求主從數(shù)據(jù)強(qiáng)一致性的場(chǎng)景。例如,為了分解讀寫壓力,同一個(gè)程序?qū)懼鲙熳x從庫,且要求讀到的數(shù)據(jù)與讀主庫的相同,異步復(fù)制無法滿足這種強(qiáng)數(shù)據(jù)一致性的需求。異步復(fù)制的另一個(gè)問題是可能會(huì)有數(shù)據(jù)丟失,例如主庫宕機(jī)時(shí),已經(jīng)提交的事務(wù)可能還沒有傳到從庫上,如果此時(shí)強(qiáng)行進(jìn)行主從切換,那么就可能導(dǎo)致新主庫上的數(shù)據(jù)不完整。
于是在MySQL 5.5中就自然而然地引入了半同步復(fù)制,用作異步復(fù)制的可選替代方案,它具有以下特性:
- 從庫在連接主庫時(shí)表明它是否支持半同步復(fù)制。
- 如果在主庫啟用了半同步復(fù)制,并且至少有一個(gè)支持半同步復(fù)制的從庫,則主庫上執(zhí)行事務(wù)提交的線程將等待,直到至少一個(gè)半同步從庫確認(rèn)已收到事務(wù)的所有事件(此時(shí)從庫會(huì)向主庫發(fā)送ACK信息,即確認(rèn)信息。ACK為Acknowledgement的縮寫),或者直到發(fā)生超時(shí)。
- 只有在將事件寫入其中繼日志并刷新到磁盤后,從庫才會(huì)確認(rèn)收到事務(wù)的事件,即向主庫發(fā)送ACK。
- 如果在沒有任何從庫確認(rèn)事務(wù)的情況下發(fā)生超時(shí),則主庫將退化為異步復(fù)制。當(dāng)至少有一個(gè)半同步從庫趕上時(shí),主庫恢復(fù)半同步復(fù)制。退化與恢復(fù)過程都是自動(dòng)的。
- 必須在主庫和從庫上都啟用半同步復(fù)制,否則使用異步復(fù)制。
當(dāng)主庫因等待來自從庫的確認(rèn)而阻塞時(shí),它不會(huì)返回執(zhí)行事務(wù)的會(huì)話。阻塞結(jié)束時(shí),主庫返回到會(huì)話,然后該會(huì)話可以繼續(xù)執(zhí)行其他語句。此時(shí),事務(wù)已在主庫提交,并且至少一個(gè)從庫已確認(rèn)其事件的接收。在繼續(xù)之前,主庫必須收到的確認(rèn)從庫的數(shù)量,可使用rpl_semi_sync_master_wait_for_slave_count系統(tǒng)變量進(jìn)行配置,默認(rèn)值為1。
不只是事務(wù)提交,事務(wù)回滾時(shí)主庫也會(huì)發(fā)生同樣的阻塞。MySQL同時(shí)支持多個(gè)數(shù)據(jù)庫引擎,當(dāng)一個(gè)事務(wù)中既包含事務(wù)表又包含非事務(wù)表時(shí),回滾即使對(duì)事務(wù)表沒有影響,二進(jìn)制日志中也會(huì)記錄非事務(wù)表的事件,因?yàn)閷?duì)非事務(wù)表的修改無法回滾并且必須發(fā)送到從庫。
在未以START TRANSACTION或SET autocommit=0開啟事務(wù)時(shí),每條語句都自動(dòng)隱式提交。使用半同步復(fù)制時(shí),主庫上的這類語句就像顯式事務(wù)提交一樣。
為了加深對(duì)半同步復(fù)制中“半”的理解,簡(jiǎn)單將其與異步和全同步復(fù)制進(jìn)行比較:
- 異步復(fù)制:主庫提交事務(wù)時(shí),將事件寫入它的二進(jìn)制日志,而從庫在準(zhǔn)備就緒時(shí)請(qǐng)求它們。主庫無需等待從庫的ACK回復(fù),直接提交事務(wù)并返回客戶端。異步復(fù)制不確保所有事件都能到達(dá)從庫,因而無法保證數(shù)據(jù)的強(qiáng)一致性。
- 全同步復(fù)制:當(dāng)主庫提交事務(wù)時(shí),所有從庫也將在主庫返回執(zhí)行事務(wù)的會(huì)話之前提交事務(wù)。這樣做的缺點(diǎn)是完成事務(wù)可能會(huì)有很大的延遲。
- 半同步復(fù)制:介于異步復(fù)制和全同步復(fù)制之間。主庫僅等待至少一個(gè)從庫接收并記錄事件。它不會(huì)等待所有從庫都確認(rèn)收到,并且從庫只需要確認(rèn)接收,而不是事件已在從庫處理完成和提交。
與異步復(fù)制相比,半同步復(fù)制提供了改進(jìn)的數(shù)據(jù)完整性,因?yàn)楫?dāng)提交成功返回時(shí),已知數(shù)據(jù)至少存在于兩個(gè)位置。半同步復(fù)制確實(shí)會(huì)對(duì)性能產(chǎn)生一些影響,因?yàn)樾枰却龔膸欤峤凰俣葧?huì)變慢,延遲至少是將提交發(fā)送到從庫,并等待從庫確認(rèn)收到的一個(gè)TCP/IP往返時(shí)間(RTT,Round-Trip Time)。這意味著半同步復(fù)制最好用于低延時(shí)的網(wǎng)絡(luò)中。
- TypeScript入門與實(shí)戰(zhàn)
- 數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)(Java語言實(shí)現(xiàn))
- CentOS 7 Server Deployment Cookbook
- Java程序員面試算法寶典
- Python高效開發(fā)實(shí)戰(zhàn):Django、Tornado、Flask、Twisted(第2版)
- Java Web基礎(chǔ)與實(shí)例教程
- STM32F0實(shí)戰(zhàn):基于HAL庫開發(fā)
- SAS數(shù)據(jù)統(tǒng)計(jì)分析與編程實(shí)踐
- Redis Essentials
- 劍指大數(shù)據(jù):企業(yè)級(jí)數(shù)據(jù)倉庫項(xiàng)目實(shí)戰(zhàn)(在線教育版)
- Mastering openFrameworks:Creative Coding Demystified
- LabVIEW虛擬儀器入門與測(cè)控應(yīng)用100例
- 小型編譯器設(shè)計(jì)實(shí)踐
- 區(qū)塊鏈國(guó)產(chǎn)化實(shí)踐指南:基于Fabric 2.0
- JavaScript+jQuery網(wǎng)頁特效設(shè)計(jì)任務(wù)驅(qū)動(dòng)教程