MySQL主從如何保證高可用

什么時(shí)候是主備切換的最佳時(shí)機(jī)?
主從延遲越小越好。
如何查看備庫(kù)的同步延遲?
-- 在slave上執(zhí)行以下命令
show slave status\G

上圖返回結(jié)果中包含一個(gè)seconds_behind_master字段,用于表示當(dāng)前備庫(kù)延遲了多少秒。
seconds_behind_master的計(jì)算邏輯
- 每個(gè)事務(wù)的binlog里面都有一個(gè)時(shí)間字段,用于記錄主庫(kù)上的寫(xiě)入時(shí)間
 - 備庫(kù)取出當(dāng)前正在執(zhí)行的事務(wù)的時(shí)間字段的值,計(jì)算它與當(dāng)前系統(tǒng)時(shí)間的差值,得到seconds_behind_master
 - 備庫(kù)在連接到主庫(kù)時(shí),會(huì)通過(guò)執(zhí)行select unix_timestamp()函數(shù)獲取主庫(kù)的系統(tǒng)時(shí)間,如果發(fā)現(xiàn)主庫(kù)和自己的時(shí)間不一致,備庫(kù)在計(jì)算seconds_behind_master會(huì)自動(dòng)扣掉這個(gè)差值
 
什么情況下會(huì)發(fā)生主備切換?
- 主動(dòng)運(yùn)維操作
 - 主庫(kù)意外宕機(jī)
 
主備延遲的原因?
- 備庫(kù)機(jī)器配置較低
 - 備庫(kù)壓力大(比如在備庫(kù)上執(zhí)行一些占用資源的運(yùn)營(yíng)報(bào)表分析)
 - 大事務(wù)
 - 備庫(kù)的并行復(fù)制能力
 
主備切換策略由哪幾種?
- 可靠性?xún)?yōu)先策略
 - 可用性?xún)?yōu)先策略
 
什么是可靠性?xún)?yōu)先策略?
可靠性?xún)?yōu)先策略?xún)?yōu)先保證數(shù)據(jù)的可靠性,通常由專(zhuān)門(mén)HA系統(tǒng)實(shí)現(xiàn)。
可靠性?xún)?yōu)先策略下的主備切換邏輯
- 判斷Slave B現(xiàn)在的seconds_behind_master,如果小于某個(gè)值(比如5s)繼續(xù)下一步,否則重試這一步
 - 把Master A修改為只讀狀態(tài)
 - 判斷Slave B的seconds_behind_master的值,直到這個(gè)值變?yōu)?為之
 - 把Slave B改為可讀寫(xiě)狀態(tài)
 - 把業(yè)務(wù)請(qǐng)求切到備庫(kù)B,此時(shí)Slave B就正式晉升為主庫(kù)
 
可靠性?xún)?yōu)先策略假設(shè)主從延遲很大,無(wú)法快速切換,主節(jié)點(diǎn)又不可用,這將會(huì)導(dǎo)致服務(wù)長(zhǎng)時(shí)間的不可用。
可用性?xún)?yōu)先策略
可用性?xún)?yōu)先策略是不再等待主從同步完成,如果主節(jié)點(diǎn)一旦宕機(jī),立馬進(jìn)行切換,但是此時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)一致性問(wèn)題。
尤其是當(dāng)binlog模式是statement或者mixed模式下的時(shí)候,很容易造成數(shù)據(jù)不一致。如果binlog模式是ROW模式,由于記錄的是某個(gè)行記錄的全字段,在插入數(shù)據(jù)的時(shí)候可能會(huì)因?yàn)橹麈I沖突,使得同步線(xiàn)程報(bào)錯(cuò)并停止。
在實(shí)際使用中,我更建議使用可靠性?xún)?yōu)先策略,畢竟對(duì)于數(shù)據(jù)服務(wù)來(lái)說(shuō),數(shù)據(jù)可靠性重要程度要高于可用性。















 
 
 















 
 
 
 