rocketmq的高可用部署及监控配置

628 阅读4分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

rocketmq是阿里开源的java开发的消息中间件,最初用于解决activemq在业务吞吐量上升产生的IO瓶颈问题。其包括生产者、消费者、名字服务器(namesrv),消息代理服务器(broker)四个部分,生产者和消费者用于生产和消费消息,namesrv用于broker和topic的动态注册和发现,broker负责消息的存储、传递、查询并可组成高可用集群。运维还要关注其监控组件rockermq-exporter和前台控制组件rocketmq-dashboard。

官方文档参考

可用性及高可用策略分析

image.png NameServer 通常2个以上实例部署,各实例间相互不进行信息通讯。Broker 向每一台NameServer 注册自己的路由信息,每一个 NameServer 实例上面都保存一份完整的路由信息。当某个 NameServer 因某种原因下线了,客户端仍然可以向其它 NameServer 获取路由信息。客户端可通过 k8s service 等方式配置连接多个 nameserver。

Broker 分为 Master 与 Slave。一个 Master 可以对应多个 Slave,但一个 Slave 只能对应一个 Master。Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。一个broker集群可以包括多个Master/slave对,一对master/slave不可用时,生产者消费者可经由namesrv转向其他可用master/slave。master挂了的情况下,需要手动将salve转为master(将brokerid改为0后重启)。

数据持久化

RocketMQ 采用文件系统的方式来存储消息,消息的主要存储文件包括 CommitLog 文件、ConsumeQueue 文件、IndexFile 文件。 文件刷盘可配置为异步或同步,异步则可能丢失数据,同步保证数据不丢,但效率相对低一些。

  • CommitLog 是消息存储的物理文件,所有消息主题的消息都存储在 CommitLog 文件中,每个 Broker 上的 CommitLog 被当前机器上的所有 ConsumeQueue 共享。所有的 Topic 数据是顺序写入在 CommitLog 文件中的。
  • ConsumeQueue 是消息消费的逻辑队列,消息达到 CommitLog 文件后将被异步转发到消息消费队列,供消息消费者消费,这里面包含 MessageQueue 在 CommitLog 中的物理位置偏移量 Offset,消息实体内容的大小和 Message Tag 的 hash 值。
  • IndexFile 是消息索引文件,Index 索引文件提供了对 CommitLog 进行数据检索,提供了一种通过 key 或者时间区间来查找 CommitLog 中的消息的方法。

部署方法

  1. 确定rocketmq的高可用模式,namesrv部署几个,broker部署几个master,是否需要slave,slave同步模式等
  2. 确定部署主机,路径,资源,参考已有项目部署目录,拷贝相关目录、文件,修改账号密码等相关配置
  3. 首先启动namesrv,namesrv实例间相互独立,由broker、生产者、消费者主动连接,一般部署两个以上高可用
  4. 然后启动broker,broker配置信息包括namesrv的连接地址、master/slave信息,归属的集群等
  5. 部署dashboard
  6. 部署和配置监控采集

监控

rocketmq一般使用rocketmq-exporter进行监控。

参考rocketmq-exporter官方文档

rockermq-exporter镜像制作

rockermq-exporter没有上传官方镜像到公共镜像仓库,需要我们自己打包镜像。

# 下载源文件
cd /home/chensi/
gh repo clone apache/rocketmq-exporter

# maven构建
docker run --name=maven -ti --rm --security-opt seccomp=unconfined -v /home/chensi/rocketmq-exporter-master:/rocketmq-exporter maven:3.8.6-openjdk-18 bash
cd /rocketmq-exporter
mvn clean install

# 构建容器镜像
cd rocketmq-exporter-master/target
cp ../rocketmq-exporter-0.0.2-SNAPSHOT-exec.jar ./

vim Dockerfile
FROM java:openjdk-8-jre-alpine
MAINTAINER chensi@jopa
WORKDIR /
ADD rocketmq-exporter-0.0.2-SNAPSHOT-exec.jar quickstart.jar
EXPOSE 5557
# 参考rocketmq-exporter/src/main/resources/application.yml暴露更多配置参数
ENV rocketmqVersion=4_9_3
ENV enableACL=true
COPY entrypoint.sh entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

vim entrypoint.sh

#!/bin/sh

# 参考rocketmq-exporter/src/main/resources/application.yml暴露更多配置参数
exec java -Xms512m -Xmx1g \
  -Drocketmq.config.accessKey=$accessKey -Drocketmq.config.secretKey=$secretKey \
  -Drocketmq.config.namesrvAddr=$namesrvAddr -Drocketmq.config.rocketmqVersion=$rocketmqVersion \
  -Drocketmq.config.enableACL=$enableACL -jar quickstart.jar

docker build -t rocketmq-exporter .

部署运行容器

docker run -d -m 2g --cpus=0.5 -p 5557:5557 -e accessKey=*** -e secretKey='***' \
  -e namesrvAddr='10.10.xxx.181:9876;10.10.xxx.182:9876' -e rocketmqVersion=4_9_3 \
  --name=rocketmq-exporter [私有镜像仓库地址]/rocketmq-exporter

配置指标采集和告警

在prometheus上配置,如果需要图形,可以下载grafana模板配置。

    - job_name: 'rocketmq'
      static_configs:
        - targets:
          - 10.10.xxx.10:5567
          - 10.10.xxx.10:5557
          - 10.10.xxx.181:5557
          - 10.30.xxx.181:5557
      scrape_interval: 2m
      relabel_configs:
      - target_label: project
        replacement: prd
        source_labels: [__address__]
        regex: .*.xxx.10:.*
      - target_label: project
        replacement: uat
        source_labels: [__address__]
        regex: .*.xxx.181:5557