RabbitMQ в Kubernetes: постоянное развёртывание кластера
Javashop — это система электронной коммерции, которая использует RabbitMQ для своей шины сообщений. RabbitMQ используется в таких бизнес-процессах, как создание заказов, генерация статических страниц и индексов. Для обеспечения высокой доступности RabbitMQ необходимо учитывать следующие факторы:
Отказоустойчивость требует постоянного хранения данных RabbitMQ. Необходимо предусмотреть случай сбоя RabbitMQ, чтобы сообщения, которые не были обработаны, могли быть восстановлены после восстановления работы RabbitMQ и обработаны повторно.
Сначала необходимо создать сервер NFS. Структура постоянного тома будет следующей:
/nfs/data/mqdata
Для создания сервера NFS выполните следующие шаги:
yum -y install nfs-utils
2. Создайте каталог NFS:
mkdir -p /nfs/data/{mqdata,esmaster,esdata}
3. Измените права доступа к каталогу:
chmod -R 777 /nfs/data/
4. Отредактируйте файл экспорта:
vim /etc/exports
5. Добавьте следующую строку:
/nfs/data/mqdata *(rw,no_root_squash,sync)
6. Активируйте изменения:
exportfs -r
7. Проверьте изменения:
exportfs
8. Запустите службы rpcbind и nfs:
systemctl restart rpcbind && systemctl enable rpcbind systemctl restart nfs && systemctl enable nfs
9. Проверьте состояние RPC-сервисов:
rpcinfo -p localhost
10. Выполните команду showmount для проверки доступности каталога:
showmount -e
Если всё выполнено успешно, вы увидите доступный каталог:
Export list for 172.17.14.73: /nfs/data/mqdata *
Теперь необходимо установить службу NFS на каждом узле, чтобы Kubernetes мог монтировать каталог NFS.
11. На всех узлах установите клиент NFS:
yum -y install nfs-utils systemctl start nfs && systemctl enable nfs
Это подготовительные шаги для постоянного тома в Kubernetes.
## **Создание постоянного тома**
После подготовки NFS можно создать постоянный том в Kubernetes. Сначала клонируйте подготовленный файл YAML с нашего сервера:
https://gitee.com/enation/rabbitmq-on-kubernetes.git
Затем отредактируйте файл pv.yaml в корневом каталоге и измените конфигурацию сервера на IP-адрес сервера NFS:
nfs: server: 192.168.1.100 #здесь укажите IP-адрес вашего сервера NFS
Создайте постоянный том с помощью команды:
kubectl create -f pv.yaml
Проверьте, был ли создан постоянный том:
kubectl get pv
## **Развёртывание RabbitMQ**
На главном узле Kubernetes выполните следующую команду для создания пространства имён:
kubectl create namespace ns-rabbitmq
Выполните следующую команду для развёртывания кластера RabbitMQ (используйте все файлы конфигурации в каталоге rabbitmq):
kubectl create -f rabbitmq/
Эти шаги создадут пространство имён ns-rabbitmq и соответствующие PVC, роли, реплики и сервисы.
### **Образ**
Используется образ, основанный на RabbitMQ версии 3.8, созданный компанией Javashop, с добавлением плагина для отложенных сообщений. В остальном изменений нет.
### **Сервисы**
По умолчанию открыты внешние порты nodeport, соответствующие следующим портам:
31672->15672
30672->5672
Внутри Kubernetes доступ можно получить через следующие имена сервисов:
rabbitmq.ns-rabbitmq:15672
rabbitmq.ns-rabbitmq:5672
Дождитесь запуска всех контейнеров и проверьте их работоспособность.
## **Проверка**
Используйте прилагаемую программу для проверки:
1. Отправьте сообщение (отключите приём сообщений).
2. Убедитесь, что в очереди RabbitMQ есть сообщения.
3. Удалите реплику кластера.
4. Восстановите реплику кластера.
5. Получите сообщения.
## **Ключевые технические моменты**
1. Обнаружение кластера: используйте плагин обнаружения peer для RabbitMQ в Kubernetes (rabbitmq_peer_discovery_k8s).
2. Сопоставление постоянного тома: сопоставьте его с каталогом /var/lib/rabbitmq/mnesia.
3. Пользовательский каталог данных:
```
- name: RABBITMQ_MNESIA_BASE
value: /var/lib/rabbitmq/mnesia/$(MY_POD_NAME)
```
Здесь MY_POD_NAME — это имя контейнера, которое обеспечивается уникальным связыванием через набор состояний:
```
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
```
## **Прилагаемая программа проверки**
private static CachingConnectionFactory connectionFactory; private static void initConnectionFactory() { connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost("localhost"); connectionFactory.setPort(5672); connectionFactory.setUsername("guest"); connectionFactory.setPassword("guest"); } public static void main(String[] args) { initConnectionFactory(); //отправляем сообщение send(); //получаем сообщение receive(); } private static void receive() { AmqpTemplate template = new RabbitTemplate(connectionFactory); String foo = (String) template.receiveAndConvert("myqueue"); System.out.println("get message : "+ foo); } private static void send() { AmqpAdmin admin = new RabbitAdmin(connectionFactory); admin.declareQueue(new Queue("myqueue",true)); AmqpTemplate template = new RabbitTemplate(connectionFactory); template.convertAndSend("myqueue", "foo"); }
Подписывайтесь на технический блог Javashop и смотрите больше обучающих видео:

Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )