为什么要快速部署Apache RocketMQ?
理想汽车作为一家新能源汽车制造商。我们与一般互联网业务特殊之处是多了一个物联网。随着公司的成长业务容量越来越大,在这个过程中,业务对于基础架构的要求也越来越高,我们面临的主要问题有单云资源扩容受限,单云单地域的容灾,单云供应商强依赖,物联网单点接入等问题。
为了满足中心业务连续性,增强抗风险能力,实现韧性架构,多云多活作为一种可靠的高可用部署架构,成为各大互联网公司的首要选择。
业务进行单元化,部署在不同云上 VDC。利用 SDE 的技术手段一键拉起 VDC,快速部署基础设施、中间件、业务应用,创建各种资源。Apache RocketMQ 作为重要的基础中间件,它的快速部署能力影响整个 VDC 的拉起速度。
如何实现快速部署Apache RocketMQ?
大家在部署 ApacheRocketMQ 集群通常的过程如下:
1. 申请机器
2. 申请域名
3. 部署 Apache RocketMQ 集群
4. 部署 Apache RocketMQ Exporter
5. Apache RocketMQ Exporter 接入监控
6. Apache RocketMQ 集群信息接入管控平台
大规模ApacheRocketMQ 集群如果采用人工部署时间将会以小时或者以天为单位,理想汽车内部使用 Terraform 基础架构自动化编排工具编排整个部署流程。其中部署 Apache RocketMQ 集群作为原子能力使用 Ansible Playbook 实现。01
效果展示
完整地部署一套 ApacheRocketMQ,在管控平台上仅仅需要填写集群名称、namesrv 和 broker 部署规模及其机器配置等少数几个参数,即可完成集群的快速部署。
部署过程中,Terraform 调用管控平台的集群信息接入接口完成整个部署流程。
最后在 prometheus 的 consul 集群上看到 Apache RocketMQ Exporter 已经成功注册。
Apache RocketMQ Playbook介绍
ApacheRocketMQ Playbook 可以部署一个完整 Apache RocketMQ 集群(包括 Apache RocketMQ Exporter)。Apache RocketMQPlaybook 具有幂等性,重复执行时不会重启正在运行的进程,可以进行 Apache RocketMQ 集群的在线扩容。因为 Apache RocketMQ 集群缩容涉及到数据的收缩,一般不考虑在 ApacheRocketMQ Playbook 上支持缩容。Apache RocketMQ Playbook 集成了部署环境初始化、可运行包下载、os 参数调优、broker 最佳配置、ApacheRocketMQ 集群部署、Apache RocketMQ Exporter 部署、添加开机自启动机制等任务编排到一起,实现了大规模集群自动化部署。
Apache RocketMQ Playbook使用
01
首先安装Ansible
Ansible 是近些年 Github 关注度最高、最受欢迎的自动化运维工具。它可以进行配置管理和应用部署。实现了批量系统配置、批量程序部署、批量运行命令等功能。
安装文档:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
02
下载 Apache RocketMQ Playbook
Apache RocketMQPlaybook 入口文件为 rocketmq.yml。
rocketmq.yml 包含 namesrv.yml、broker.yml、exporter.yml 这 3 个文件,分别部署 Apache RocketMQ Namesrv、Apache RocketMQBroker、Apache RocketMQ Exporter。
rocketmq.yml 可以单独执行,部署一个完整的 Apache RocketMQ 集群,也可以每个文件单独执行。
hosts 文件配置了部署的机器列表以及 Apache RocketMQ 配置。
下载地址:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-ansible
03
根据需要修改配置文件
- hosts文件主要描述了部署的机器列表和 Apache RocketMQ 配置信息。
#ApacheRocketmq Namesrv 部署机器列表
[rocketmq_namesrv] 127.0.0.1 127.0.0.2
#ApacheRocketmq Broker 部署机器列表及每台机器的角色配置配置
[rocketmq_broker] 127.0.0.3brokerName=broker-a brokerId=0 brokerRole=ASYNC_MASTER 127.0.0.4brokerName=broker-a brokerId=1 brokerRole=SLAVE
#ApacheRocketmq Broker 公共配置
[rocketmq_broker:vars] brokerClusterName=DefaultCluster namesrvAddr=127.0.0.1:9876;127.0.0.2:9876 storePathRootDir=/data/rocketmq/store
#ApacheRocketmq Exporter 部署机器列表
[rocketmq_exporter] 127.0.0.5
#ApacheRocketmq Exporter 公共配置
[rocketmq_exporter:vars] namesrvAddr=127.0.0.1:9876;127.0.0.2:9876 webTelemetryPath=/metrics rocketmqVersion=V4_7_1
- 修改全局变量
vars/main.yml 配置了 Apache RocketMQ 的部署路径、数据路径。需要根据自己公司的部署规范调整。
# Theglobal variable
rocketmq_deploy_path:/app rocketmq_log_path:/data
- 修改 namesrv 变量
namesrv/vars/main.yml 配置了 Apache RocketMQ 可运行文件下载地址、namerv 部署路径(可以是全局变量的子路径)、namesrv 日志路径。
#namesrv variable
rocketmq_download_url:https://dlcdn.apache.org/rocketmq/4.9.3/rocketmq-all-4.9.3-bin-release.zip rocketmq_deploy_path:/app rocketmq_log_path:${user.home}
- 修改 broker 变量
broker/vars/main.yml 配置了 Apache RocketMQ 可运行文件下载地址、broker 部署路径(可以是全局变量的子路径)、broker 日志路径。
# brokervariable
rocketmq_download_url:https://dlcdn.apache.org/rocketmq/4.9.3/rocketmq-all-4.9.3-bin-release.zip rocketmq_deploy_path:/app rocketmq_log_path:${user.home}
- 修改 exporter 变量
exporter/vars/main.yml 配置了 Apache RocketMQ Exporter 可运行文件下载地址、ApacheRocketMQ Exporte 部署目录。注:ApacheRocketMQ Exporter 需要自行编辑打包,上传到公司内网。
#exportervariable#exporterneed build by yourself
rocketmq_exporter_download_url:http://rocketmq.exporter/rocketmq-exporter-0.0.2-SNAPSHOT.jar rocketmq_exporter_deploy_directory:/app/exporter
执行Apache RocketMQ Playbook
ansible-playbook/path/rocketmq.yml -i /path/hosts
注:/path 需要根据实际路径修改。部署路径冗余配置是为了让 3 个子 playbook 具有单独执行的能力。
日常运维可使用的命令
#ApacheRocketMQ Broker 启动、停止
systemctlstart mqbroker systemctlstop mqbroker
#ApacheRocketMQ Namesrv 启动、停止
systemctlstart mqnamesrv systemctlstop mqnamesrv
#ApacheRocketMQ Exporter 启动、停止
systemctlstart mqexporter systemctlstop mqexporter
最后
基于 ApacheRocketMQ Playbook 的部署能力,可以封装出极简参数的部署接口集成到管控平台上,最后通过可视化的界面,在分钟级完成大规模 Apache RocketMQ 集群的快速部署。