我有一个包含 6 个节点的 Redis 集群,作为有状态集在我的 Kubernetes 集群中运行。由于它是用于测试而不是生产,所有的 Redis 节点都在同一台机器上。当然,机器出了故障,Redis 的所有节点都立即崩溃了。 当机器恢复正常时,pods 被重新创建并被赋予不同的集群 ip,因此它们无法相互重新连接。
我需要为这样的灾难案例找到解决方案。假设所有节点都重新分配了不同的 ip,我如何配置节点以获取其他 ip?
slaves 很容易用 CLUSTER RESET 命令重置,但是 masters 包含不应该被删除的槽和数据。
我应该手动重写 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。
- 确保集群的 pod 稳定且不会崩溃。
- 在其中一个 pod 中手动编辑 nodes.conf。设置正确的 IP 而不是弃用的 IP。
- 使用
redis-cli shutdown
重新启动您编辑的 pod。 Kubernetes 会为它设置一个新的 pod。新 pod 的 IP 将由我在上面添加的脚本设置。
关于redis - 如何重新连接Redis集群节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54707843/