首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除redis集群StatefulSet的Pod不能恢复redis的集群状态

删除redis集群StatefulSet的Pod不能恢复redis的集群状态
EN

Stack Overflow用户
提问于 2019-06-14 14:29:00
回答 1查看 772关注 0票数 0

我在我的statefulset中使用了redis:5.0.1-alpine,有状态集有6个pod,redis集群的形成是使用以下命令完成的

redis-cli --集群创建{IPlist放在这里}--集群副本1

现在,如果pods被意外删除或AKS停止服务,那么在AKS恢复创建时,pods将具有不同的IP。

我试着故意删除pod,当pod重新创建时,集群状态变为"fail“(集群最初创建时是"ok”)。

同样,当我尝试将旧数据集放入集群时,会出现一条消息,告诉我“集群已关闭”。

我已经展示了用于创建集群的redis.conf文件的代码

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster
  namespace: redis
data:
  update-node.sh: |
    #!/bin/sh
    REDIS_NODES="/data/nodes.conf"
    sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0- 
    9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
    exec "$@"
  redis.conf: |+
    cluster-enabled yes
    cluster-require-full-coverage no
    cluster-node-timeout 15000
    cluster-config-file /data/nodes.conf
    cluster-migration-barrier 1
    appendonly yes
    protected-mode no

issue description snapshot

redis cluster nodes and slots 群集节点和插槽相关的数据作为连接的Redis

EN

回答 1

Stack Overflow用户

发布于 2019-07-23 23:22:47

当您重新启动单个pod时,pod将使用新的IP启动,并将其发布到其他pod,它们都会根据IP更改更新其配置。

当所有pod同时关闭和打开时(例如集群中所有节点重启),pod之间无法通信,因为它们的nodes.conf中的IP是错误的。

一种可能的解决方案是更新所有正在运行的实例的nodes.conf中的is,并逐个重启它们。

我通过在每个pod中植入这个脚本来做到这一点:

recover-pod.sh

代码语言:javascript
复制
#!/bin/sh
set -e

REDIS_NODES_FILE="/data/nodes.conf"
for redis_node_ip in "$@"
do
  redis_node_id=`redis-cli -h $redis_node_ip -p 6379 cluster nodes | grep myself | awk '{print $1}'`
  sed -i.bak -e "/^$redis_node_id/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${redis_node_ip}/" ${REDIS_NODES_FILE}
done

并从Kubernetes节点之一运行它:

recover-cluster.sh

代码语言:javascript
复制
#!/bin/bash

for i in {0..5}
do
  echo "Updating the correct IPs in nodes.conf on redis-cluster-redis-cluster-statefulset-$i"
  kubectl exec -it redis-cluster-redis-cluster-statefulset-$i /readonly-config/recover-pod.sh $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP} ' )
done

kubectl patch statefulset redis-cluster-redis-cluster-statefulset --patch '{"spec": {"template": {"metadata": {"labels": {"date": "'`date +%s`'" }}}}}'

这会导致Redis集群恢复健康状态。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56592603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档