Мы запускаем развертывание с 3 узлами mcrouter
/ memcached
kubernetes
(через helm
) в кластере Google Cloud. Мы используем кластер вместо одной виртуальной машины, чтобы сделать наше веб-приложение (которое использует memcache для сеансов) устойчивым к сбоям узла.
При обновлении узлов kubernetes выселяет стручки один за другим и генерирует новые. Поскольку memcache - это хранилище в памяти, эти новые модули создаются без данных. Маршруты mcrouter, которые мы используем в настоящее время, не оптимальны для этой ситуации, о чем свидетельствуют периодические сбои сеансов во время обновления.
Насколько я понимаю, есть 2 способа справиться с этим:
- Использование
WarmUpRoute
- Использование
MissFailoverRoute
Если я хочу использовать WarmUpRoute
, тогда мне нужно сделать следующее:
- Перед обновлением узла переключите текущую конфигурацию на конфигурацию, которая определяет один из узлов как «теплый» сервер, а два других - как «холодный» сервер.
- Выполните обновление узла на двух холодных серверах.
- Разрешить клиентам запрашивать кэш в течение нескольких дней, что будет медленно приводить к тому, что холодные серверы будут зеркалировать теплый сервер, так как пропадание кэша вызывает синхронизацию.
- Переключите эту конфигурацию WarmUpRoute с другой конфигурацией WarmUpRoute, в которой сервер, ранее обозначенный как «теплый», обозначен как «холодный», и наоборот.
- Повторите шаг 3
- Наконец, когда все серверы синхронизированы, вернитесь к моей исходной конфигурации.
Если я хочу использовать MissFailoverRoute
, тогда мне нужно сделать это:
- Используйте конфигурацию, которая определяет один из узлов memcache в качестве узла аварийного переключения.
- Обновление двух не отказоустойчивых узлов
- Обновление отказоустойчивого узла
Правильно ли я понимаю? Похоже, что второй вариант намного проще. Есть ли преимущества у метода WarmUpRoute
? Есть ли третий вариант, который будет работать лучше, чем эти два?