﻿# Кластер RabbitMQ

> [HTML Version](configure-rabbitmq.html)

В статье описана установка RabbitMQ 3.12.0 и Erlang 25.3.2.2-1 для ОС Ubuntu Linux 20.04 и 22.04. 

Установка RabbitMQ версии 4.0 не поддерживается в текущей версии ELMA365. Проверьте допустимые версии RabbitMQ в статье [«Системные требования ELMA365 On-Premises»](elma365-enterprise-on-premises.md#rabbit).

Вы можете также ознакомиться с руководством в [официальной документации RabbitMQ](https://www.rabbitmq.com/install-debian.html).

Установка состоит из шести этапов:

1. [Подготовка нод (серверов)](#preparation-node).

2. [Установка RabbitMQ](#install-rabbitmq).

3. [Подготовка кластера RabbitMQ](#preparation-cluster-rabbitmq).

4. [Настройка RabbitMQ](#setting-rabbitmq).

5. [Конфигурация HAproxy (блок rabbitmq)](#config-haproxy).

6. [Подключение к RabbitMQ](#connect-to-rabbitmq).

## Шаг 1. Подготовка нод (серверов)

````
начало внимание

````
Минимальное количество серверов для организации кластера — три.

````
конец внимание

1. ````
Создайте три ноды (сервера) с последовательно пронумерованными именами хостов:

- **rabbitmq-server1.your\_domain**;

- **rabbitmq-server2.your\_domain**;

- **rabbitmq-server3.your\_domain**.

2. Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в** /etc/hosts**.

## Шаг 2. Установка RabbitMQ

1. Установите необходимые пакеты:

````
sudo apt-get install curl gnupg apt-transport-https -y

2. ````
Импортируйте все необходимые ключи:

````
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null  
curl -1sLf https://ppa1.novemberain.com/gpg.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null  
curl -1sLf https://ppa1.novemberain.com/gpg.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null

````
Актуальные ключи для разных версий RabbitMQ перечислены в [официальной документации RabbitMQ](https://www.rabbitmq.com/docs/install-debian#cloudsmith-signing-keys).

3. Добавьте репозитории **RabbitMQ**:

````
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF  
deb \[signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg\] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu \$(lsb\_release -cs) main  
deb-src \[signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg\] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu \$(lsb\_release -cs) main  
  
deb \[signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg\] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu \$(lsb\_release -cs) main  
deb-src \[signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg\] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu \$(lsb\_release -cs) main  
EOF

4. ````
Обновите кеш пакетов:

````
sudo apt-get update -y

5. ````
Установите пакеты **Erlang**:

````
sudo apt-get install -y erlang-base=1:25.3.2.2-1 erlang-asn1=1:25.3.2.2-1 erlang-crypto=1:25.3.2.2-1 erlang-eldap=1:25.3.2.2-1 erlang-ftp=1:25.3.2.2-1 erlang-inets=1:25.3.2.2-1 erlang-mnesia=1:25.3.2.2-1 erlang-os-mon=1:25.3.2.2-1 erlang-parsetools=1:25.3.2.2-1 erlang-public-key=1:25.3.2.2-1 erlang-runtime-tools=1:25.3.2.2-1 erlang-snmp=1:25.3.2.2-1 erlang-ssl=1:25.3.2.2-1 erlang-syntax-tools=1:25.3.2.2-1 erlang-tftp=1:25.3.2.2-1 erlang-tools=1:25.3.2.2-1 erlang-xmerl=1:25.3.2.2-1

6. ````
Установите **rabbitmq-server** и его зависимости:

````
sudo apt-get install rabbitmq-server=3.12.0-1 -y --fix-missing

7. ````
Запустите **rabbitmq-server**:

````
sudo systemctl enable --now rabbitmq-server

## ````
Шаг 3. Подготовка кластера RabbitMQ

1. На каждой ноде **rabbitmq** создайте файл \[OBJECT\] и добавьте переменные окружения \[OBJECT\] и \[OBJECT\].

Пример заполнения для **rabbitmq-server1.your\_domain**:

````
RABBITMQ\_NODENAME=rabbit@rabbitmq-server1.your\_domain  
RABBITMQ\_USE\_LONGNAME=true

````
Пример заполнения для** rabbitmq-server2.your\_domain**:

````
RABBITMQ\_NODENAME=rabbit@rabbitmq-server2.your\_domain  
RABBITMQ\_USE\_LONGNAME=true

````
Пример заполнения для **rabbitmq-server3.your\_domain**:

````
RABBITMQ\_NODENAME=rabbit@rabbitmq-server3.your\_domain  
RABBITMQ\_USE\_LONGNAME=true

2. ````
Скопируйте Cookie **/var/lib/rabbitmq/.erlang.cookie** с первого узла** rabbitmq-server1.your\_domain** на все остальные узлы в кластере.

````
Начало внимание

````
Для работы кластера RabbitMQ у всех узлов, участвующих в кластере, должно совпадать содержимое файла **/var/lib/rabbitmq/.erlang.cookie**.

````
Конец внимание

3. ````
Перезапустите сервис RabbitMQ на каждой ноде:

````
sudo systemctl restart rabbitmq-server

4. ````
Остановите приложение на узлах **rabbitmq-server2.your\_domain** и **rabbitmq-server3.your\_domain** для последующего присоединения к кластеру:

````
sudo rabbitmqctl stop\_app

5. ````
Сбросьте **rabbitmq** на узлах **rabbitmq-server2.your\_domain** и **rabbitmq-server3.your\_domain**:

````
sudo rabbitmqctl reset

6. ````
Присоедините узлы **rabbitmq-server2.your\_domain** и **rabbitmq-server3.your\_domain** к кластеру:

````
sudo rabbitmqctl join\_cluster rabbit@rabbitmq-server1.your\_domain

7. ````
Запустите приложение на узлах **rabbitmq-server2.your\_domain** и **rabbitmq-server3.your\_domain**:

````
sudo rabbitmqctl start\_app

8. ````
Проверьте статус кластера:

````
sudo rabbitmqctl cluster\_status

## ````
Шаг 4. Настройка RabbitMQ

````
начало примечание

````
**Примечание**

Для пароля разрешается применять следующие символы:

- Заглавные латинские буквы: от A до Z;

- Строчные латинские буквы: от a до z;

- Цифры от 0 до 9;

- Символы:  -\_.

Зарезервированные (недопустимые) символы:

\! \* ' ( ) ; : @ \& = + \$ , / ? % # \[ \]

````
конец примечание

1. ````
На каждом узле включите необходимые плагины: 

````
sudo rabbitmq-plugins enable \\  
rabbitmq\_management

2. ````
Cоздайте **vhost** и дайте пользователю доступ к нему, выполнив команды на первом узле **rabbitmq-server1.your\_domain**:

````
sudo rabbitmqctl add\_vhost elma365vhost  
sudo rabbitmqctl add\_user elma365user SecretPassword  
sudo rabbitmqctl set\_permissions -p elma365vhost elma365user ".\*" ".\*" ".\*"  
sudo rabbitmqctl set\_user\_tags elma365user administrator

3. ````
Создайте политику, которая позволяет зеркалировать очереди для всех узлов в кластере, выполнив команду на первом узле **rabbitmq-server1.your\_domain**:

````
sudo rabbitmqctl set\_policy -p 'elma365vhost' MirrorAllQueues ".\*" '\{"ha-mode":"all"\}'

````
Если отсутствует поддержка политики High Availability Mode, используйте политику Quorum:

````
rabbitmqctl set\_policy –p 'elma365vhost' QuorumDefault “^.\*” ‘\{“queue-type”:“quorum”\}’ --priority 0 --apply-to queues

````
Чтобы посмотреть настроенные политики, используйте команду:

````
sudo rabbitmqctl list\_policies --vhost elma365vhost

````
Настройка включения TLS в RabbitMQ

Для включения поддержки TLS в RabbitMQ необходимо в файл конфигурации **/etc/rabbitmq/rabbitmq.conf**:

1. Добавить конфигурацию TLS в блоки** rabbit** (port 5671) и **management** (port 15671).

2. В параметрах **ssl\_options.certfile **и** management.ssl.certfile** указать путь до файла сертификата сервера.

3. В параметрах **ssl\_options.keyfile **и** management.ssl.keyfile** указать путь до файла закрытого ключа.

4. В параметрах **ssl\_options.cacertfile **и** management.ssl.cacertfile** указать путь до файла корневого CA.

````
listeners.tcp = none  
listeners.ssl.default = 5671  
ssl\_options.cacertfile = /path/to/ca\_certificate.pem  
ssl\_options.certfile = /path/to/server\_certificate.pem  
ssl\_options.keyfile = /path/to/server\_key.pem  
ssl\_options.verify = verify\_peer  
ssl\_options.fail\_if\_no\_peer\_cert = true  
  
management.ssl.port = 15671  
management.ssl.cacertfile = /path/to/ca\_certificate.pem  
management.ssl.certfile = /path/to/server\_certificate.pem  
management.ssl.keyfile = /path/to/server\_key.pem

5. ````
Перезапустить сервис RabbitMQ:

````
sudo systemctl restart rabbitmq-server

````
Подробнее о настройке TLS в RabbitMQ читайте в [официальной документации RabbitMQ](https://www.rabbitmq.com/ssl.html).  
  
Для включения TLS между нодами RabbitMQ «Securing Cluster (Inter-node)» необходимо:

1. Объединить в один файл открытый и закрытый ключи узла, например, в** **\[OBJECT\]:

````
cat server\_certificate.pem server\_key.pem > combined\_keys.pem

2. ````
Вывести путь к библиотеке Erlang TLS и экспортировать его в переменную окружения ````
\[OBJECT\]````
 в файл ````
\[OBJECT\]````
:

````
erl -noinput -eval 'io:format("ERL\_SSL\_PATH=~s~n", \[filename:dirname(code:which(inet\_tls\_dist))\])' -s init stop > /tmp/ssl-path.txt  
cat /tmp/ssl-path.txt /etc/rabbitmq/rabbitmq-env.conf > /tmp/new-rabbitmq-env.conf  
mv -f /tmp/new-rabbitmq-env.conf /etc/rabbitmq/rabbitmq-env.conf

3. ````
В файл ````
\[OBJECT\]````
 добавьте параметры для переменных окружения ````
\[OBJECT\]````
 и ````
\[OBJECT\]````
:

````
SERVER\_ADDITIONAL\_ERL\_ARGS="-pa \$ERL\_SSL\_PATH \\  
  -proto\_dist inet\_tls \\  
  -ssl\_dist\_opt server\_certfile /path/to/combined\_keys.pem \\  
  -ssl\_dist\_opt server\_secure\_renegotiate true client\_secure\_renegotiate true"  
RABBITMQ\_CTL\_ERL\_ARGS="-pa \$ERL\_SSL\_PATH \\  
  -proto\_dist inet\_tls \\  
  -ssl\_dist\_opt server\_certfile /path/to/combined\_keys.pem \\  
  -ssl\_dist\_opt server\_secure\_renegotiate true client\_secure\_renegotiate true"

4. ````
 Перезапустить сервис RabbitMQ на каждой ноде:

````
sudo systemctl restart rabbitmq-server

````
Подробнее о настройке TLS между нодами RabbitMQ читайте в [официальной документации RabbitMQ](https://www.rabbitmq.com/clustering-ssl.html).

## Шаг 5. Конфигурация HAProxy (блок rabbitmq)

Балансировку нагрузки между нодами кластера RabbitMQ осуществим с помощью HAProxy, произведем настройку по статье [«Конфигурация HAProxy для RabbitMQ»](haproxy-rabbitmq.md).

## Шаг 6. Подключение к RabbitMQ

Строка для подключения к кластеру RabbitMQ (через HAProxy):

````
amqp://elma365user:SecretPassword@haproxy-server.your\_domain:5672/elma365vhost

````
Строка для подключения к кластеру RabbitMQ c TLS (через HAProxy c TLS):

````
amqps://elma365user:SecretPassword@haproxy-server.your\_domain:5671/elma365vhost
````