Часовые Redis на тех же серверах, что и главный/подчиненный?

Я немного читал о том, как использовать Redis Sentinel, и я знаю, что можно иметь 2 или более часовых и балансировать нагрузку между ними при вызове со стороны клиента.

Это хорошая практика, чтобы эти 2 часовых находились на том же сервере, что и мой главный + ведомый? Другими словами, есть ли 1 дозорный на том же физическом сервере, что и главный, а другой на том же физическом сервере, что и подчиненный?

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

Я что-то упускаю? Каковы недостатки?

Я предпочитаю, чтобы сторожевые устройства находились на том же физическом сервере, что и главный/ведомый, чтобы уменьшить задержку.


person Henley    schedule 04.02.2015    source источник
comment
как я могу запустить сентинел отдельно?? @хенли   -  person AATHITH RAJENDRAN    schedule 27.05.2019


Ответы (4)


Во-первых, Sentinel не является балансировщиком нагрузки или прокси для Redis.

Во-вторых, не все неудачи — это смерть хоста. Иногда сервер ненадолго зависает, иногда отключается сетевой кабель и т. д. В связи с этим не рекомендуется запускать Sentinel на тех же хостах, что и ваш экземпляр Redis. Если вы используете Sentinel для управления аварийным переключением, все, что меньше трех Sentinel, работающих на узлах, отличных от вашего главного и подчиненных устройств Redis, вызывает проблемы.

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

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

Клиенты подключаются к Sentinel только для получения информации о текущем основном соединении. Каждый раз, когда клиент теряет соединение, он повторяет этот процесс. Sentinel не является прокси для Redis — команды для Redis идут непосредственно в Redis.

Единственная надежная причина для запуска Sentinel с менее чем тремя сигнальными устройствами — это обнаружение служб, что означает отказ от использования его для управления аварийным переключением.

Рассмотрим сценарий с двумя хостами:

Host A: redis master + sentinel 1 (Quorum 1)
Host B: redis slave + sentinel 2  (Quorum 1)

Если узел B временно потеряет сетевое подключение к узлу A в этом сценарии, узел B продвинет себя до главного. Теперь у вас есть:

Host A: redis master + sentinel 1 (Quorum 1)
Host B: redis master + sentinel 2  (Quorum 1)

Любым клиентам, которые подключаются к Sentinel 2, будет указано, что хост B является ведущим, тогда как клиентам, которые подключаются к Sentinel 1, будет указано, что хост A является ведущим (что, если ваши Sentinels находятся за балансировщиком нагрузки, означает половину ваших клиентов).

Таким образом, для получения минимально приемлемого надежного управления аварийным переключением вам необходимо выполнить следующее:

Host A: Redis master
Host B: Redis Slave
Host C: Sentinel 1
Host D: Sentinel 2
Host E: Sentinel 2

Ваши клиенты подключаются к часовым и получают текущий мастер для экземпляра Redis (по имени), а затем подключаются к нему. Если мастер умирает, клиент должен разорвать соединение, после чего клиент снова подключится к Sentinel и получит новую информацию.

Насколько хорошо каждая клиентская библиотека справляется с этим, зависит от библиотеки.

В идеале хосты C, D и E находятся на тех же хостах, откуда вы подключаетесь к Redis (т. е. на клиентском хосте). или представляют собой хорошую выборку, которую они получили. Основная цель здесь — убедиться, что вы проверяете, откуда вам нужно подключиться к Redis. В противном случае поместите их в тот же DC/Rack/Region, что и клиенты.

Если вы хотите, чтобы ваши клиенты общались с балансировщиком нагрузки, постарайтесь, чтобы ваши Sentinels были на этих узлах LB, если это возможно, добавляя дополнительные хосты, не относящиеся к LB, по мере необходимости, чтобы получить нечетное количество Sentinels> 2. Исключением является, если ваш клиентские хосты являются динамическими в том смысле, что их количество непостоянно (например, они увеличиваются для трафика, уменьшаются в периоды замедления). В этом сценарии вы в значительной степени должны запускать свои Sentinels на хостах, отличных от клиента и сервера redis.

Обратите внимание, что если вы сделаете это, вам нужно будет написать демон, который отслеживает канал Sentinel PUBSUB для события главного переключателя, чтобы обновить LB, который вы должны настроить так, чтобы он общался только с текущим мастером (никогда не пытайтесь общаться с обоими). Это требует больше работы, но позволяет использовать Sentinel прозрачно для клиента, который знает только, что нужно общаться с IP/портом LB.

