0

我有一个包含 6 个节点的 Redis 集群,在我的 Kubernetes 集群中作为有状态集运行。由于它是用于测试而不是生产,所有 Redis 节点都在同一台机器上。当然,机器出了故障,Redis 的所有节点都立即崩溃了。当机器恢复运行时,pod 被重新创建并被赋予不同的集群 ip,因此它们无法重新相互连接。

我需要为这样的灾难案例找到解决方案。假设所有节点都重新分配了不同的 ip,我该如何配置节点以访问其他 ip?

从站很容易使用 CLUSTER RESET 命令重置,但主站包含不应删除的插槽和数据。

我应该手动重写nodes.conf吗?恐怕这会让事情变得更糟?我有一个已知的方法来处理它吗?

谢谢!

4

2 回答 2

1

找到了解决方案:

第一步是在 pod 启动时在 nodes.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 启动命令传递给它来启动任何 pod。

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

  1. 确保集群的 pod 稳定且不会崩溃。
  2. 在其中一个 pod 中手动编辑 nodes.conf。设置正确的 IP 而不是弃用的 IP。
  3. 重新启动您编辑过的 pod redis-cli shutdown。Kubernetes 将为它设置一个新的 pod。新 pod 的 IP 将由我在上面添加的脚本设置。
于 2019-02-15T14:13:35.873 回答
-1

在我看来,在应用程序中的任何位置引用 Redis 集群时,根本不应该依赖 Pod 的内部 IP 地址。豆荚是会死的,这意味着它们被设计为崩溃。因此,当节点死亡时,它们也会被销毁。当节点复活时,POD 会使用新的 IP 地址重新创建。

如果您将 Redis 集群创建为有状态应用程序,则 定位您的 POD 的正确方法是通过它们的 DNS 名称(如此处所述)。

于 2019-02-15T16:52:24.843 回答