【问题标题】:Redis Fail OverRedis 故障转移
【发布时间】:2012-02-10 06:47:17
【问题描述】:

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

【问题讨论】:

    标签: redis


    【解决方案1】:

    更新:

    今天,我建议查看 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
    }
    

    【讨论】:

    • 感谢 Linus,我已经在 redis 客户端中尝试过它的工作正常,但是如何在 redis conf 上即时更改相同的内容,是否有可用的脚本?谢谢
    • 太棒了!我不知道您使用哪个 redis 客户端库,但我猜它有一个 slaveof 命令。对于配置文件,每个服务器可以有两个配置,一个用于从属服务器,一个用于主服务器,以及它们之间的符号链接。
    【解决方案2】:

    我建议研究一下 Redis Cluster(3.2 版是今天最新的稳定版)。集群这是一种新方法,不再有哨兵。故障转移原理是一样的,slave 在 master 宕机的情况下提升为 master 加上新的更多功能,包括 Redis 支持的分片逻辑。应用程序只需要连接到具有一组节点的集群即可。

    如果我们谈论的是一般的故障转移,请注意,Redis 集群不保证强一致性。

    请从以下位置找到 sn-p: http://redis.io/topics/cluster-tutorial

    “Redis Cluster 无法保证强一致性。实际上这意味着在某些情况下,Redis Cluster 可能会丢失系统向客户端确认的写入。

    Redis Cluster 可能丢失写入的第一个原因是因为它使用异步复制。

    还有另一种值得注意的场景,即 Redis 集群会丢失写入,这种情况发生在网络分区期间,其中客户端与少数实例(包括至少一个主实例)隔离。”

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 2014-10-05
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2016-10-10
      • 2020-06-16
      相关资源
      最近更新 更多