redis-cluster 集群节点故障,手动故障恢复方案

背景:

redis-cluster 部署到 k8s 集群中,且开启了持久化(local-path),某个时间,出现了节点故障,redis-cluster pod 出现 terminating 状态;

分析:当出现节点故障时,redis-cluster 会将 slave 节点 转为 master 节点,保证 redis-cluster 集群存在三主,保证其可用性;如何恢复三主三从呢,看下面解决方案。

解决方案:

  • 删去坏节点;
  • 加入新节点;
  • 从指主节点;

注:如果是不带 local-path 持久化的情况,除了 pv,pvc 操作,其他操作一致。

当节点出现故障时,查看哪些 redis-cluster pod 在故障节点上,需要执行

# 强制删除 terminating 状态的 pod
kubectl delete po redis-cluster-xx, redis-cluster-xx --grace-period=0 --force

# 删除故障节点上的 pv 及 pvc
kubectl get pv,pvc | grep redis-cluster
kubectl delete pv pvc-xxxx, pvc-xxxx
kubectl delete pvc redis-data-redis-cluster-xx, redis-data-redis-cluster-xx

此时,可以看到重新拉起的 redis-cluster pod 处于 Running 状态,但数量是 1/2。

进入 redis-cluster pod

# 进入 pod
kubectl exec -it redis-cluster-0 bash

# 查看 集群nodes
redis-cli -c cluster nodes

可以看到带 fail node 信息

redis-集群故障恢复

接下来,需要进入每个 pod 内,手动执行:

# 要进入所有 redis-cluster pod 内执行 "cluster forget"命令

# 进入 pod
kubectl exec -it redis-cluster-0 bash

# 删除
redis-cli -c cluster forget <node_id>
node_id 即 cluster nodes 结果第一列,示例:9d67889ab00f294aacac4eef28bacc9a793a469b

删除完成后,再次查看集群节点信息,值

# 先执行 cluster meet 命令,将新起的 pod 加入到 redis-cluster 集群中
redis-cli -c cluster meet <pod_ip> <pod_port>
示例:redis-cli -c cluster meet 10.233.64.17 6379

# 添加两个新起的 pod 后,查看当前集群节点信息
redis-cli -c cluster nodes

redis-集群故障恢复2

然后进入新起的 pod 内,将当前节点设置为指定 master 节点的 slave 节点

redis-cli -c cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。

redis-集群故障恢复3

redis-集群故障恢复4

可以看到,已恢复正常。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片