Redis故障转移

vij*_*jay 26 redis

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

Lin*_*iel 29

更新:

今天,我建议您查看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
}
Run Code Online (Sandbox Code Playgroud)

您可以使用例如动态编辑它们,而不是使用预定义的配置文件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
}
Run Code Online (Sandbox Code Playgroud)