基于云基础设施快速部署 RocketMQ 5.0 集群

本文介绍了如何借助Kubernetes和RocketMQ Operator在云基础设施上快速部署和管理RocketMQ 5.0集群,包括自主切换架构、Operator原理及RocketMQ Operator的设计与部署步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文作者:蔡高扬,Apache RocketMQ Committer, 阿里云智能技术专家。

背景

上图左侧为 RocketMQ 4.x版本集群,属于非切换架构。NameServer 作为无状态节点可以部署多份,broker 集群可以部署多组 broker ,每一组有一个 Broker Master 和多个 Broker Slave 。运行过程中如果某一组 master 故障,消息发送会路由到正常的 master 上,普通消息可以从原 Broker Slave 继续消费。

但非切换架构存在若干问题,比如定时消息或事务消息需要由 Master 进行二次投递,如果 Master 故障,则需要人工介入将 Master 重新恢复。因此, RocketMQ 5.0 提出了自主切换架构。

自主切换架构新增了一个 Controller 模块,负责选主。当某个 Broker Master 故障,会选择合适的 Broker Slave 提升为 Master,无需人工介入。

如果要在生产环境中部署一套集群,需要规划整个集群的机器资源(比如哪些模块部署在哪些机器、哪些机器需要什么样的资源规格等),然后安装 JDK 等依赖软件。每个组件还需要准备有其配置文件、启动脚本,再启动各个组件。整个过程十分耗费人力,而且存在误操作可能。

而在云基础设施上部署 RocketMQ 面临更多挑战:

首先,在云基础设施上创建不同规格的虚拟机更为方便,因此在云基础设施上部署时,一个虚拟机上往往只会部署一个模块,以实现资源隔离。然而,多节点部署也带了更高的操作成本。而系统内部组件的宕机、恢复、迁移等行为也需要进行支持。

从社区角度看,因为社区面向不同用户,不同用户往往会在不同云基础服务提供商上进行部署。但是从 IaaS 层设施看,不同云厂商提供的接口并不统一。

为了解决上述问题,社区借鉴了面向接口编程的思路:不直接操作基础设施,而是通过标准接口。而 Kubernetes 正是这样一个容器编排的“标准接口”。于是,社区在解决 RocketMQ 在云基础设施的部署问题时,选择基于 Kubernetes 进行部署,不同云厂商负责从 Kubernetes 到具体云 IaaS 层的调度:将有状态 RocketMQ 集群托管到 Kubernetes 集群,充分利用 Kubernetes 提供的部署、升级、自愈相关能力,同时也能享受到 Kubernetes 社区的生态红利。

Kubernetes 将 Pod、Deployment、Service、Ingress 等都封装成抽象资源。在部署 RocketMQ 集群时,只需将相关的 Kubernetes 资源编排好,而资源最终如何在云基础设施上进行编排则交由云服务提供商来完成。

然而,直接基于 Kubernetes 原生资源进行部署也存在一些不足。

比如用 Kubernetes 部署时

### 使用 Docker 部署 RocketMQ 5.0 的方法 为了通过 Docker 正确部署 RocketMQ 5.0,需要按照以下方式构建并配置各个组件的服务容器。以下是详细的说明: #### 1. 准备前置文件 在开始之前,需准备好 `namesrv` 和 `broker` 的 Dockerfile 文件以及 Dashboard 的相关依赖项。这些文件可以从官方 GitHub 库下载[^1]。 ```bash git clone https://github.com/apache/rocketmq-dashboard.git cd rocketmq-dashboard/ ``` 确保本地已安装 Git 工具以便克隆仓库中的必要文件。 #### 2. 构建 Nameserver 容器 Nameserver 是 RocketMQ 中的核心元数据管理节点之一。可以通过如下命令来启动 Nameserver 容器: ```docker docker run -d \ --name rocketmq-namesrv \ -p 9876:9876 \ -v $(pwd)/data/namesrv/logs:/root/logs \ apache/rocketmq:5.0 namesrv ``` 此命令会拉取 Apache 官方镜像,并指定端口映射为默认的 9876 端口用于外部访问[^4]。 #### 3. 启动 Broker 节点 Broker 主要负责消息的实际存储工作,在分布式环境中通常会有多个实例组成集群形式运作。下面是一个简单的单机版 Broker 初始化例子: ```docker docker run -d \ -e NAMESRV_ADDR="localhost:9876" \ --name rocketmq-broker \ -p 10911:10911 \ -p 10909:10909 \ -v $(pwd)/data/broker/logs:/root/logs \ -v $(pwd)/data/broker/store:/root/store \ apache/rocketmq:5.0 broker -n localhost:9876 ``` 这里设置了两个重要参数 `-e NAMESRV_ADDR` 来告知 Broker 找到对应的 Nameserver 地址;另外还定义了一些持久化路径供日志记录和数据保存之用。 #### 4. 创建 Dashboard 控制面板 Dashboard 提供了一个图形化的界面让用户更方便地监控整个系统的健康状况及性能指标等信息。基于前面提到的内容,可采用如下脚本来完成其初始化过程[^3]: ```sh cat <<EOF >/app/rocketmq/dashboard/start-dashboard.sh #!/bin/bash docker run -d \ -p 8080:8080 \ --name rocketmq-console-ng \ --restart=always \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=${NAMESRV_ADDR} -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ styletang/rocketmq-console-ng EOF chmod +x /app/rocketmq/dashboard/start-dashboard.sh ./start-dashboard.sh ``` 上述脚本允许自定义传入变量 `${NAMESRV_ADDR}` 表示实际使用的 Nameserver IP 列表字符串(以分号隔开)。完成后执行该脚本即可成功开启 Web UI 功能,默认监听于主机上的 8080 端口号处等待连接请求到来。 #### 5. 测试与验证 当以上各部分都顺利搭建完毕之后,就可以尝试发送测试消息至目标 Topic 上面去检验整体链路是否通畅无误了。具体操作流程不再赘述,请参照官方文档进一步学习实践。 --- ### 注意事项 - 如果是在生产环境下运行,则建议调整更多高级选项如设置密码保护机制、启用 SSL 加密传输等功能增强安全性。 - 对于大规模应用场景来说,推荐使用 Kubernetes 结合 RocketMQ Operator 自动化运维工具来进行统一管理和调度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值