一文詳解MySQL主從同步原理
1. MySQL主從同步實(shí)現(xiàn)方式
MySQL主從同步是基于Bin Log實(shí)現(xiàn)的,而Bin Log記錄的是原始SQL語句。
Bin Log共有三種日志格式,可以binlog_format配置參數(shù)指定。
| 參數(shù)值 | 含義 |
|---|---|
| Statement | 記錄原始SQL語句,會導(dǎo)致更新時間與原庫不一致。 比如 update_time=now() |
| Row | 記錄每行數(shù)據(jù)的變化,保證了數(shù)據(jù)與原庫一致,缺點(diǎn)是數(shù)據(jù)量較大。 |
| Mixed | Statement和Row的混合模式,默認(rèn)采用Statement模式,涉及日期、函數(shù)相關(guān)的時候采用Row模式,既減少了數(shù)據(jù)量,又保證了數(shù)據(jù)一致性。 |
常見的主從同步架構(gòu)有一主多從、雙主多從

2. MySQL主從同步的作用
- 讀寫分離,提升數(shù)據(jù)庫性能
- 容災(zāi)恢復(fù),主服務(wù)器不可用時,從服務(wù)器提供服務(wù),提高可用性
- 冗余備份,主服務(wù)器數(shù)據(jù)損壞丟失,從服務(wù)器保留備份
一主多從架構(gòu)
一般是主庫負(fù)責(zé)所有讀寫請求,而從庫只負(fù)責(zé)容災(zāi)恢復(fù)和冗余備份。
如果做了讀寫分離的話,主庫負(fù)責(zé)寫請求,從庫負(fù)責(zé)讀請求,可以提升數(shù)據(jù)庫性能。
雙主多從架構(gòu)
一般是主庫1負(fù)責(zé)所有讀寫請求,主庫2不對外提供服務(wù),只用來容災(zāi)恢復(fù)。
相比一主多從架構(gòu),雙主多從架構(gòu)可以減少宕機(jī)時間,更快恢復(fù)數(shù)據(jù)庫可用狀態(tài)。
3. 主動同步的原理

- 當(dāng)主庫數(shù)據(jù)發(fā)生變更時,寫入本地Bin Log文件
- 從庫IO線程發(fā)起dump主庫Bin Log文件的請求
- 主庫IO線程推送Bin Log文件到從庫中
- 從庫IO線程把Bin Log內(nèi)容寫入本地的Relay Log文件中
- 從庫SQL線程讀取Relay Log文件內(nèi)容
- 從庫SQL線程重新執(zhí)行一遍SQL語句
4. 主從同步延遲問題
主從同步最常遇到的問題就是主從同步延遲,可以通過在從庫上執(zhí)行show slave status命令查看延遲時間,Seconds_Behind_Master表示延遲的秒數(shù)。

主從同步延遲的原因有哪些?
從庫機(jī)器性能較差:
主庫負(fù)責(zé)所有讀寫請求,從庫只用來備份,會用性能較差的機(jī)器,執(zhí)行時間自然較慢。
從庫壓力更大:
- 讀寫分離后,主庫負(fù)責(zé)寫請求,從庫負(fù)責(zé)讀請求。
- 互聯(lián)網(wǎng)應(yīng)用一般讀請求更多,所以從庫讀壓力更大,占用更多CPU資源。
網(wǎng)絡(luò)延遲:
當(dāng)主庫的Bin Log文件往從庫上發(fā)送時,可能產(chǎn)生網(wǎng)絡(luò)延遲,也會導(dǎo)致從庫數(shù)據(jù)跟不上。
主庫有大事務(wù):
當(dāng)主庫上有個大事務(wù)需要執(zhí)行5分鐘,把Bin Log文件發(fā)送到從庫,從庫至少也需要執(zhí)行5分鐘,所以這時候從庫就出現(xiàn)了5分鐘的延遲。
主從同步延遲的解決方案?
從庫機(jī)器性能較差:
把從庫換成跟主庫同等規(guī)格的機(jī)器。
從庫壓力更大:
多搞幾臺從庫,分擔(dān)讀請求壓力。
網(wǎng)絡(luò)延遲:
聯(lián)系運(yùn)維或者云服務(wù)提供商解決。
主庫有大事務(wù):
把大事務(wù)分割成小事務(wù)執(zhí)行,大事務(wù)不但會產(chǎn)生從庫延遲,還可能產(chǎn)生死鎖,降低數(shù)據(jù)庫并發(fā)性能,所以盡量少用大事務(wù)。
5. 如何提升主從同步性能
從庫開啟多線程復(fù)制
就是在主從同步的最后兩步使用多線程,修改配置 slave_parallel_workers=4,代表開啟4個復(fù)制線程。

修改同步模式,改為異步
主從同步共有三種復(fù)制方式:
全同步復(fù)制:
當(dāng)主庫執(zhí)行完一個事務(wù),并且所有從庫都執(zhí)行完該事務(wù)后,才給客戶端返回成功。
半同步復(fù)制:
至少有一個從庫執(zhí)行完成后,就給客戶端返回成功。
異步復(fù)制:
主庫執(zhí)行完后,立即返回成功,不關(guān)心從庫是否執(zhí)行完成。
如果對數(shù)據(jù)安全性要求沒那么高,可以把同步模式改成半同步復(fù)制或者異步復(fù)制。
修改從庫Bin Log配置
修改sync_binlog配置:
sync_binlog=0 ,表示寫binlog不立即刷新磁盤,由系統(tǒng)決定什么時候刷新磁盤。
sync_binlog=1,每次寫binlog都刷新磁盤,安全性高,性能差。
sync_binlog=N,寫N次binlog才刷新磁盤。
從庫對數(shù)據(jù)安全性要求沒那么高,可以設(shè)置sync_binlog=0。
修改innodb_flush_log_at_trx_commit配置:
innodb_flush_log_at_trx_commit=0,每隔一秒鐘,把事務(wù)日志刷新到磁盤。
innodb_flush_log_at_trx_commit=1,每次事務(wù)都刷新到磁盤。
innodb_flush_log_at_trx_commit=2,每次事務(wù)都不主動刷新磁盤,由系統(tǒng)決定什么時候刷新磁盤。
從庫對數(shù)據(jù)安全性要求沒那么高,可以設(shè)置innodb_flush_log_at_trx_commit=2。
知識點(diǎn)總結(jié)

到此這篇關(guān)于一文詳解MySQL主從同步原理的文章就介紹到這了,更多相關(guān)MySQL主從同步原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql主從同步Last_IO_Errno:1236錯誤解決方法
最近遇到Mysql主從同步的Last_IO_Errno:1236錯誤問題,然后在網(wǎng)上查找相關(guān)解決方案,這里分享給大家,供參考。2017-10-10
MySQL主從配置及haproxy和keepalived搭建過程解析
這篇文章主要介紹了MySQL主從配置及haproxy和keepalived搭建,本次運(yùn)行環(huán)境是在docker中,也會介紹一些docker的知識,需要的朋友可以參考下2022-05-05
mysql創(chuàng)建數(shù)據(jù)庫,添加用戶,用戶授權(quán)實(shí)操方法
在本篇文章里小編給大家整理的是關(guān)于mysql創(chuàng)建數(shù)據(jù)庫,添加用戶,用戶授權(quán)實(shí)操方法相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。2019-10-10
MySQL數(shù)據(jù)庫開發(fā)的36條原則(小結(jié))
這篇文章主要介紹了MySQL數(shù)據(jù)庫開發(fā)的36條原則(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

