一.背景
Greenplum的架構(gòu)中協(xié)調(diào)節(jié)點(diǎn)的高可用性是通過主從方式實(shí)現(xiàn)。Greenplum支持master自動(dòng)故障轉(zhuǎn)移,以及當(dāng)故障沒有自動(dòng)轉(zhuǎn)移的場(chǎng)景,需要人工介入進(jìn)行故障處理和恢復(fù)。
二.故障轉(zhuǎn)移流程
1. 單點(diǎn)故障
Master自動(dòng)故障轉(zhuǎn)移可以處理單點(diǎn)故障,當(dāng)master, standby , master probe segment其中一個(gè)發(fā)生故障對(duì)應(yīng)的場(chǎng)景說明如下。
1.1. Master故障 , standby和master probe正常
當(dāng)不支持自動(dòng)故障轉(zhuǎn)移,集群不可用,需要人工 gpactivatestandby?

當(dāng)支持自動(dòng)故障轉(zhuǎn)移,master probe 將自動(dòng)激活standby.

當(dāng)stanby成為新的master,需要完成如下步驟:?
(1) 通過gpinitstandby, 啟動(dòng)原來的master作為standby 。
(2) 原來的master和當(dāng)前的master,角色倒換。(目前沒有合適的命令,只能通過如下,多次命令操作,如master:host1,standyby:host2)
i) host2上操作,pg_ctl stop -D /data01/gpadmin/gpdata/master/gpseg-1/ ? ?//停服務(wù)
ii)重命名目錄:
cd /data01/gpadmin/gpdata/master
mv gpseg-1 gpseg-1_bak
cd /data01/gpadmin/gpdata/master
mv gpseg-1 gpseg-1_bak
iii)現(xiàn)在的standby host1
gpactivatestandby -d /data01/gpadmin/gpdata/master/gpseg-1 ? //激活standby
gpinitstandby ?-s host2? ?//添加standby
1.2. Standby故障 , master和master probe 正常
當(dāng)不支持自動(dòng)故障轉(zhuǎn)移synchronous_standby_names為空 ,集群正常運(yùn)行。
當(dāng)不支持自動(dòng)故障轉(zhuǎn)移synchronous_standby_names 是 *, 集群正常運(yùn)行,寫事務(wù)阻塞,直到手工unblocked。

當(dāng)支持自動(dòng)故障轉(zhuǎn)移master probe保存standby out-of-sync信息到segment catalog 并unblock 寫。

當(dāng)人工修復(fù)故障,重新啟動(dòng)standby.?
1.3. master probe segment故障, master和standby正常
master probe支持自動(dòng)故障轉(zhuǎn)移,需要結(jié)合具體情況,一般GP自動(dòng)指派一個(gè)新的活動(dòng)segment作為 master probe 。

2. 2個(gè)角色故障
發(fā)生2個(gè)角色故障,需要做如下操作恢復(fù)集群。
2.1. Master和standby同時(shí)故障
如果發(fā)生故障master可以啟動(dòng),通過gpstart 恢復(fù)集群;如果只有standby能夠啟動(dòng),可以通過 gpactivatestandby 把standby變成master。

如果gpactivatestandby把standby變成mater失敗,可以通過gpactivatestandby -f 把standby強(qiáng)制變成mater,但會(huì)存在數(shù)據(jù)一致性的風(fēng)險(xiǎn)。
2.2. Master和master probe同時(shí)故障
如果master probe segment能夠正常啟動(dòng),按照流程2.1 嘗試首先把standby變成master。,如果不行,需要通過gpactivatestandby -f?把standby強(qiáng)制變成mater,但會(huì)存在數(shù)據(jù)一致性的風(fēng)險(xiǎn)。
2.3. Standby和master probe同時(shí)故障
(1) 需要以維護(hù)方式(utility mode)連接master probe segment ,并標(biāo)記不一致 或在standby數(shù)據(jù)目錄中創(chuàng)建promote.deny文件 ,阻止gpactivatestandby運(yùn)行,導(dǎo)致數(shù)據(jù)不一致,知道第2步操作完成。
(2) 可以通過gpconfig設(shè)置master synchronous_standby_names為空,然后master繼續(xù)服務(wù)集群。?
三.參考資料
https://github.com/greenplum-db/gpdb/wiki/Master-standby-failover-workflow