1. 程式人生 > >【case study】兩個redis cluster集群拓撲混掉故障處理

【case study】兩個redis cluster集群拓撲混掉故障處理

交換 node cluster -i cas 處理過程 基本 背景 相同

【背景】

XXX服務,前後使用了兩個redis cluster集群:集群A(2018.1.23前使用,在1.23之後沒有流量,但是服務沒停),集群B(2018.1.23後使用)。

【原因】

根本原因:兩個集群使用相同的實例,導致兩個集群的拓撲信息互相傷害拓撲亂掉

誘因:老集群下線流程有誤,服務未停,卻把記錄服務實例信息的db數據刪除了

恢復緩慢原因:缺少處理cluster的工具&經驗,臨時寫腳本處理

【過程】

1、給集群B增加新的redis實例(其中選出了和集群A相同的ip和port)

2、啟動集群B的新實例失敗,發現和集群B的某個實例相同的ip和port

3、停掉集群A的具有相同ip和port的實例,集群A的相應實例起來(目前集群B還未將該實例加入自己集群,該實例目前與集群A的其他實例通信)

4、對集群B操作同步拓撲信息(將上訴實例加入了集群B,上訴實例與集群B中的其他實例相互交換拓撲信息)

5、集群B中的主都把自己作為了集群A中實例的從,開始主從同步,集群崩潰

【處理過程】

1、停掉集群A的所有實例

2、強制提升集群B中的相應實例為主(cluster failover takeover -> 將某個從強制提升為主且不與其他實例通信)

3、修復拓撲狀態,檢查slot分配,給沒有分配master的slot分配master(cluster setslot <slot> node <node-id> -> 發給每個主分配slot信息)

4、給缺少slave的master掛上slave(cluster replicate ip port)

【改進方案】

1、完善集群下線流程:1)避免刪除集群基本信息;2)下線集群時停掉服務(停服務發現、檢查流量、停服務、註銷systemd)

2、針對cluster的拓撲修復,提供工具:1)集群拓撲比較工具,找出拓撲不一致的實例;2)批量將實例踢出集群;3)批量提升實例為主??

【思考】

對於redis cluster這種無中心的架構來說,如果拓撲信息不一致了,如何修復信息確實是挺麻煩的。想到好的方式後,後續補充。

【case study】兩個redis cluster集群拓撲混掉故障處理