一.MySQL復(fù)制概述
? ? 復(fù)制是指將主數(shù)據(jù)庫(kù)的DDL和DML操作通過(guò)二進(jìn)制日志傳到復(fù)制服務(wù)器(也叫從庫(kù))上,然后在從庫(kù)上對(duì)這些日志重新執(zhí)行(也叫重做)唁桩,從而使從庫(kù)和主庫(kù)的數(shù)據(jù)保持同步闭树。
? ? 為什么要做主從復(fù)制?
? ? 1.如果主庫(kù)出現(xiàn)問(wèn)題荒澡,可以快速切換到從庫(kù)提供服務(wù)
? ? 2.可以在從庫(kù)上執(zhí)行查詢(xún)操作报辱,降低主庫(kù)的訪問(wèn)壓力
? ? 3.可以在從庫(kù)上執(zhí)行備份,以避免備份期間影響主庫(kù)的服務(wù)
? ? 復(fù)制的原理是什么单山?
? ? 1.首先碍现,MySQL主庫(kù)在事務(wù)提交時(shí)會(huì)把數(shù)據(jù)變更作為事件Events記錄在二進(jìn)制日志文件Binlog中,MySQL主庫(kù)上的sync_binlog參數(shù)控制Binlog日志刷新到磁盤(pán)米奸。
? ? 2.主庫(kù)推送二進(jìn)制日志文件binlog中的事件從從庫(kù)的中繼日志Relay Log昼接,之后從庫(kù)根據(jù)中繼日志重做數(shù)據(jù)變更操作,通過(guò)邏輯復(fù)制以此來(lái)達(dá)到主庫(kù)和從庫(kù)的數(shù)據(jù)一致悴晰。
? ??
? ? 復(fù)制中的各類(lèi)文件棵逊?
? ? 二進(jìn)制日志文件Binlog會(huì)把MySQL中所有的數(shù)據(jù)修改操作以二進(jìn)制的形式記錄到日志文件中,包括Create, Drop, Insert, Update, Delete操作等迂苛,但二進(jìn)制日志文件不會(huì)記錄Select操作免钻。
? ? 中繼日志文件Relay Log的文件格式旁涤、內(nèi)容和二進(jìn)制日志文件Binlog一樣,唯一的區(qū)別在于從庫(kù)上的SQL縣城在執(zhí)行完當(dāng)前中繼日志文件中的事件后,SQL線程會(huì)自動(dòng)刪除當(dāng)前中繼日志文件,避免從庫(kù)上的中繼日志文件占用過(guò)多的磁盤(pán)空間袒啼。
? ? 為了保證從庫(kù)crash重啟之后,從庫(kù)的IO線程和SQL線程仍然能夠知道從哪里開(kāi)始復(fù)制纬纪,從庫(kù)上默認(rèn)還會(huì)創(chuàng)建兩個(gè)日志文件用來(lái)報(bào)錯(cuò)復(fù)制的進(jìn)度蚓再。這兩個(gè)文件在磁盤(pán)上以文件形式分別記錄了從庫(kù)的IO線程當(dāng)前讀取主庫(kù)二進(jìn)制Binlog的進(jìn)度和SQL線程應(yīng)用中繼日志的進(jìn)度。
? ? 三種復(fù)制方式包各?
? ? 1.Statement:基于SQL語(yǔ)句級(jí)別的Binlog摘仅,每條修改數(shù)據(jù)的SQL都會(huì)保存到Binlog里
? ? 2.Row:基于行級(jí)別,記錄每一行數(shù)據(jù)的變化髓棋,也就是將每行數(shù)據(jù)的變化都記錄到Binlog里实檀,記錄得非常詳細(xì)惶洲,但并不記錄原始SQL按声,在復(fù)制的時(shí)候,并不會(huì)因?yàn)榇鎯?chǔ)過(guò)程或持法器造成主從數(shù)據(jù)不一致的問(wèn)題恬吕,但是記錄的日志量較statement格式要大的多
? ? 3.Mixed:混合Statement和Row模式签则,默認(rèn)情況下才從statement模式記錄,某些情況會(huì)切換到Row模式
二铐料、復(fù)制的3種常見(jiàn)架構(gòu)
1.一主多從復(fù)制架構(gòu)
? ? 在主庫(kù)讀取請(qǐng)求壓力非常大的場(chǎng)景下渐裂,可以通過(guò)配置一主多從復(fù)制架構(gòu)實(shí)現(xiàn)讀寫(xiě)分離,把大量對(duì)實(shí)時(shí)性要求不是特別高的讀請(qǐng)求通過(guò)負(fù)載均衡分布到多個(gè)從庫(kù)上钠惩,降低主庫(kù)的讀取壓力柒凉。在主庫(kù)出現(xiàn)異常宕機(jī)的情況下,可以把一個(gè)從庫(kù)切換為主庫(kù)繼續(xù)提供服務(wù)篓跛。
2.多級(jí)復(fù)制架構(gòu)
? ? 主庫(kù)Master1只需要給一個(gè)從庫(kù)Master2推送Binlog日志即可膝捞,減輕主庫(kù)Master1推送的壓力,二級(jí)主庫(kù)再推送Binlog日志給從庫(kù)愧沟。多級(jí)復(fù)制解決了一主多從場(chǎng)景下蔬咬,從庫(kù)的IO負(fù)載和網(wǎng)絡(luò)壓力,缺點(diǎn)是MySQL的復(fù)制是異步復(fù)制沐寺,多級(jí)復(fù)制場(chǎng)景下的主庫(kù)的數(shù)據(jù)是經(jīng)歷過(guò)兩次復(fù)制才到達(dá)從庫(kù)的林艘,期間的延時(shí)比一主多從復(fù)制場(chǎng)景下只經(jīng)歷一次復(fù)制的要大
3.雙主復(fù)制/Dual Master架構(gòu)
? ? 雙主/Dual Master架構(gòu)特別適用于DBA做維護(hù)等需要主從切換的場(chǎng)景,通過(guò)雙主架構(gòu)避免了重復(fù)搭建從庫(kù)的麻煩混坞。
三狐援、MySQL復(fù)制搭建過(guò)程
1.異步復(fù)制
? ? 主庫(kù)執(zhí)行完Commit提交操作后,在主庫(kù)寫(xiě)入Binlog日志后即可成功返回客戶(hù)端,無(wú)需等到Binlog日志傳送給從庫(kù)
2.半同步復(fù)制
? ? 半同步復(fù)制為了保證主庫(kù)上每一個(gè)Binlog事務(wù)都能夠被可靠地復(fù)制到從庫(kù)上啥酱,主庫(kù)在每次事務(wù)成功提交時(shí)场钉,并不及時(shí)反饋給前端用戶(hù),而是等待其中一個(gè)從庫(kù)也接收到Binlog事務(wù)并成功寫(xiě)入中繼日志后懈涛,主庫(kù)才返回Commit操作成功給客戶(hù)端逛万。
四、如何提高復(fù)制的性能
主庫(kù)是多線程并發(fā)在寫(xiě)入批钠,而從庫(kù)僅僅只有一個(gè)SQL線程在執(zhí)行應(yīng)用宇植,容易出現(xiàn)從庫(kù)追不上主庫(kù)的情況。
方案一:通過(guò)拆分減少一個(gè)從庫(kù)上需要數(shù)據(jù)同步的表來(lái)解決埋心。使不同的從庫(kù)復(fù)制不同的庫(kù)/表指郁,減少每個(gè)庫(kù)上需要寫(xiě)入的數(shù)據(jù)。
方案二:MySQL5.6支持基于Schema的多線程復(fù)制拷呆,運(yùn)訓(xùn)從庫(kù)并行更新
此文來(lái)源于閱讀《深入淺出MySQL 數(shù)據(jù)庫(kù)開(kāi)發(fā)闲坎、優(yōu)化與管理維護(hù)》