【case study】兩個redis cluster集群拓撲混掉故障處理
【背景】
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集群拓撲混掉故障處理