2012-02-10 112 views
26

我们已经为Redis服务器配置了一个主服务器和两个从服务器。如果我的主服务器出现故障,我们如何处理故障切换而无需重新启动Redis服务器。Redis故障切换

回答

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配置(同样,没有测试,就意味着作为深思):(3.2版本为最新的稳定今天)

#!/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 
} 
+0

感谢莱纳斯,我曾尝试在Redis的客户其工作正常,但如何改变同样在上飞的Redis的conf,是否有可用的任何脚本?谢谢 – vijay 2012-02-13 04:28:53

+0

太棒了!我不t知道你使用了哪个redis客户端库,但我猜它有一个'slaveof'命令。对于配置文件,你可以为每个服务器配置两个配置,一个用于slave,一个用于master,以及它们之间的符号链接。 – 2012-02-13 12:25:20

1

我会建议寻找到的Redis集群。集群这是一种新方法,不再哨兵。故障切换的原理是一样的,从设备在主设备停机的情况下提升主设备的性能,并增加新的功能,包括Redis支持的分条逻辑。应用程序只需要连接到具有一组节点的集群,就是这样。

如果我们正在谈论一般故障切换,请注意,Redis集群不保证高度一致性。

请找到片段来自: http://redis.io/topics/cluster-tutorial

“的Redis集群是不能够保证强一致性具体而言,这意味着,在一定条件下有可能Redis的集群将丢失是写操作。通过系统给客户确认。

的第一个原因的Redis集群可以输写是因为它使用异步复制。

还有一个值得注意的场景,Redis集群将丢失写入,这发生在网络分区中,客户端与包含至少一个主控的少数实例隔离。“