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