Подтвердить что ты не робот

Redis Fail Over

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

4b9b3361

Ответ 1

Update:

Сегодня я бы рекомендовал проверить redis-sentinel, инструмент авторского антиреза Redis для мониторинга и автоматического перехода на другой ресурс.

Оригинальный ответ:

Проверьте команду 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

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

Если мы говорим об общем сбое, пожалуйста, помните, что Redis Cluster не гарантирует сильную согласованность.

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

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

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

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