
文章插圖
MySQL 數(shù)據(jù)庫(kù)內(nèi)建的復(fù)制功能是構(gòu)建基于 MySQL 的大規(guī)模、高性能應(yīng)用的基礎(chǔ) 。復(fù)制就是讓一個(gè) MySQL主庫(kù) (Master) 將數(shù)據(jù)通過(guò)日志的方式經(jīng)網(wǎng)絡(luò)傳送到另一臺(tái)或多臺(tái) MySQL 從庫(kù)(Slave),然后在從庫(kù)上重放該日志,以達(dá)到和主庫(kù)數(shù)據(jù)同步的目的 。
MySQL 的復(fù)制模式分為異步復(fù)制、全同步復(fù)制及半同步復(fù)制三種 。下面將針對(duì)不同復(fù)制模式下的數(shù)據(jù)一致性問(wèn)題進(jìn)行詳細(xì)分析 。
異步復(fù)制(Asynchronous replication)
主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后會(huì)立即提交并返回,不關(guān)心從庫(kù)是否已經(jīng)接收到日志并處理 。如果此時(shí)主庫(kù)上已經(jīng)提交的事務(wù)因?yàn)槟承┰蛭磦魉偷綇膸?kù),同時(shí)主庫(kù)發(fā)生宕機(jī),且在此時(shí)從庫(kù)提升為主庫(kù),就會(huì)導(dǎo)致新主庫(kù)數(shù)據(jù)缺失,從而造成主從數(shù)據(jù)不一致的情況發(fā)生 。該復(fù)制模式下必然存在此問(wèn)題 。
主庫(kù)將事務(wù)寫(xiě)入到 Binlog 文件中,并通知 dump 線程發(fā)送這些新的 Binlog,然后主庫(kù)就會(huì)繼續(xù)處理提交操作,所以此時(shí)無(wú)法保證這些 Binlog 已經(jīng)成功傳到任何一個(gè)從庫(kù)節(jié)點(diǎn)上 。
全同步復(fù)制(Fully synchronous replication)
主庫(kù)執(zhí)行完一個(gè)事務(wù),且所有從庫(kù)都執(zhí)行了該事務(wù)才返回給客戶端 。因?yàn)樾枰却袕膸?kù)才能返回,所以事務(wù)的時(shí)間會(huì)被拉長(zhǎng),從而性能必然會(huì)受到較大影響 。
全同步是在 MySQL NDB Cluster 上采用的復(fù)制方式 。NDB 是分布式存儲(chǔ)引擎,無(wú)共享架構(gòu),嚴(yán)格來(lái)說(shuō) NDB 節(jié)點(diǎn)不是復(fù)制,而是 2PC,確保事務(wù)提交的強(qiáng)一致 。該集群在國(guó)內(nèi)使用極少,且存在較多問(wèn)題,不建議采用 。全復(fù)制會(huì)嚴(yán)重影響主庫(kù)的事務(wù)提交性能,對(duì)網(wǎng)絡(luò)要求非常嚴(yán)格,不適合同城、異地的架構(gòu)場(chǎng)景 。
半同步復(fù)制(Semisynchronous replication)
介于全同步復(fù)制與異步復(fù)制之間 。主庫(kù)需要等待至少一個(gè)從庫(kù)節(jié)點(diǎn)收到日志事件,并刷新 Binlog 到 Relay Log 文件中的 ACK 確認(rèn)消息后,才能提交并返回,主庫(kù)一般不需要等待所有從庫(kù)的 ACK 。注意 :該 ACK 是確保日志傳送到從庫(kù)并寫(xiě)入到中繼日志,而不是從庫(kù)已經(jīng)完成重放、將數(shù)據(jù)寫(xiě)入完成 。詳見(jiàn)圖 1 。
image
圖1 半同步復(fù)制模式
相對(duì)于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性,同時(shí)也帶來(lái)了一定程度的延遲,這個(gè)延遲最少是一個(gè) TCP/IP 往返的時(shí)間 。所以,半同步復(fù)制最好在低延時(shí)的網(wǎng)絡(luò)中使用 。
一般在實(shí)際生產(chǎn)中,我們把同城或同機(jī)房,網(wǎng)絡(luò)延遲小的(2ms 內(nèi))設(shè)置為半同步,對(duì)于異地延遲在 10ms 以上的,采用異步復(fù)制的方式 。
一般將 rpl_semi_sync_master_wait_for_slave_count 設(shè)置為1,在數(shù)據(jù)一致性的情況下,可以最大程度保證主庫(kù)事務(wù)處理的性能 。
MySQL 官方稱該復(fù)制模式為無(wú)損復(fù)制,從復(fù)制機(jī)制上看,的確會(huì)保證數(shù)據(jù)不丟失 。但真實(shí)情況是這樣嗎?下面我們從半同步的兩種復(fù)制形式進(jìn)行分析 。
1. 普通半同步 AFTER_COMMIT 。處理流程如下(見(jiàn)圖 2) 。首先要理解第三步引擎層提交的含義 。第三步完成后,由于主庫(kù)還未收到從庫(kù)返回的確認(rèn)信息,當(dāng)前會(huì)話一直無(wú)法完成并返回給客戶端,但主庫(kù)的其他會(huì)話已經(jīng)可以看到執(zhí)行的結(jié)果了 。如果按照事務(wù)隔離級(jí)別來(lái)理解,就相當(dāng)于對(duì)主庫(kù)的讀取出現(xiàn)了臟讀 。
image
圖2 普通半同步處理流程
例如 :你給小王轉(zhuǎn)賬 100 元,在步驟三完成后,小王會(huì)查詢到自己的余額多了 100 元 。但如果此時(shí)發(fā)生異常 :主庫(kù)宕機(jī),日志尚未發(fā)送到從庫(kù),且發(fā)生了主從切換,從庫(kù)提升為主庫(kù) 。那么因?yàn)橹暗霓D(zhuǎn)賬 100 元日志未發(fā)送到從庫(kù),小王再次查詢余額的時(shí)候,會(huì)發(fā)現(xiàn)之前已“到賬”的 100 元又不見(jiàn)了!
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- mysql數(shù)據(jù)庫(kù)怎么查看優(yōu)化 mysql數(shù)據(jù)庫(kù)查詢語(yǔ)句優(yōu)化
- 哪些筆記本可以更換顯卡 如何切換顯卡
- 創(chuàng)建數(shù)據(jù)庫(kù)的教程 免費(fèi)mysql數(shù)據(jù)庫(kù)空間
- 數(shù)據(jù)庫(kù)安裝教程 mysql服務(wù)器安裝配置
- 安裝mysql詳細(xì)步驟 如何下載mysql以及安裝
- 抖音怎么切換賬號(hào)、抖音怎么退出賬號(hào) 抖音怎么切換賬號(hào)不用退出原賬號(hào)
- 如何切換輸入法 電腦模式怎樣切換輸入法
- js控制div顯示隱藏實(shí)現(xiàn) jq點(diǎn)擊隱藏再點(diǎn)擊顯示切換
- 講解centos7安裝圖形化界面 centos可視化界面切換
- php增刪改查mysql實(shí)例 php操作數(shù)據(jù)庫(kù)的步驟
