Redis активно-активная репликация
Я использую redis version 2.8.3
, Я хочу построить redis
кластер. Но в этом кластере должно быть multiple master
, Это означает, что мне нужно несколько узлов, которые имеют доступ для записи и возможность применения ко всем остальным узлам.
Я мог бы построить кластер с мастером и несколькими рабами. Я просто настроил рабов redis.conf
файлы и добавил, что;
slaveof myMasterIp myMasterPort
Это все. Чем я пытаюсь записать что-то в БД через мастера. Он тиражируется на всех рабов, и мне действительно это нравится.
Но когда я пытаюсь писать через раба, он говорит мне, что рабы не имеют права писать. После этого я просто установил статус ведомого только для чтения в redis.conf
файл в ложь. Следовательно, я мог бы написать что-нибудь в БД. Но я понимаю, что он не реплицируется на мою главную репликацию, поэтому он не реплицируется на всех остальных подчиненных.
Это означает, что я не смог построить активно-активный кластер.
Я пытался найти что-то, имеет ли redis возможность кластера active-active. Но я не смог найти точного ответа по этому поводу.
Можно ли построить активно-активный кластер с Redis? Если это так, как я могу это сделать?
Спасибо!
1 ответ
Redis v2.8.3 не поддерживает настройки нескольких мастеров. Реальный вопрос, однако, почему вы хотите создать один? Иными словами, какую проблему / проблему вы пытаетесь решить?
Похоже, задача, которую вы пытаетесь решить, состоит в том, как снизить нагрузку на сеть (подробнее об этом ниже), исключив чтение через Интернет. Поскольку Redis не является мультимастерным (пока), единственный способ сделать это - настроить каждый сервер приложений с помощью мастера и подчиненного устройства (для другого мастера), то есть всего 4 экземпляра Redis (и в два раза больше оперативной памяти).).
Простой сценарий - это когда каждое приложение обновляет только взаимоисключающее подмножество ключей базы данных. В этом сценарии такая установка может быть полезной (по крайней мере, в краткосрочной перспективе). Если, однако, оба приложения могут касаться всех клавиш или если хотя бы один ключ является "общим" для записей между приложениями, то вам нужно будет включить логику блокировки / разрешения конфликтов / и т. Д. В свои приложения для консолидации локального мастера и рабские различия (и это может быть немного излишним). Однако в любом случае вы получите слишком много (т. Е. Более 1) повторов, что, по крайней мере, означает больше усилий администратора.
Также обратите внимание, что, размещая приложение и базу данных на одном сервере, вы настраиваете себя на почти определенный сбой масштабируемости. Что произойдет, когда вам понадобится больше вычислительных ресурсов для ваших приложений или Redis? Как вы добавите еще один сервер приложений?
Что возвращает меня к актуальной проблеме, которую вы пытаетесь решить - нагрузке на сеть. Почему именно это проблема? Ваши приложения настолько перегружены или сеть настолько тонка, что вы готовы пойти на такую длину? Или, возможно, задержка - это проблема, которую вы хотите решить? Как бы то ни было, я рекомендовал вместо этого рассмотреть проверенный временем дизайн, а именно отделить Redis от приложений и разместить его на своих собственных ресурсах. Правда, сеть ударит вас по лицу, и вам придется работать вокруг / с ней (это то, что делают все остальные). С другой стороны, у вас будет больше гибкости и контроль над гораздо более простыми настройками, и в моей книге это огромный выигрыш.
Redis Enterprise уже давно использует эту функцию, но если вы ищете решение с открытым исходным кодом, KeyDB - это форк с поддержкой Active Active (называемый Active Replica).
Установка его - это чуть больше работы, чем стандартная репликация:
- Оба сервера должны иметь "active-replica yes" в соответствующих файлах конфигурации.
- На сервере B выполните команду "replicaof [A address] [A port]". Сервер B сбросит свою базу данных и загрузит набор данных сервера A.
- На сервере A выполните команду "replicaof [B address] [B port]". Сервер A отбросит свою базу данных и загрузит набор данных сервера B (включая данные, которые он только что передал на предыдущем шаге)
- Оба сервера теперь будут передавать записи друг другу. Вы можете проверить это, записав ключ на сервере A и убедившись, что он виден на B и наоборот.
https://github.com/JohnSully/KeyDB/wiki/KeyDB-(Redis-Fork):-Active-Replica-Support