【问题标题】:How to reconnect Redis cluster nodes?如何重新连接 Redis 集群节点?
【发布时间】:2019-07-09 12:13:27
【问题描述】:
我有一个包含 6 个节点的 Redis 集群,在我的 Kubernetes 集群中作为有状态集运行。由于它是用于测试而不是生产,所有 Redis 节点都在同一台机器上。当然,机器出了故障,Redis 的所有节点都立即崩溃了。
当机器恢复运行时,pod 被重新创建并被赋予不同的集群 ip,因此它们无法重新相互连接。
我需要为这样的灾难案例找到解决方案。假设所有节点都重新分配了不同的 ip,如何配置节点以获取其他 ip?
使用 CLUSTER RESET 命令很容易重置从站,但主站包含不应删除的插槽和数据。
我应该手动重写nodes.conf吗?恐怕这会让事情变得更糟?我有已知的处理方法吗?
谢谢!
【问题讨论】:
标签:
redis
kubernetes
redis-cluster
kubernetes-statefulset
【解决方案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。
- 确保集群的 pod 稳定且不会崩溃。
- 在其中一个 pod 中手动编辑 nodes.conf。设置正确的 IP 而不是弃用的 IP。
- 重新启动您使用
redis-cli shutdown 编辑的窗格。 Kubernetes 将为它设置一个新的 pod。新 pod 的 IP 将由我在上面添加的脚本设置。
【解决方案2】:
在我看来,当您在应用程序的任何位置引用您的 Redis 集群时,您根本不应该依赖 Pod 的内部 IP 地址。豆荚是会死的,这意味着它们被设计为崩溃。因此,当节点死亡时,它们也会被销毁。当节点复活时,会使用新的 IP 地址重新创建 POD。
如果您将 Redis 集群创建为有状态应用程序,则定位 POD 的正确方法是通过其 DNS 名称(如 here 所述)。