person The Real Bill    schedule 04.02.2015
comment
для получения минимально приемлемого надежного управления отказоустойчивостью: Хост A: мастер redis + дозорный 1 (кворум 2); Хост B: мастер redis + дозорный 2 (кворум 2); Хост C: часовой 3 (Кворум 2), не так ли? - person Balazs Varhegyi; 14.01.2016
comment
Существуют проблемы с запуском sentinel на том же хосте, что и Redis. - person The Real Bill; 14.01.2016
comment
Не могли бы вы указать мне направление, что за проблема? redis.io/topics/sentinel указывает в разделе: Пример 2: базовая настройка с тремя ящиками, что это допустимая конфигурация. - person Balazs Varhegyi; 15.01.2016
comment
Поиск на этом сайте выявит случаи, когда люди приходили сюда и спрашивали, почему их установка не всегда работает. Перемещение часовых с узлов Redis каждый раз решало эту проблему. - person The Real Bill; 15.01.2016
comment
Что бы это ни стоило, у меня не было проблем с запуском 3 часовых, 2 из них на том же хосте, что и мастер + реплика. - person Henley; 22.03.2016
comment
как я могу запустить сентинел отдельно?? @TheRealBill - person AATHITH RAJENDRAN; 27.05.2019

Все зависит от уровня аварийного восстановления, которого вы хотите достичь. Предположим, у вас есть следующие компоненты независимо от того, где они размещены:

  • 2 Стража
  • 1 мастер
  • 1 раб

1 мастер 1+ ведомые

Сценарий с одним хостом

Хост выходит из строя: вы теряете все, плохой сценарий репликации для большинства случаев использования.

Сценарий с двумя хостами

Ведущий 1:

  • (Текущий избранный) Мастер
  • 1 страж

Хост 2:

  • Раб
  • 1 страж

Это правда, что в этом сценарии у вас могут быть отказы хостов по одному, что дает вам некоторый уровень безопасности. Просто попытайтесь понять, если под другим сервером вы подразумеваете физически разные хосты. Если это просто виртуальные машины на одном хосте, вы не получите тот же уровень аварийного восстановления (аварийное восстановление).

Относительно вашего вопроса:

Я предпочитаю, чтобы часовые находились на том же сервере, что и главный/ведомый, чтобы уменьшить задержку.

Обратите внимание, что Sentinels отслеживают текущего главного и подчиненных устройств, но клиенты Redis не подключаются к главному устройству ЧЕРЕЗ Sentinels, они просто получают доступ к текущему главному устройству через Sentinels, например, с точки зрения операций чтения и записи, которые вам не нужны. изучая любые значительные * задержки.

Поставщик конфигурации. Sentinel действует как источник полномочий для обнаружения служб клиентов: клиенты подключаются к Sentinels, чтобы запросить адрес текущего мастера Redis, ответственного за данную службу. В случае аварийного переключения Sentinels сообщит о новом адресе.

(см.: http://redis.io/topics/sentinel)

Насколько я понимаю, единственная выгода, которую вы имеете с точки зрения задержки, - это сердцебиения, отправленные от Мастера и Подчиненных к часовому. Пока вы не распространяете свои серверы по всему миру, все должно быть в порядке.

Все зависит от вариантов использования, но кажется, что лучше всего держать вещи как можно более разделенными, если все остальные вещи одинаковы (затраты, расстояние до клиентов и т. д.).

person bitoiu    schedule 04.02.2015
comment
Для каждого чтения/записи клиенты Redis должны сначала получить адрес от часового, прежде чем он сможет выполнить чтение/запись, верно? - person Henley; 04.02.2015
comment
Не для каждого чтения/записи это было бы ужасно. Клиент получает уведомление, когда мастер не работает, с новым выбранным мастером. Прочтите процитированный абзац из оригинальной документации: Если произойдет аварийное переключение, Sentinels сообщит о новом адресе. - person bitoiu; 04.02.2015
comment
как я могу запустить сентинел отдельно?? @bitoiu - person AATHITH RAJENDRAN; 27.05.2019

Вы можете иметь дозорные на одной машине с главным/ведомым, но количество дозорных должно быть нечетным (3/5/7). Дозорных должно быть как минимум три, и должна быть выделенная машина как минимум для одного дозорного.

Если у вас есть только два узла, то в случае разделения мозгов (нарушения сети) ведомый будет повышен до ведущего. Оба мастера теперь будут принимать данные от клиентов. Однако, когда все вернется на круги своя, один из мастеров будет понижен в должности до подчиненного. Этот мастер потеряет все свои данные, поскольку теперь он является ведомым, и будет реплицировать данные с текущего мастера.

проверьте это для хорошего объяснения архитектурных проектов Redis и разделенного мозга: http://www.yzuzun.com/2015/04/some-architectural-design-concepts-for-redis/

person greenlantern    schedule 22.04.2017
comment
ссылка не работает - person Nitin Gaur; 29.03.2018
comment
как я могу запустить сентинел отдельно?? @зеленый Фонарь - person AATHITH RAJENDRAN; 27.05.2019

Это, конечно, не рекомендуемый подход.

Документы Redis Sentinel довольно хорошо объясняют компромиссы. Надеюсь это поможет. https://redis.io/topics/sentinel#example-sentinel-deployments

person davissp14    schedule 02.12.2016