Redis Fail Over - PullRequest
       4

Redis Fail Over

26 голосов
/ 10 февраля 2012

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

Ответы [ 2 ]

29 голосов
/ 10 февраля 2012

Обновление:

Сегодня я бы порекомендовал проверить 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
}
2 голосов
/ 01 сентября 2016

Я бы порекомендовал посмотреть на Redis Cluster (версия 3.2 как последняя стабильная на сегодня).Кластер - это новый подход, больше нет часовых.Принцип аварийного переключения такой же, что и слэйв повышает уровень мастерства в случае сбоя мастера плюс новые дополнительные функции, включая логику разделения, поддерживаемую Redis.Приложение просто должно подключиться к кластеру с набором узлов, вот и все.

Если мы говорим об общем отказоустойчивости, имейте в виду, Redis Cluster не гарантирует строгой согласованности.

Пожалуйста, найдитефрагмент из: http://redis.io/topics/cluster-tutorial

"Redis Cluster не может гарантировать сильную согласованность. На практике это означает, что при определенных условиях возможно, что Redis Cluster потеряет записи, которые были подтвержденысистемой клиенту.

Первая причина, по которой Redis Cluster может потерять записи, заключается в том, что он использует асинхронную репликацию.

Существует еще один примечательный сценарий, когда Redis Cluster будет терять записи, который происходит во времясетевой раздел, в котором клиент изолирован с меньшим количеством экземпляров, включая хотя бы главный. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...