如何重新连接Redis集群节点?

时间:2019-02-15 10:58:33

标签: redis kubernetes redis-cluster kubernetes-statefulset

我有一个由6个节点组成的Redis集群,作为状态集在我的Kubernetes集群中运行。由于它是用于测试且尚未投入生产,因此所有Redis节点都在同一台机器上。当然,机器出现故障,Redis的所有节点立即崩溃。 当计算机恢复运行时,将重新创建Pod,并为其分配了不同的群集ip,因此它们无法彼此重新连接。

我需要找到针对此类灾难案例的解决方案。假设所有节点都重新分配了不同的ip,如何配置这些节点以获取其他ip?

通过CLUSTER RESET命令可以很容易地重置从站,但是主站包含不应删除的插槽和数据。

我应该手动重写nodes.conf吗?恐怕会使情况变得更糟?我有一种已知的处理方法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

找到了解决方案:

第一步是在Pod启动时在node.conf中更改当前Pod ip。您可以使用此脚本来实现

#!/bin/sh
    CLUSTER_CONFIG="/data/nodes.conf"
    if [ -f ${CLUSTER_CONFIG} ]; then
      if [ -z "${POD_IP}" ]; then
        echo "Unable to determine Pod IP address!"
        exit 1
      fi
      echo "Updating my IP to ${POD_IP} in ${CLUSTER_CONFIG}"
      sed -i.bak -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${CLUSTER_CONFIG}
    fi
    exec "$@"

您应该通过调用此脚本并将原始的redis-server start命令传递给该脚本来启动任何pod。

现在群集中的每个Pod都已设置了正确的IP。

  1. 确保群集的Pod稳定且不会崩溃。
  2. 在其中一个窗格中手动编辑nodes.conf。设置正确的IP而不是已弃用的IP。
  3. 使用redis-cli shutdown重新启动您已编辑的窗格。 Kubernetes将为此设置一个新的pod。新的Pod的IP将由我在上面添加的脚本设置。

答案 1 :(得分:0)

我认为,在应用程序中任何位置引用Redis集群时,您都不应完全依赖Pods的内部IP地址。豆荚是致命的,这意味着它们被设计成会崩溃的。因此,当节点死亡时,它们也会被破坏。当节点复活时,将使用新的IP地址重新创建POD。

如果您将Redis集群创建为有状态应用程序,则将POD作为目标的正确方法是通过其DNS名称(如here所述)。