背景:
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 信息
接下来,需要进入每个 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
然后进入新起的 pod 内,将当前节点设置为指定 master 节点的 slave 节点
redis-cli -c cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
可以看到,已恢复正常。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容