1、復(fù)制過(guò)程:
主庫(kù)執(zhí)行sql時(shí),將事務(wù)日志存儲(chǔ)到二進(jìn)制日志文件(binlog)中,
并將binlog發(fā)送給從庫(kù),從庫(kù)將會(huì)開(kāi)啟兩個(gè)線程,一個(gè)線程將獲取
到的binlog轉(zhuǎn)存為中繼日志(relaylog),另一個(gè)線程對(duì)relaylog中
的事件進(jìn)行重放。
2、主從同步的類(lèi)型:
(1)全同步復(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)景。
(2)半同步復(fù)制(Semisynchronous replication)
主庫(kù)需要等待至少一個(gè)從庫(kù)節(jié)點(diǎn)收到日志事件,并刷新 Binlog 到 Relay Log 文件中的 ACK 確認(rèn)消息后,才能提交并返回,主庫(kù)一般不需要等待所有從庫(kù)的 ACK。注意 :該 ACK 是確保日志傳送到從庫(kù)并寫(xiě)入到中繼日志,而不是從庫(kù)已經(jīng)完成重放、將數(shù)據(jù)寫(xiě)入完成。
(3)異步復(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)上。
轉(zhuǎn)載自:http://www.itdecent.cn/p/380e7b4c4584