GitHub

Tensho

Заметки непутевого программиста

RabbitMQ Upgrade

27/03/2018

Как и Rails, документация по RabbitMQ имеет одно из лучших описаний по обновлению, которое мне доводилось видеть. Тут я бы просто хотел оставить заметку о последовательности шагов для конкретной установки на память. Хочу сразу отметить, что речь пойдет о Single-Node развертывании, т.к. кластера RabbitMQ пока не предвидится. Также стоит упомянуть, что RabbitMQ поддерживает Blue/Green Upgrades без фактической остановки сервера, но такого рода подход требует создания еще одного кластера и чуть больше манипуляций вцелом. Для моего случая остановка сервера была вполне приемлема.

Что имеем?

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.5 LTS
Release:	14.04
Codename:	trusty
$ erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
"R16B03"
$ dpkg -s rabbitmq-server | grep Version
Version: 3.2.4-1

Что хотим?

Совместимость версий RabbitMQ и Erlang выписаны отдельной табличкой.

Как получить?

Добавить в файл /etc/apt/sources.list ссылки на репозитории Erlang и RabbitMQ:

deb http://packages.erlang-solutions.com/ubuntu trusty contrib
deb https://dl.bintray.com/rabbitmq/debian trusty main

Добавить публичные ключи для проверки подписей дистрибутивов:

$ wget -O- http://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add -
$ wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

Обновить реестр менеджера пакетов apt:

$ sudo apt-get update

Есть один ньюанс связанный с необходимостью проводить некоторые обновления поэтапно. В описанной установке нужно сначала провести RabbitMQ 3.2.4 (R13B03 – R16B03) –> 3.6.14 (R16B03 – 20.1.x), а потом 3.6.14 –> 3.7.x (19.3 – 20.3.x) (в скобках указана совместимая Erlang версия). О миграции внутренней базы данных, конфигурационных файлов и остальных внутренностей RabbitMQ позабоится сам.

Однако, о чем RabbitMQ не беспокоится, так это о бекапе вашей топологии и сообщений. Как и в любой современной системе рекомендуется предварительно обновлению сделать бекап. Топологию можно выгрузить через Management Web UI интерфейс, в самом низу вкладки “Overview” одним нажатием кнопки “Download broker definitions” или запустить rabbitmqadmin команду:

$ rabbitmqadmin --vhost production --username=admin --password=T0p5ecret export /mnt/data/backup/rabbit.definitions.json

Стандартно сообщения лежат в RABBITMQ_MNESIA_DIR (;RABBITMQ_MNESIA_BASE/$RABBITMQ_NODENAME) и единственный способ их сохранить – сделать копию всей папки RabbitMQ хоста:

$ cp -r /var/lib/rabbitmq/mnesia/rabbit@ec2-host-1 /mnt/data/backup

Установить крайний Erlang

$ sudo apt-get install -y erlang

Установить RabbitMQ 3.6.14 (нет в Bintray, есть в PackageCloud)

$ curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash
Detected operating system as Ubuntu/trusty.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Running apt-get update... done.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/rabbitmq_rabbitmq-server.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done.

The repository is setup! You can now install packages.
$ sudo apt-cache madison rabbitmq-server | grep 3.6.14
rabbitmq-server |   3.6.14-1 | https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ trusty/main amd64 Packages
$ sudo apt-get install -y rabbitmq-server=3.6.14-1
...
 * Stopping message broker rabbitmq-server [ OK ]
...
 * Starting message broker rabbitmq-server [ OK ]

Установить крайний RabbitMQ

$ sudo apt-get install rabbitmq-server
...
 * Stopping message broker rabbitmq-server [ OK ]
...
 * Starting message broker rabbitmq-server [ OK ]

Проверить версии пакетов

$ erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell
20.3
$ dpkg -s rabbitmq-server | grep Version
Version: 3.7.4-1