Redis故障转移

时间:2012-02-10 06:47:18

标签: redis

我们已经为Redis服务器配置了一个主服务器和两个从服务器。如果我的主服务器出现故障,我们如何在不重新启动Redis服务器的情况下处理故障转移。

2 个答案:

答案 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;