【发布时间】:2012-02-10 06:47:17
【问题描述】:
我们已经为 Redis 服务器配置了一个主服务器和两个从服务器。如果我的master出现故障,不重启Redis服务器如何处理故障转移。
【问题讨论】:
标签: redis
我们已经为 Redis 服务器配置了一个主服务器和两个从服务器。如果我的master出现故障,不重启Redis服务器如何处理故障转移。
【问题讨论】:
标签: redis
更新:
今天,我建议查看 redis-sentinel,这是 Redis 的作者 antirez 的一个用于监控和自动故障转移的工具。
原回复:
查看SLAVEOF 命令:http://redis.io/commands/slaveof
当您发现您的 master 失败时,请在您的一个 slave 上发出 SLAVEOF NO ONE 以将其提升为 master。然后将你的另一个奴隶指向它的新主人。另请参阅“升级或重启 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
}
【讨论】:
slaveof 命令。对于配置文件,每个服务器可以有两个配置,一个用于从属服务器,一个用于主服务器,以及它们之间的符号链接。
我建议研究一下 Redis Cluster(3.2 版是今天最新的稳定版)。集群这是一种新方法,不再有哨兵。故障转移原理是一样的,slave 在 master 宕机的情况下提升为 master 加上新的更多功能,包括 Redis 支持的分片逻辑。应用程序只需要连接到具有一组节点的集群即可。
如果我们谈论的是一般的故障转移,请注意,Redis 集群不保证强一致性。
请从以下位置找到 sn-p: http://redis.io/topics/cluster-tutorial
“Redis Cluster 无法保证强一致性。实际上这意味着在某些情况下,Redis Cluster 可能会丢失系统向客户端确认的写入。
Redis Cluster 可能丢失写入的第一个原因是因为它使用异步复制。
还有另一种值得注意的场景,即 Redis 集群会丢失写入,这种情况发生在网络分区期间,其中客户端与少数实例(包括至少一个主实例)隔离。”
【讨论】: