前言:
本节内容是关于rabbitmq高可用集群的部署搭建,使用的是ubuntu22系统,我们准备三台服务器并启动docker作为rabbitmq的高可用容器,rabbitmq集群本身不是天然支持高可用的,我们通过配置rabbitmq服务器的镜像队列,以确保消息可以在集群中的多个节点上进行复制存储,提高可用性和容错性,避免单节点故障
准备(修改主机名和域名解析hosts文件):
server | ip | hostname |
---|---|---|
rabbitmq | 10.0.1.21 | node01 |
rabbitmq | 10.0.1.22 | node02 |
rabbitmq | 10.0.1.23 | node03 |
1、rabbitmq镜像准备
本地下载:docker pull rabbitmq:3.8.16-management
打包: docker save -o rabbitmq.tar rabbitmq:3.8.16-management
上传:
scp rabbitmq.tar ubuntu@10.0.1.21:/home/rabbitmq/
scp rabbitmq.tar ubuntu@10.0.1.22:/home/rabbitmq/
scp rabbitmq.tar ubuntu@10.0.1.23:/home/rabbitmq/
解压: tar -xvf rabbitmq.tar
加载镜像:docker load -i rabbitmq.tar
查看镜像信息: docker images
注:如果虚拟机支持可以直接拉镜像 直接启动就ok
2、创建挂载目录,并给相应权限(三台机器操作一样)
mkdir /var/lib/rabbitmq
chmod 777 /var/lib/rabbitmq
mkdir /var/log/rabbitmq
chmod 777 /var/log/rabbitmq
(**注意cookie可以自己指定但是三台机器都要一致**)
echo "YOUR_SECRET_COOKIE" > /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie
3、创建编辑docker-compose.yaml
node01-docker-compose:
version: "3.1"
services:
rabbitmq:
image: rabbitmq:3.8.16-management
container_name: rabbitmq1
network_mode: "host"
privileged: true
volumes:
- /var/lib/rabbitmq:/var/lib/rabbitmq
- /var/log/rabbitmq:/var/log/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=rabbitmq
- RABBITMQ_DEFAULT_PASS=rabbitmq2023
restart: always
node02-docker-compose:
version: "3.1"
services:
rabbitmq:
image: rabbitmq:3.8.16-management
container_name: rabbitmq2
network_mode: "host"
privileged: true
volumes:
- /var/lib/rabbitmq:/var/lib/rabbitmq
- /var/log/rabbitmq:/var/log/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=rabbitmq
- RABBITMQ_DEFAULT_PASS=rabbitmq2023
restart: always
node03-docker-compose:
version: "3.1"
services:
rabbitmq:
image: rabbitmq:3.8.16-management
container_name: rabbitmq3
network_mode: "host"
privileged: true
volumes:
- /var/lib/rabbitmq:/var/lib/rabbitmq
- /var/log/rabbitmq:/var/log/rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=rabbitmq
- RABBITMQ_DEFAULT_PASS=rabbitmq2023
restart: always
4、启动 docker-compose up -d (三台机器都一样)
查看镜像 docker ps -a
查看图形化页面:http://:15672 (如果自己指定端口用自己指定的)
5、配置集群
node01:
docker exec rabbitmq1 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq1 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq1 /bin/bash -c 'rabbitmqctl start_app'
docker exec rabbitmq1 /bin/bash -c 'rabbitmq-plugins enable rabbitmq_management'
docker exec rabbitmq1 /bin/bash -c 'rabbitmq-plugins enable rabbitmq_prometheus'
node02:
docker exec rabbitmq2 /bin/bash -c ''
docker exec rabbitmq2 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq2 /bin/bash -c 'rabbitmqctl join_cluster rabbit@node01'
docker exec rabbitmq2 /bin/bash -c 'rabbitmqctl start_app'
node03:
docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl stop_app'
docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl reset'
docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl join_cluster rabbit@node01'
docker exec rabbitmq3 /bin/bash -c 'rabbitmqctl start_app'
配置完可访问图形化页面:http://10.0.1.21:15672
6、配置镜像队列
正常情况下,rabbitmq集群并不是高可用的,节点间的数据是不能共享的,需要使用镜像队列同步节点数据,引入镜像队列(Mirror Queue)的机制,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性
node01执行
docker exec rabbitmq1 /bin/bash
所有队列进行镜像,并在集群的3个节点上完成进行,policy的设置命令为
rabbitmqctl set_policy ha-queue-two '^' '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}'
(当然也可以在图形页面配置—Admin----policies----User policies–按上方的key value 进行手动配置–》到这里rabbitmq的集群就搭建完成了)
7、集成promethues
在promethues.yml添加:
- job_name: rabbitmq
metrics_path: 'metrics'
static_configs:
- targets: ['10.0.1.21:15692','10.0.1.22:15692','10.0.1.23:15692']
可参考:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
alerting:
alertmanagers:
- static_configs:
- targets:
- 10.0.1.31:9093
rule_files:
- "first_rules.yml"
scrape_configs:
- job_name: k8s
metrics_path: /metrics
static_configs:
- targets: ['10.0.1.25:9100','10.0.1.26:9100','10.0.1.27:9100','10.0.1.28:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '10.0.1.25:9100'
replacement: 'master'
- source_labels: [__address__]
target_label: instance
regex: '10.0.1.26:9100'
replacement: 'node1'
- source_labels: [__address__]
target_label: instance
regex: '10.0.1.27:9100'
replacement: 'node2'
- source_labels: [__address__]
target_label: instance
regex: '10.0.1.28:9100'
replacement: 'node3'
- job_name: rabbitmq
metrics_path: 'metrics'
static_configs:
- targets: ['10.0.1.21:15692','10.0.1.22:15692','10.0.1.23:15692']
- job_name: mysql
static_configs:
- targets: ['10.0.1.11:9104']
- job_name: mongodb
static_configs:
- targets: ['10.0.1.35:9225']
配置完成重新加载
curl -X POST http://youprometheus:9090/-/reload
注:docker搭建rabbitmq集群就容易很多也没有涉及到编译的,可以尝试下,溜了溜了