RabbitMQ鏡像隊(duì)列集群的恢復(fù)的解決方案和應(yīng)用場(chǎng)景:
前提:比如兩個(gè)節(jié)點(diǎn)A和B組成一個(gè)鏡像隊(duì)列
場(chǎng)景1: A先停匿情, B后停
方案1: 該場(chǎng)景下B是Master,只要先啟動(dòng)B骚秦,再啟動(dòng)A即可。或者先啟動(dòng)A纸兔,再30秒之內(nèi)啟動(dòng)B接口恢復(fù)鏡像隊(duì)列
場(chǎng)景2: A疮蹦、B同時(shí)停機(jī)
方案2:該場(chǎng)景可能由于機(jī)房斷電等原因造成的诸迟,只需在30秒之內(nèi)連續(xù)啟動(dòng)A和B即可恢復(fù)鏡像
場(chǎng)景3:A先停,B后停,且A無(wú)法恢復(fù)
方案3: 該場(chǎng)景是1場(chǎng)景的加強(qiáng)版阵苇,因?yàn)锽是Master壁公,所以等B起來(lái)以后,在B節(jié)點(diǎn)調(diào)用控制臺(tái)命令:rabbitmqctl forget_cluster_node A
解除與A的Cluster關(guān)系绅项,再將新的Slave節(jié)點(diǎn)加入B即可重新恢復(fù)鏡像隊(duì)列
場(chǎng)景4: A先停紊册,B后停,且B無(wú)法恢復(fù)
方案4:該場(chǎng)景是場(chǎng)景3的加強(qiáng)版趁怔,比較難處理湿硝,原因是因?yàn)镸aster節(jié)點(diǎn)無(wú)法恢復(fù),早在3.1x時(shí)代之前沒(méi)有什么好的解決方案润努,但是現(xiàn)在已經(jīng)有解決方案了关斜,在3.4.2以后的版本。因?yàn)锽是主節(jié)點(diǎn)铺浇,所有直接啟動(dòng)A是不行的痢畜,當(dāng)A無(wú)法啟動(dòng)的時(shí)候,也就沒(méi)辦法在A節(jié)點(diǎn)上調(diào)用之前的rabbitmqctl forget_cluster_node B
命令了鳍侣。新版本中forget_cluster_node
支持--offline參數(shù)
這就意味著允許rabbitmqctl在理想節(jié)點(diǎn)上執(zhí)行該命令丁稀,迫使RabbitMQ在未啟動(dòng)Slave節(jié)點(diǎn)中選擇一個(gè)節(jié)點(diǎn)作為Master。當(dāng)在A節(jié)點(diǎn)執(zhí)行 rabbitmqctl forget_cluster_node --offline B
時(shí)倚聚,RabbitMQ會(huì)mock一個(gè)節(jié)點(diǎn)代表A线衫,執(zhí)行 forget_cluster_node
命令將B剔除cluster,然后A就可以正常的啟動(dòng)了惑折,最后將新的Slave節(jié)點(diǎn)加入A即可恢復(fù)鏡像隊(duì)列
場(chǎng)景5:A先停授账、B后停,且A惨驶、B均無(wú)法恢復(fù)白热,但是能得到A或B的磁盤文件
方案5:這種場(chǎng)景更加難處理,只能通過(guò)恢復(fù)數(shù)據(jù)的方式去嘗試恢復(fù)粗卜,將A與B的數(shù)據(jù)文件模式在$RABBIT_HOME/var/lib/目錄中屋确,把它拷貝到新的節(jié)點(diǎn)對(duì)應(yīng)的mulxia,再將新的節(jié)點(diǎn)hostname改成A或B的hostname续扔,如果是A節(jié)點(diǎn)(Slave)的磁盤文件攻臀,則按照?qǐng)鼍?處理即可,如果是B節(jié)點(diǎn)(Master)的磁盤文件测砂,則按照?qǐng)鼍?處理即可茵烈,最后新的Slave加入新節(jié)點(diǎn)后完成恢復(fù)。
場(chǎng)景6:A先停砌些、B后停呜投,且A加匈、B均無(wú)法恢復(fù),且得不到A和B的磁盤文件
恩仑荐,你可以直接跑路了o(╯□╰)o