Сценарий: у нас есть два центра обработки данных, которые работают одновременно (оба обслуживают трафик).
У каждого есть свой собственный стек инфраструктуры, поэтому он может работать, даже если остальные не работают.
Тем не менее, мы хотели бы, когда это позволяют условия сети, чтобы наша база данных Redis была синхронизирована между ними. Потеря ключей во время сетевого раздела приемлема, как и наличие дубликатов ключей - это только данные кеша. Но мы получаем наибольшую выгоду от кеша, когда оба центра обработки данных работают (от 15-20% попаданий в кеш до 30-40% попаданий в кеш).
После некоторых поисков я не смог найти ничего, что могло бы эффективно дать нам мульти-мастер. (Обычно говорят «не делайте этого» или «это не поддерживается»).
В конце концов, я написал клиента, который подключается к обоим мастерам, подписывается на события пространства ключей для базы данных, а затем передает все команды SET между базами данных (все наши ключи устанавливаются с истечением срока действия) - с некоторым внутренним кешем "недавно просмотренного" в предотвратить повторение цикла.
На данный момент это отлично работает - единственный реальный недостаток заключается в том, что после того, как мы получаем новое ключевое событие, мы должны выпустить GETEX, чтобы получить ключ и его срок действия - так что вы получите второе чтение (таким образом, примерно в 2 раза больше Задержка RTT для удаленного контроллера домена). Он также ограничен просто поддержкой SET.
Мой вопрос: есть ли лучший способ получить такую репликацию с несколькими мастерами?
Я начал смотреть на SYNC / PSYNC, но там не так много документации по этим протоколам, и я не уверен, какие обязательства у клиента могут быть, чтобы не сломать сервер.
Я также ищу решение этой проблемы, пока что обнаружил: https://github.com/Netflix/dynomite/wiki/Architecture И возможно... https://github.com/CodisLabs/codis или https://github.com/twitter/twemproxy