Redis Fail Over

Мы настроили сервер Redis с одним ведущим и двумя ведомыми. Если мой мастер выйдет из строя, как нам справиться с обходом отказа без перезапуска сервера Redis.

26
задан Rodrigue 22 May 2012 в 17:00
поделиться

1 ответ

Обновление:

Сегодня я бы порекомендовал проверить 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
}
29
ответ дан 28 November 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: