Мажорное обновление версии (Blue-Green Deployment)
RabbitMQ 3.12.x нельзя напрямую обновить до 4.2.x через обновление на месте. Необходимо создать новый экземпляр 4.2.x и перенести данные из старого экземпляра. В этом документе описаны два подхода к миграции в зависимости от того, допустим ли простой.
- Вариант 1: Drain & Migrate — Если вы можете допустить кратковременный перерыв в обслуживании, сначала обработайте все сообщения, а затем переключитесь на новый экземпляр. Это самый простой подход.
- Вариант 2: Blue-Green Upgrade — Если простой недопустим, используйте плагин Federation для бесшовной миграции без потери сообщений.
Содержание
Вариант 1: Drain & Migrate (допустимый простой)Вариант 2: Blue-Green Upgrade (без простоя)Как это работаетПредварительные требованияПорядок действийКонтрольный список проверкиОткатВариант 1: Drain & Migrate (допустимый простой)
Этот подход предполагает кратковременный перерыв в обслуживании. Если ваш бизнес может выдержать простой, это самый прямолинейный вариант:
- Слить сообщения: Остановите всех producer'ов и дождитесь, пока consumer'ы обработают все оставшиеся сообщения. Убедитесь, что все очереди пусты.
- Экспортировать определения: Экспортируйте определения (exchanges, queues, bindings, users, vhosts) из старого экземпляра 3.12.x.
- Создать новый экземпляр: Разверните новый экземпляр RabbitMQ 4.2.x.
- Импортировать определения: Импортируйте определения в новый экземпляр 4.2.x.
- Переключить трафик: Обновите конфигурации приложений для подключения к новому экземпляру и перезапустите их.
- Вывести из эксплуатации: После того как все будет подтверждено как работающее, удалите старый экземпляр 3.12.x.
Вариант 2: Blue-Green Upgrade (без простоя)
Этот подход использует плагин RabbitMQ Federation для бесшовной передачи сообщений из старого экземпляра (blue) в новый экземпляр (green) без остановки producer'ов или consumer'ов. Дополнительные сведения см. в официальном руководстве по Blue-Green Deployment.
Как это работает
- Разверните новый экземпляр 4.2.x (green) рядом с существующим экземпляром 3.12.x (blue).
- Импортируйте определения из blue в green (exchanges, queues, bindings, users и т. д.).
- Настройте queue federation в кластере green с upstream, указывающим на blue.
- Перенесите consumer'ов на green — federation автоматически будет подтягивать сообщения из blue в green.
- Слейте оставшиеся сообщения из blue.
- Перенесите producer'ов на green.
- Выведите из эксплуатации кластер blue.
Федеративные очереди работают по принципу, согласно которому consumer'ы, подключенные к кластеру green, будут получать сообщения, опубликованные в кластере blue, если для этих очередей на blue нет локальных consumer'ов. Локальные consumer'ы всегда имеют приоритет.
Предварительные требования
- Старый экземпляр RabbitMQ 3.12.x (blue) исправен и находится в состоянии
Active. - Плагин
rabbitmq_federationдоступен в обоих экземплярах.
Порядок действий
Шаг 1: Создайте новый экземпляр 4.2.x (кластер green)
Дождитесь, пока экземпляр green перейдет в состояние Active:
Шаг 2: Экспортируйте определения из blue и импортируйте их в green
Убедитесь, что определения импортированы корректно:
Шаг 3: Настройте federation upstream в кластере green
Сначала получите внутренний адрес службы кластера blue:
Затем получите учетные данные кластера blue:
Если ваше имя пользователя или пароль содержит специальные символы (например, @, :, /), убедитесь, что они URL-кодированы в URI подключения ниже.
Настройте upstream в кластере green, указывающий на blue:
Задайте policy federation, которая будет соответствовать всем очередям:
В RabbitMQ, если нескольким policy соответствует одна и та же очередь, применяется только policy с наивысшим приоритетом. Если импортированные определения уже содержат policy, охватывающие ваши очереди, универсальная policy blue-federation, указанная выше, может не вступить в силу (или может перезаписать существующие правила, если ей будет назначен более высокий приоритет).
В таких случаях следует вручную обновить существующие policy в кластере green, добавив ключ "federation-upstream": "blue" рядом с их текущими определениями.
Проверьте состояние federation:
Шаг 4: Перенесите consumer'ов в кластер green
Обновите конфигурации приложений consumer'ов, чтобы они указывали на адрес службы кластера green. На этом этапе:
- Producer'ы по-прежнему публикуют сообщения в кластер blue.
- Consumer'ы читают сообщения из кластера green.
- Federation автоматически подтягивает сообщения из blue в green.
Получить адрес службы кластера green можно с помощью следующей команды:
Убедитесь, что сообщения передаются через federation:
Перед переносом consumer'ов с кластера blue убедитесь, что связи federation на green находятся в состоянии running. Если связь не запущена, сообщения не будут передаваться.
Шаг 5: Слейте сообщения из кластера blue
После того как все consumer'ы перейдут на green, federation будет сливать оставшиеся сообщения из blue. Отслеживайте прогресс:
Для больших очередей можно дополнительно использовать плагин Shovel, чтобы ускорить слив:
Использование shovel одновременно с federation приведет к параллельной передаче сообщений, что может вызвать их приход не в порядке отправки. Если порядок сообщений критичен, используйте только federation.
Шаг 6: Перенесите producer'ов в кластер green
Когда очереди на blue станут почти пустыми:
-
Остановите всех producer'ов.
-
Дождитесь, пока оставшиеся сообщения будут полностью слиты через federation.
-
Убедитесь, что все очереди на blue пусты:
-
Обновите конфигурации producer'ов так, чтобы они указывали на кластер green, и перезапустите их.
Шаг 7: Очистите конфигурацию и выведите из эксплуатации кластер blue
Удалите policy federation и конфигурацию upstream из green:
Удалите кластер blue:
Контрольный список проверки
Используйте следующий контрольный список, чтобы проверить каждый этап миграции. Для каждого шага приведена команда CLI, которую можно выполнить напрямую.
Приведенные ниже команды предназначены для пошагового выполнения. Перед запуском замените все заполнители (например, <namespace>, <blue-pod-0>) на реальные значения.
Откат
Если в ходе миграции возникнут проблемы:
- До переноса consumer'ов: Просто удалите кластер green. На существующие сервисы это не повлияет.
- После переноса consumer'ов, но до переноса producer'ов: Переключите consumer'ов обратно на кластер blue. Удалите кластер green.
- После полной миграции: Если в кластере green возникнут проблемы, создайте новый экземпляр 3.12.x, импортируйте определения и переключитесь обратно. Учтите, что сообщения, опубликованные в green после переключения, потребуется слить обратно с помощью shovel или federation в обратном направлении.