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

How to reconnect Redis cluster nodes?

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

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

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

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

谢谢!

找到解决方案:

第一步是在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. 确保集群的 pods 稳定且不会崩溃。
  2. 在 pods 之一中手动编辑 nodes.conf。设置正确的 IP 而不是弃用的 IP。
  3. 重新启动您使用 redis-cli shutdown 编辑的广告连播。 Kubernetes 会为它设置一个新的 pod。新 pod 的 IP 将由我在上面添加的脚本设置。

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

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