rabbitmq容器化部署

news/2024/9/21 5:50:54/

目录

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 24docker 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集群搭建及验证完成。


http://www.ppmy.cn/news/1528267.html

相关文章

2025秋招LLM大模型多模态面试题(六)-KV缓存

目录 为什么Transformer推理需要KV缓存?KV缓存的具体实现 没有缓存的情况下使用缓存的情况下KV缓存在解码中的阶段划分 Prefil阶段Decoding阶段KV缓存的存储类型及显存占用计算KV缓存的局限与优化策略 超长文本与复杂模型场景下的瓶颈量化方案的应用量化方案的副作用与优化方法…

java线程工具-CountDownLatch和CyclicBarrier使用详解

文章目录 CountDownLatch概念主要方法用途示例代码CyclicBarrier概念主要方法用途示例代码比较CountDownLatch 和 CyclicBarrier 都是 Java 并发包 java.util.concurrent 中提供的同步辅助类,用于协调多线程程序中的线程执行顺序。尽管它们有相似之处,但各自的设计目的和使…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(三)-文档

文档 文档服务负责写入&#xff0c;包括批量&#xff1b;id获取文档&#xff1b;nested写入 写入文档 写入文档主要是构建IndexRequest&#xff0c;索引请求 Elasticsearch v8构建文档索引请求简单很多&#xff0c;可以直接接受Map数据 批量写入文档 批量操作可以融合增删改…

如何写数学建模竞赛论文

撰写数学建模论文的重要性不言而喻&#xff0c;它直接决定了成绩的好坏和获奖级别的高低。论文是竞赛成果的书面体现&#xff0c;同时也是科技写作的基础训练。评审论文的标准包括假设的合理性、建模的创新性、结果的合理性以及表述的清晰性。 一、论文的基本内容和需要注意的…

小程序开发设计-第一个小程序:注册小程序开发账号②

上一篇文章导航&#xff1a; 小程序开发设计-小程序简介①-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142217803?sharetypeblogdetail&sharerId142217803&sharereferPC&sharesourceqq_60872637&spm1011.2480.3001.8118 须知&#xff1a;不…

54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)

和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数 8.strncpy函数 *简单使用 cplusplus的介绍 点我跳转 翻译: 函数 strncpy char * strncpy ( char * destination, const char * source, size_t num ); 从字符串中复制一些字符 复制源(source)字符串的前num个…

查看ip地址的方法有几种?探索多样方法

在当今数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;在网络连接、数据传输、网络安全等方面扮演着至关重要的角色。无论是普通用户进行网络设置&#xff0c;还是网络管理员进行故障排查&#xff0c;了解如何查看IP地址都是一项基础且必备的技能。本文将深…

spring mvc详细讲解(前后端分离模式)

在前后端分离模式下&#xff0c;Spring MVC 的作用主要集中在处理后端的业务逻辑和 API 接口&#xff0c;而不再直接管理视图部分。也就是说&#xff0c;Spring MVC 的重点是如何处理客户端的请求并返回数据&#xff08;通常以 JSON 或 XML 格式&#xff09;&#xff0c;而视图…