目录
rabbitmq%E6%9C%8D%E5%8A%A1-toc" style="margin-left:0px;">需求 容器化部署rabbitmq服务
部署服务
验证及访问服务
rabbitmq%E9%85%8D%E7%BD%AELTS-toc" style="margin-left:0px;">rabbitmq配置LTS
服务验证
rabbitmq%E9%85%8D%E7%BD%AE%E9%9B%86%E7%BE%A4-toc" style="margin-left:0px;">rabbitmq配置集群
部署集群
1、创建一个存放配置文件的目录
2、创建配置文件
3、部署各个节点
集群验证
rabbitmq%E6%9C%8D%E5%8A%A1">需求 容器化部署rabbitmq服务
基础版本 系统ubuntu 24,docker 20.10,rabbitmq 3.13.2
部署服务
找到如下官网信息版本
官网版本发布信息
这里看到最新版本是3.13版本,这里在3.13中找一个版本下载容器镜像即可。
找到dockrhub.com中 找到3.13.2版本镜像。
容器服务安装此处省略
~# cat /etc/docker/daemon.json
{"registry-mirrors": ["https://hub.iyuu.cn","https://docker.1panel.live"]
}
下载rabbitmq镜像
docker pull rabbitmq:3.13.2-management
部署容器服务
docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3.13.2-management
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a739628b8375 rabbitmq:3.13.2-management "docker-entrypoint.s…" About an hour ago Exited (134) About an hour ago n# docker logs a73
Failed to create thread: Operation not permitted (1)
Aborted (core dumped)
这个报错是容器出现了权限问题,部署容器的时候需要加root特权的,这里加入参数docker时加上参数 --privileged=true
privileged=true:获得真正的root权限
删除这个异常退出的容器 重新部署
docker run -d -p 15672:15672 -p 5672:5672 --privileged=true --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3.13.2-management
bda51306d6691788437c49f1a5284c84be85abf10653ac5eb8930283a969b6e8
:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bda51306d669 rabbitmq:3.13.2-management "docker-entrypoint.s…" 2 seconds ago Up 1 second 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp some-rabbit
查看到容器服务已正常运行 无报错
验证及访问服务
访问 web端 用IP地址加端口号15672, 账号密码 user/password
到这里 mq服务部署 配置无误。
rabbitmq%E9%85%8D%E7%BD%AELTS">rabbitmq配置LTS
这边配置LTS依然在容器环境下
以下代码在宿主机上运行
# 创建 CA 证书
# 创建一个 CA 密钥文件,用于签发证书。
openssl genrsa -out ca_key.pem 4096# 使用 CA 密钥创建一个自签名的 CA 证书。
openssl req -new -x509 -days 3650 -key ca_key.pem -out ca_certificate.pem -subj "/C=US/ST=California/L=San Francisco/O=YourOrg/CN=YourOrg CA"# 创建服务器证书和密钥
# 创建一个服务器密钥文件。
openssl genrsa -out server_key.pem 4096# 使用服务器密钥创建一个证书请求。
openssl req -new -key server_key.pem -out server_csr.pem -subj "/C=US/ST=California/L=San Francisco/O=YourOrg/CN=yourserver.example.com"# 使用 CA 证书签发服务器证书。
openssl x509 -req -in server_csr.pem -CA ca_certificate.pem -CAkey ca_key.pem -CAcreateserial -out server_certificate.pem -days 365
确认所有证书文件都已正确生成:
•ca_key.pem:CA 密钥文件
•ca_certificate.pem:CA 证书文件
•server_key.pem:服务器密钥文件
•server_certificate.pem:服务器证书文件
以下代码在宿主机运行
提前把配置文件从容器服务中取出来配置文件路径是/etc/rabbitmq/conf.d/10-defaults.conf
docker cp 容器名称:/etc/rabbitmq/conf.d/10-defaults.conf .
把配置文件获取到本地后开始编辑配置文件,追加以下配置文件
listeners.ssl.default = 5671ssl_options.cacertfile = /etc/rabbitmq/ca_certificate.pem
ssl_options.certfile = /etc/rabbitmq/server_certificate.pem
ssl_options.keyfile = /etc/rabbitmq/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
注意 上面生成的ssl配置文件是在宿主机的路径下,配置文件指定的路径是容器内的路径,这里要注意替换配置文件路径。
这里需要提前给上面的配置文件和秘钥授权不然会有如下报错。
报错参考如下:这里是因为秘钥文件在宿主机是因root创建的,容器内是已rabbitmq用户运行的程序,这里权限访问不到,会报错路径找不到文件。
2024-09-14 07:05:01.736878+00:00 [error] <0.156.0> ssl_options.keyfile invalid, file does not exist or cannot be read by the node
2024-09-14 07:05:01.747045+00:00 [error] <0.156.0> Error preparing configuration in phase validation:
2024-09-14 07:05:01.747111+00:00 [error] <0.156.0> - ssl_options.keyfile invalid, file does not exist or cannot be read by the node2024-09-14 07:05:01.749037+00:00 [error] <0.156.0>
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0> BOOT FAILED
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0> ===========
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0> Error during startup: {error,failed_to_prepare_configuration}
2024-09-14 07:05:01.749037+00:00 [error] <0.156.0>
进入容器查看服务运行的用户,容器内是用rabbitmq用户运行的程序
解决以上报错给文件授权
# 在配置文件和秘钥文件 的存储目录执行
chmod 777 *
把run命令 准备好,一般建议放到sh文件中。(注意秘钥文件路径)
docker run -d --hostname my-rabbit --privileged=true --name some-rabbit \
-v /root/rabbitmq/10-defaults.conf:/etc/rabbitmq/conf.d/10-defaults.conf \
-v /root/rabbitmq/ca_certificate.pem:/etc/rabbitmq/ca_certificate.pem \
-v /root/rabbitmq/server_certificate.pem:/etc/rabbitmq/server_certificate.pem \
-v /root/rabbitmq/server_key.pem:/etc/rabbitmq/server_key.pem \
-e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password \
-p 5671:5671 -p 5672:5672 -p 15672:15672 \
rabbitmq:3.13.2-management
查看容器日志信息
2024-09-14 08:05:32.133593+00:00 [info] <0.669.0> Ready to start client connection listeners
2024-09-14 08:05:32.135054+00:00 [info] <0.822.0> started TCP listener on [::]:5672
2024-09-14 08:05:32.136665+00:00 [info] <0.842.0> started TLS (SSL) listener on [::]:5671completed with 6 plugins.
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> Server startup complete; 6 plugins started.
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> * rabbitmq_prometheus
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> * rabbitmq_federation
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> * rabbitmq_management
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> * rabbitmq_management_agent
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> * rabbitmq_web_dispatch
2024-09-14 08:05:32.207988+00:00 [info] <0.669.0> * oauth2_client
2024-09-14 08:05:32.218109+00:00 [info] <0.9.0> Time to start RabbitMQ: 5468 ms
2024-09-14 08:05:45.800176+00:00 [info] <0.886.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
2024-09-14 08:05:45.800326+00:00 [info] <0.886.0> Successfully synced tables from a peer
2024-09-14 08:05:46.794458+00:00 [info] <0.914.0> Waiting for Mnesia tables for 30000 ms, 9 retries left
2024-09-14 08:05:46.794598+00:00 [info] <0.914.0> Successfully synced tables from a peer
2024-09-14 08:44:57.191730+00:00 [notice] <0.1672.0> TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message
2024-09-14 08:44:57.191730+00:00 [notice] <0.1672.0> - {unsupported_record_type,13}
最重要的要搜索到以下两句话,这个是可以证明TLS已启用状态了,基本可以说是没有问题了。
2024-09-14 08:05:32.135054+00:00 [info] <0.822.0> started TCP listener on [::]:5672
2024-09-14 08:05:32.136665+00:00 [info] <0.842.0> started TLS (SSL) listener on [::]:5671
参考官网链接
服务验证
这里访问 IP地址+端口号 先测试一下 管理端是否可以访问,账号密码是 user/password,就是上面容器传进去的变量。这边可以访问到,就证明MQ是没有明显报错的。
TLS验证
先在其它宿主机上telnet 5671 TLS的专用端口 是否可以通,目前看到端口可以通,基本无误,可以联系研发进行 下一步程序连接TLS端口的测试和验证。
/rabbitmq# telnet 110.120.110.110 5671
Trying 110.120.110.110...
Connected to 110.120.110.110.
Escape character is '^]'.
参考官网的配置文件
rabbitmq%E9%85%8D%E7%BD%AE%E9%9B%86%E7%BE%A4">rabbitmq配置集群
集群主要有两种模式 一种主从模式 一种高可用模式,主从模式 官网称之为经典模式,高可用模式官网称之为镜像模式。
镜像集群是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。
这种集群有一个问题,主从数据源要同步,要从主节点同步到从节点,但是这个主从同步它不是强一致的,存在一定的延迟,如果在主从同步期间出现了一点故障,就可能导致数据丢失。
因此在RabbitMQ的3.8版本以后,推出了新的功能:仲裁队列来代替镜像集群,底层采用Raft协议确保主从的数据一致性。
部署集群
在一台服务器上用三个容器部署集群。
1、创建一个存放配置文件的目录
创建目录 /tmp/0918
2、创建配置文件
三个节点全部一样,在/tmp/0918 下创建两个配置文件。这里rabbit@ 是固定写法不要变,这里mq01,mq02和mq03是需要在环境中可以解析到的,如果环境中无法解决会报错。
rabbitmq.conf
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq01
cluster_formation.classic_config.nodes.2 = rabbit@mq02
cluster_formation.classic_config.nodes.3 = rabbit@mq03
.erlang.cookie (注意文件权限600)这个值是前面创建单机的时候,提前从容器内随机复制出来的,docker cp 容器id://var/lib/rabbitmq/.erlang.cookie . 复制出来文件。
HBRHAKRMYJUBNVYEXHXH
3、部署各个节点
创建一个虚拟网络
docker network create mq-net-test
运行命令
运行mq01节点
docker run -d --net mq-net-test \
-v ${PWD}/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq01 \
--hostname mq01 \
-p 8071:5672 \
-p 8081:15672 \
--privileged=true \
rabbitmq:3.13.2-management
运行mq02节点
docker run -d --net mq-net-test \
-v ${PWD}/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq02 \
--hostname mq02 \
-p 8072:5672 \
-p 8082:15672 \
--privileged=true \
rabbitmq:3.13.2-management
运行mq03节点
docker run -d --net mq-net-test \
-v ${PWD}/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq03 \
--hostname mq03 \
-p 8073:5672 \
-p 8083:15672 \
--privileged=true \
rabbitmq:3.13.2-management
集群验证
进入任意一个容器查看节点信息
-security:/tmp/0918# docker exec -it 6d /bin/bashroot@mq02:/# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
Basics##############Versionsrabbit@mq02: RabbitMQ 3.13.2 on Erlang 26.2.5
rabbit@mq01: RabbitMQ 3.13.2 on Erlang 26.2.5
rabbit@mq03: RabbitMQ 3.13.2 on Erlang 26.2.5CPU CoresNode: rabbit@mq02, available CPU cores: 2
Node: rabbit@mq01, available CPU cores: 2
Node: rabbit@mq03, available CPU cores: 2Maintenance statusNode: rabbit@mq02, status: not under maintenance
Node: rabbit@mq01, status: not under maintenance
Node: rabbit@mq03, status: not under maintenance##############
打开web端查看节点信息
http://IP地址:8081/#/
至此 rabbitmq集群搭建及验证完成。