我们已经为Redis服务器配置了一个主服务器和两个从服务器。如果我的主服务器出现故障,我们如何在不重新启动Redis服务器的情况下处理故障转移。
答案 0 :(得分:30)
<强>更新强>
今天,我建议您查看redis-sentinel,这是Redis的作者antirez用于监控和自动故障转移的工具。
原始回复:
检查SLAVEOF
命令:http://redis.io/commands/slaveof
当您发现主人失败时,请在您的某个奴隶上发出SLAVEOF NO ONE
以宣传其掌握。然后将你的另一个奴隶指向它的新主人。另请参阅“在不停机的情况下升级或重新启动Redis实例”:http://redis.io/topics/admin
对于管理配置文件,您可以按照这些方式执行某些操作(注意:未经测试,仅作为示例)。下面的示例假设每个服务器有两个配置文件(/etc/redis/server1.master.conf
,/etc/redis/server1.slave.conf
等),其中一个服务器作为某个预定义主服务器的从属服务器:
#!/bin/sh
master()
{
server_name=$1
redis-cli slaveof no one
ln -sf /etc/redis/$server_name.master.conf /etc/redis/$server_name.conf
}
# Usage: slave(server1 server2 6379)
slave()
{
server_name=$1
master=$2
master_port=$3
redis-cli slaveof $master $master_port
ln -sf /etc/redis/$server_name.slave.conf /etc/redis/$server_name.conf
}
您可以动态编辑它们,而不是使用预定义的配置文件。 sed
。基本上,您需要确保在配置文件中始终有slaveof
节,指向主节点或slaveof no one
。然后使用sed
重写配置(再次,未经测试,仅作为思考的食物):
#!/bin/sh
master()
{
server_name=$1
config=$server_name.conf
redis-cli slaveof no one
sed -i "s/^slaveof.*/slaveof no one/" $config
}
# Usage: slave(server1 server2 6379)
slave()
{
server_name=$1
config=$server_name.conf
master=$2
master_port=$3
redis-cli slaveof $master $master_port
sed -i "s/^slaveof.*/slaveof $master $master_port/" $config
}
答案 1 :(得分:2)
我建议您查看Redis Cluster(3.2版本,最新稳定版)。群集这是一种新方法,不再是哨兵。故障转移原理是相同的,在主服务器关闭的情况下奴隶提升为主服务器以及新的更多功能,包括Redis支持的分片逻辑。应用程序只需要连接到具有一组节点的集群即可。
如果我们谈论一般故障转移,请注意,Redis Cluster不保证强一致性。
请从以下网址找到摘录: http://redis.io/topics/cluster-tutorial
&#34; Redis Cluster无法保证强一致性。实际上,这意味着在某些条件下,Redis Cluster可能会丢失系统向客户端确认的写入。
Redis群集丢失写入的第一个原因是它使用异步复制。
还有另一个值得注意的情况是,Redis群集将丢失写入,这种情况发生在网络分区中,其中客户端与少数实例(至少包括主服务器)隔离。&#34;