Мы настроили сервер Redis с одним ведущим и двумя ведомыми. Если мой мастер выйдет из строя, как нам справиться с обходом отказа без перезапуска сервера Redis.
Обновление:
Сегодня я бы порекомендовал проверить 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
}