我们已经为Redis服务器配置了一主两备。如果我的主机出现故障,我们如何在不重启Redis服务器的情况下处理故障转移。
发布于 2012-02-10 20:42:03
更新:
今天,我推荐使用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
对其进行动态编辑。基本上,您应该确保在配置文件中始终有一个指向master或slaveof no one
的slaveof
节。然后使用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
}
发布于 2016-09-02 03:06:42
我建议您研究一下Redis Cluster ( 3.2版本是目前最新的稳定版本)。集群这是一种新的方法,不再有前哨。故障转移原理相同,在master宕机的情况下,slave升级到master,加上Redis支持的包括分片逻辑在内的更多新功能。应用程序只需要连接到具有一组节点的集群,仅此而已。
如果我们谈论的是一般的故障转移,请注意,Redis集群不保证强一致性。
请从以下位置找到代码片段:http://redis.io/topics/cluster-tutorial
"Redis集群不能保证强一致性。实际上,这意味着在某些情况下,Redis集群可能会丢失系统向客户端确认的写入。
Redis集群可能丢失写入的第一个原因是因为它使用异步复制。
还有另一个值得注意的场景,Redis集群将丢失写入,这发生在网络分区期间,其中客户端与少数实例隔离,其中至少包括一个主实例。
https://stackoverflow.com/questions/9223840
复制相似问题