我有一个由6个节点组成的Redis集群,作为状态集在我的Kubernetes集群中运行。由于它是用于测试且尚未投入生产,因此所有Redis节点都在同一台机器上。当然,机器出现故障,Redis的所有节点立即崩溃。 当计算机恢复运行时,将重新创建Pod,并为其分配了不同的群集ip,因此它们无法彼此重新连接。
我需要找到针对此类灾难案例的解决方案。假设所有节点都重新分配了不同的ip,如何配置这些节点以获取其他ip?
通过CLUSTER RESET命令可以很容易地重置从站,但是主站包含不应删除的插槽和数据。
我应该手动重写nodes.conf吗?恐怕会使情况变得更糟?我有一种已知的处理方法吗?
谢谢!
答案 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。
redis-cli shutdown
重新启动您已编辑的窗格。 Kubernetes将为此设置一个新的pod。新的Pod的IP将由我在上面添加的脚本设置。答案 1 :(得分:0)
我认为,在应用程序中任何位置引用Redis集群时,您都不应完全依赖Pods的内部IP地址。豆荚是致命的,这意味着它们被设计成会崩溃的。因此,当节点死亡时,它们也会被破坏。当节点复活时,将使用新的IP地址重新创建POD。
如果您将Redis集群创建为有状态应用程序,则将POD作为目标的正确方法是通过其DNS名称(如here所述)。