RabbitMQ鏡像隊列集群的恢復的解決方案和應用場景:
前提:比如兩個節(jié)點A和B組成一個鏡像隊列
場景1: A先停, B后停
方案1: 該場景下B是Master,只要先啟動B,再啟動A即可?;蛘呦葐覣,再30秒之內(nèi)啟動B接口恢復鏡像隊列
場景2: A、B同時停機
方案2:該場景可能由于機房斷電等原因造成的,只需在30秒之內(nèi)連續(xù)啟動A和B即可恢復鏡像
場景3:A先停,B后停,且A無法恢復
方案3: 該場景是1場景的加強版,因為B是Master,所以等B起來以后,在B節(jié)點調(diào)用控制臺命令:rabbitmqctl forget_cluster_node A解除與A的Cluster關(guān)系,再將新的Slave節(jié)點加入B即可重新恢復鏡像隊列
場景4: A先停,B后停,且B無法恢復
方案4:該場景是場景3的加強版,比較難處理,原因是因為Master節(jié)點無法恢復,早在3.1x時代之前沒有什么好的解決方案,但是現(xiàn)在已經(jīng)有解決方案了,在3.4.2以后的版本。因為B是主節(jié)點,所有直接啟動A是不行的,當A無法啟動的時候,也就沒辦法在A節(jié)點上調(diào)用之前的rabbitmqctl forget_cluster_node B命令了。新版本中forget_cluster_node支持--offline參數(shù)
這就意味著允許rabbitmqctl在理想節(jié)點上執(zhí)行該命令,迫使RabbitMQ在未啟動Slave節(jié)點中選擇一個節(jié)點作為Master。當在A節(jié)點執(zhí)行 rabbitmqctl forget_cluster_node --offline B時,RabbitMQ會mock一個節(jié)點代表A,執(zhí)行 forget_cluster_node命令將B剔除cluster,然后A就可以正常的啟動了,最后將新的Slave節(jié)點加入A即可恢復鏡像隊列
場景5:A先停、B后停,且A、B均無法恢復,但是能得到A或B的磁盤文件
方案5:這種場景更加難處理,只能通過恢復數(shù)據(jù)的方式去嘗試恢復,將A與B的數(shù)據(jù)文件模式在$RABBIT_HOME/var/lib/目錄中,把它拷貝到新的節(jié)點對應的mulxia,再將新的節(jié)點hostname改成A或B的hostname,如果是A節(jié)點(Slave)的磁盤文件,則按照場景4處理即可,如果是B節(jié)點(Master)的磁盤文件,則按照場景3處理即可,最后新的Slave加入新節(jié)點后完成恢復。
場景6:A先停、B后停,且A、B均無法恢復,且得不到A和B的磁盤文件
恩,你可以直接跑路了o(╯□╰)o