MySQL學(xué)習(xí)日記(十)-主從同步

主從形式


mysql主從復(fù)制 靈活

一主一從

主主復(fù)制

一主多從---擴(kuò)展系統(tǒng)讀取的性能,因?yàn)樽x是在從庫(kù)讀取的;

多主一從---5.7開始支持

聯(lián)級(jí)復(fù)制---


用途及條件


mysql主從復(fù)制用途

實(shí)時(shí)災(zāi)備,用于故障切換

讀寫分離,提供查詢服務(wù)

備份,避免影響業(yè)務(wù)


主從部署必要條件:

主庫(kù)開啟binlog日志(設(shè)置log-bin參數(shù))

主從server-id不同

從庫(kù)服務(wù)器能連通主庫(kù)


主從原理

mysql主從復(fù)制原理


從庫(kù)生成兩個(gè)線程,一個(gè)I/O線程,一個(gè)SQL線程;


i/o線程去請(qǐng)求主庫(kù) 的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中;

主庫(kù)會(huì)生成一個(gè) log dump 線程,用來(lái)給從庫(kù) i/o線程傳binlog;


SQL 線程,會(huì)讀取relay log文件中的日志,并解析成具體操作,來(lái)實(shí)現(xiàn)主從的操作一致,而最終數(shù)據(jù)一致;


問(wèn)題及解決方法


mysql主從復(fù)制存在的問(wèn)題:

主庫(kù)宕機(jī)后,數(shù)據(jù)可能丟失

從庫(kù)只有一個(gè)sql Thread,主庫(kù)寫壓力大,復(fù)制很可能延時(shí)


解決方法:

半同步復(fù)制---解決數(shù)據(jù)丟失的問(wèn)題

并行復(fù)制----解決從庫(kù)復(fù)制延遲的問(wèn)題


半同步復(fù)制


mysql semi-sync(半同步復(fù)制)

半同步復(fù)制:

5.5集成到mysql,以插件的形式存在,需要單獨(dú)安裝

確保事務(wù)提交后binlog至少傳輸?shù)揭粋€(gè)從庫(kù)

不保證從庫(kù)應(yīng)用完這個(gè)事務(wù)的binlog

性能有一定的降低,響應(yīng)時(shí)間會(huì)更長(zhǎng)

網(wǎng)絡(luò)異?;驈膸?kù)宕機(jī),卡主主庫(kù),直到超時(shí)或從庫(kù)恢復(fù)


主從復(fù)制--異步復(fù)制原理


半同步復(fù)制原理:


并行復(fù)制


mysql并行復(fù)制

社區(qū)版5.6中新增

并行是指從庫(kù)多線程apply binlog

庫(kù)級(jí)別并行應(yīng)用binlog,同一個(gè)庫(kù)數(shù)據(jù)更改還是串行的(5.7版并行復(fù)制基于事務(wù)組)

設(shè)置

set global slave_parallel_workers=10;

設(shè)置sql線程數(shù)為10



其他


部分?jǐn)?shù)據(jù)復(fù)制

主庫(kù)添加參數(shù):

binlog_do_db=db1

binlog_ignore_db=db1

binlog_ignore_db=db2

或從庫(kù)添加參數(shù)

replicate_do_db=db1

replicate_ignore_db=db1

replicate_do_table=db1.t1

replicate_wild_do_table=db%.%replicate_wild_ignore_table=db1.%


聯(lián)級(jí)復(fù)制(常用)

A->B->C

B中添加參數(shù):

log_slave_updates

B將把A的binlog記錄到自己的binlog日志中


復(fù)制的監(jiān)控:

show? slave status \G


復(fù)制出錯(cuò)處理

常見(jiàn):1062(主鍵沖突),1032(記錄不存在)

解決:

手動(dòng)處理

跳過(guò)復(fù)制錯(cuò)誤:set global sql_slave_skip_counter=1




總結(jié)


主從形式

一主一從

一主多從--擴(kuò)展系統(tǒng)讀取性能

多主一從--5.7開始支持

主主復(fù)制

聯(lián)級(jí)復(fù)制

用途:實(shí)時(shí)災(zāi)備的故障切換,讀寫分離,備份

原理

主:log dump線程傳binlog;

i/o線程接受讀取binlog,并寫入relay log文件

sql線程從relay log 文件中讀取binlog并持久化

問(wèn)題及解決

主庫(kù)宕機(jī)后,數(shù)據(jù)丟失

半同步復(fù)制

主庫(kù)寫壓力大,因從庫(kù)只有一個(gè)sql 線程來(lái)持久化,復(fù)制可能延遲

并行復(fù)制

半同步復(fù)制:

原理

事務(wù)在主庫(kù)寫完binlog后需要從庫(kù)返回一個(gè)已接受,才放回給客戶端;

5.5集成到mysql,以插件的形式存在,需要單獨(dú)安裝

確保事務(wù)提交后binlog至少傳輸?shù)揭粋€(gè)從庫(kù)

不保證從庫(kù)應(yīng)用完成這個(gè)事務(wù)的binlog

性能有一定的降低

網(wǎng)絡(luò)異?;驈膸?kù)宕機(jī),卡主庫(kù),直到超時(shí)或從庫(kù)恢復(fù)

并行復(fù)制

原理:從庫(kù)多線程apply binlog

在社區(qū)5.6中新增

庫(kù)級(jí)別并行應(yīng)用binlog,同一個(gè)庫(kù)數(shù)據(jù)更改還是串行的

5.7版本并行復(fù)制基于事務(wù)組

部分?jǐn)?shù)據(jù)復(fù)制

聯(lián)級(jí)復(fù)制(常用)

A->B->C

B中添加參數(shù)log_slave_updates

B將把A的binlog記錄到自己的binlog日志中

復(fù)制的監(jiān)控

show slave status

復(fù)制出錯(cuò)處理

常見(jiàn):1062(主鍵沖突),1032(記錄不存在)

解決:

手動(dòng)處理

跳過(guò)復(fù)制錯(cuò)誤:set global sql_slave_skip_counter=1

mysql主從復(fù)制是mysql高可用性,高性能(負(fù)載均衡)的基礎(chǔ)

簡(jiǎn)單,靈活,部署方式多樣,可以根據(jù)不同業(yè)務(wù)場(chǎng)景部署不同復(fù)制結(jié)構(gòu)

復(fù)制過(guò)程中應(yīng)該時(shí)刻監(jiān)控復(fù)制狀態(tài),復(fù)制出錯(cuò)或延時(shí)可能給系統(tǒng)造成影響

mysql主從復(fù)制目前也存在一些問(wèn)題,可以根據(jù)需要部署復(fù)制增強(qiáng)功能

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容