Memcached последовательное хеширование и разделение сети, как решить?

Насколько я понимаю, при использовании memcached в режиме «согласованного хеширования», когда узел не работает, клиенты переназначат ключ с помощью алгоритма.

Предположим, у меня есть 2 клиента (A, B) и два сервера (C, D).

Что, если клиент A думает, что сервер C не работает, а B думает, что C все еще жив?

Таким образом, A будет продолжать использовать C и D, а B будет использовать только D. Как решить несогласованность данных, возникающую в этом случае?


person Howard    schedule 28.10.2013    source источник


Ответы (2)


Вы должны убедиться, что серверы A и B видят одинаковое состояние экземпляров memcached. Я думаю, что это может быть достигнуто, когда экземпляры memcached (C & D) будут скрыты за прокси (moxi или twemproxy). Прокси будет отвечать за поддержание состояния экземпляров memcached. Серверы приложений (A и B) должны подключаться только к прокси.

person ragnor    schedule 29.10.2013

Я использую центральный сервер «доступности», который запускает собственный демон memcached и предоставляет ключ с именем «avail_servers», который возвращает массив всех доступных серверов memcached. Это обновляется постоянно.

Мои веб-серверы сначала подключаются к этому центральному серверу, получают от него список доступных серверов, а затем используют его для хранения/получения значений. Вы можете написать некоторые дополнительные проверки, чтобы, если ваш сервер «А» по-прежнему считал сервер в списке «доступных» недоступным, он прекращал предоставление услуг до тех пор, пока проблема не будет решена.

person ChunkyBaconPlz    schedule 01.11.2013
comment
Хорошо, хорошо, но при этом вы ввели единую точку отказа. Как вы тогда решили этот вопрос? - person DevLounge; 31.08.2016
comment
Вы можете использовать что-то вроде Zookeeper вместо централизованного сервера для хранения сопоставлений активных серверов. Все серверы должны будут периодически пульсировать, чтобы поддерживать свою аренду. - person Dimos; 02.02.2017