K8S部署rocketmq单机和集群

K8S部署rocketmq单机和集群

版本

K8S版本:v21.5
rocketmq:v4.8.0

Rocketmq介绍

RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如 Group、 Topic、 Queue等。系统组成则由 Producer、 Consumer、 Broker、 NameServer 等。
RocketMQ 特点
是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式等特点Producer、 Consumer、队列都可以分布式
Producer 向一些队列轮流发送消息,队列集合称为 Topic, Consumer 如果做广播消费,则
一个 Consumer 实例消费这个 Topic 对应的所有队列 ,如果做集群消费 ,则多个Consumer 实例平均消费这个 Topic 对应的队列集合
能够保证严格的消息顺序
支持拉(pull)和推(push)两种消息模式
高效的订阅者水平扩展能力
实时的消息订阅机制
亿级消息堆积能力
支持多种消息协议,如 JMS、 OpenMessaging 等
较少的依赖

RocketMQ 的核心概念

消息队列 RocketMQ 在任何一个环境都是可扩展的,生产者必须是一个集群,消息服务器必须是一个集群,消费者也同样。集群级别的高可用,是消息队列 RocketMQ 跟其他的消息服务器的主要区别,消息生产者发送一条消息到消息服务器,消息服务器会随机的选择一个消费者,只要这个消费者消费成功就认为是成功了。
注意: 文中所提及的消息队列 RocketMQ 的服务端或者服务器包含 Name Server、Broker 等。服务端不等同于 Broker。
K8S部署rocketmq单机和集群
RocketMQ 主要由 Producer、 Broker、 Consumer 三部分组成, 其中 Producer 负责生产消息, Consumer 负责消费消息, Broker 负责存储消息。 Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个 Topic 的消息,每个 Topic 的消息也可以分片存储于不同的 Broker。 Message Queue 用于存储消息的物理地址,每个 Topic 中的消息地址存储于多个 Message Queue 中。 ConsumerGroup 由多个 Consumer 实例构成。
图中所涉及到的概念如下所述:
Name Server: 名称服务充当路由消息的提供者。是一个几乎无状态节点,可集群
部署,节点之间无任何信息同步。在消息队列 RocketMQ 中提供命名服务,更新
和发现 Broker 服务。NameServer 即名称服务,两个功能:
接收 broker 的请求,注册 broker 的路由信息
接收 client(producer/consumer) 的请求,根据某个 topic 获取其到broker 的路由信息NameServer 没有状态,可以横向扩展。每个 broker 在启动的时候会到
NameServer 注册; Producer 在发送消息前会根据 topic 到 NameServer 获取路由(到 broker)信息; Consumer 也会定时获取 topic 路由信息。
2、Broker:消息中转角色,负责存储消息,转发消息。可以理解为消息队列服务器,
提供了消息的接收、存储、拉取和转发服务。 broker 是 RocketMQ 的核心,它是不能挂的,所以需要保证 broker 的高可用。broker 分为 Master Broker 和 Slave Broker,一个 Master Broker 可以对应多个 Slave Broker,但是一个 Slave Broker 只能对应一个 Master Broker。Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的BrokerId 来定义, BrokerId 为 0 表示 Master,非 0 表示 Slave。 Master 也可以部署多个。每个 Broker 与 Name Server 集群中的所有节点建立长连接,定时注册Topic 信息到所有 Name Server。 Broker 启动后需要完成一次将自己注册至Name Server 的操作;随后每隔 30s 定期向 Name Server 上报 Topic 路由信息。
3、生产者:与 Name Server 集群中的其中一个节点(随机)建立长链接(Keepalive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的
Master Broker 建立长链接,且定时向 Master Broker 发送心跳。
4、消费者:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、
Slave Broker 建立长连接,且定时向 Master Broker、 Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消
息,订阅规则由 Broker 配置决定。

2.1、Topic、 Queue、 tags

RocketMQ 的 Topic/Queue 和 JMS 中的 Topic/Queue 概念有一定的差异, JMS 中所有消费者都会消费一个 Topic 消息的副本,而 Queue 中消息只会被一个消费者消费;但到了RocketMQ 中 Topic 只代表普通的消息队列,而 Queue 是组成 Topic 的更小单元。
• topic: 表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息、物流消息… 一条消息必须有一个 Topic。
• Queue:主题被划分为一个或多个子主题,称为“message queues”。一个topic 下,我们可以设置多个 queue(消息队列)。当我们发送消息时,需要要
指定该消息的 topic。 RocketMQ 会轮询该 topic 下的所有队列,将消息发送出去。
定义: Queue 是 Topic 在一个 Broker 上的分片,在分片基础上再等分为若干份(可指定份数)后的其中一份,是负载均衡过程中资源分配的基本单元。
集群消费模式下一个消费者只消费该 Topic 中部分 Queue 中的消息,当一个消费者开启广播模式时则会消费该 Topic 下所有 Queue 中的消息。先看一张有关 Topic 和 Queue 的关系图:
K8S部署rocketmq单机和集群
Tags
Tags 是 Topic 下的次级消息类型/二级类型(注: Tags 也支持 TagA ||TagB 这样的表达式),可以在同一个 Topic 下基于 Tags 进行消息过滤。 Tags
的过滤需要经过两次比对,首先会在 Broker 端通过 Tag hashcode 进行一次比对过滤,匹配成功传到 consumer 端后再对具体 Tags 进行比对,以防止
Tag hashcode 重复的情况。比如交易消息又可以分为:交易创建消息,交易完成消息… 一条消息可以没有 Tag。 RocketMQ 提供 2 级消息分类,方便大家灵活控制。标签,换句话说,为用户提供了额外的灵活性。有了标签,来自同一个业务模块的不同目的的消息可能具有相同的主题和不同的标签。标
签将有助于保持您的代码干净和连贯,并且标签还可以为 RocketMQ 提供的查询系统提供帮助。
• Queue 中具体的存储单元结构如下图,最后面的 8 个 Byte 存储 Tag 信息
K8S部署rocketmq单机和集群

2.2、Producer 与 Producer Group

Producer表示消息队列的生产者。消息队列的本质就是实现了publish-subscribe模式,生产者生产消息,消费者消费消息。所以这里的 Producer 就是用来生产和发送消息的,一般指业务系统。 RocketMQ 提供了发送:普通消息(同步、异步和单向(one-way)消息)、
定时消息、延时消息、事务消息。见 1.2 消息类型章节Producer Group 是一类 Producer 的集合名称,这类 Producer 通常发送一类消息,且发
送逻辑一致。相同角色的生产者被分组在一起。同一生产者组的另一个生产者实例可能被broker 联系,以提交或回滚事务,以防原始生产者在交易后崩溃。
警告:考虑提供的生产者在发送消息时足够强大,每个生产者组只允许一个实例,以避免对生产者实例进行不必要的初始化。

2.3、Consumer 与 Consumer Group

K8S部署rocketmq单机和集群

2.4、组件的关系

1.Broker, Producer 和 Consumer

如果不考虑负载均衡和高可用,最简单的 Broker, Producer 和 Consumer 之间的关系如下
图所示:K8S部署rocketmq单机和集群

2、Topic, Topic 分片和 Queue

Queue 是 RocketMQ 中的另一个重要概念。在对该概念进行分析介绍前,我们先来看上
面的这张图:K8S部署rocketmq单机和集群
从本质上来说, RocketMQ 中的 Queue 是数据分片的产物。为了更好地理解 Queue 的定义,我们还需要引入一个新的概念: Topic 分片。在分布式数据库和分布式缓存领域,分片概念已经有了清晰的定义。同理,对于 RocketMQ,一个 Topic 可以分布在各个 Broker 上,
我们可以把一个 Topic 分布在一个 Broker 上的子集定义为一个 Topic 分片。对应上图,TopicA 有 3 个 Topic 分片,分布在 Broker1,Broker2 和 Broker3 上, TopicB 有 2 个 Topic 分片,分布在 Broker1 和 Broker2 上, TopicC 有 2 个 Topic 分片,分布在 Broker2 和 Broker3
上。将 Topic 分片再切分为若干等分,其中的一份就是一个Queue。每个 Topic 分片等分的 Queue的数量可以不同,由用户在创建 Topic 时指定。

3、queue 数量指定方式

1、代码指定: producer.setDefaultTopicQueueNums(8);
2、配置文件指定
同时设置 broker 服务器的配置文件 broker.properties: defaultTopicQueueNums=16
3、 rocket-console 控制台指定
K8S部署rocketmq单机和集群
我们知道,数据分片的主要目的是突破单点的资源(网络带宽, CPU,内存或文件存储)限
制从而实现水平扩展。 RocketMQ 在进行 Topic 分片以后,已经达到水平扩展的目的了,为
什么还需要进一步切分为 Queue 呢?解答这个问题还需要从负载均衡说起。以消息消费为例,借用 Rocket MQ 官方文档中的
Consumer 负载均衡示意图来说明:K8S部署rocketmq单机和集群
如图所示, TOPIC_A 在一个 Broker 上的 Topic 分片有 5 个 Queue,一个 Consumer Group内有 2 个 Consumer 按照集群消费的方式消费消息,按照平均分配策略进行负载均衡得到的结果是:第一个 Consumer 消费 3 个 Queue,第二个 Consumer 消费 2 个 Queue。如果增加 Consumer,每个 Consumer 分配到的 Queue 会相应减少。 Rocket MQ 的负载均衡
策略规定: Consumer 数量应该小于等于 Queue 数量,如果 Consumer 超过 Queue 数量,那么多余的 Consumer 将不能消费消息。在一个 Consumer Group 内, Queue 和 Consumer 之间的对应关系是一对多的关系:一个Queue 最多只能分配给一个 Consumer,一个 Cosumer 可以分配得到多个 Queue。这样的
分配规则,每个 Queue 只有一个消费者,可以避免消费过程中的多线程处理和资源锁定,有效提高各 Consumer 消费的并行度和处理效率。
由此,我们可以给出 Queue 的定义:Queue 是 Topic 在一个 Broker 上的分片等分为指定份数后的其中一份,是负载均衡过程中资源分配的基本单元。

3、部署时知识简要说明

RocketMQ 主要有四大组成部分: NameServer、 Broker、 Producer、 Consumer
Nameserver 作用:
NameServer 可以说是 Broker 的注册中心, Broker 在启动的时候,会根据配置信息向所有的 NameServer 进行注册, NameServer 会和每次前来注册的 Broker 保持长连接,并每30s 检查 Broker 是否还存活,对于宕机的 Broker, NameServer 会将其从列表中剔除。当生产者需要向 Broker 发送消息的时候,就会先从 NameServer 里面获取 Broker 的地址列表,然后负载均衡,选择一台消息服务器进行发送。
RocketMQ 的部署方式有多种:
2m-noslave: 多 Master 模式,无 Slave。 [双主模式]
2m-2s-sync: 多 Master 多 Slave 模式,同步双写 [双主双从+同步模式]
2m-2s-async:多 Master 多 Slave 模式,异步复制 [双主双从+异步模式]
RocketMQ 提供了三种方式发送消息:同步、异步和单向:
同步发送: 指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。
异步发送: 指发送方发出数据后,不等接收方发回响应,接着发送下个数据包, 异步方式也
需要 Broker 返回确认信息。单向发送: 指只负责发送消息而不等待服务器回应且没有回调函数触发。
RocketMQ 三种消息发送模式的使用场景:
具体使用哪种模式,这主要是看应用场景。
同步发送:主要运用在比较重要一点消息传递/通知等业务:
异步发送:通常用于对发送消息响应时间要求更高/更快的场景:
单向发送:适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。只发送
消息,不等待服务器响应,只发送请求不等待应答。此方式发送消息的过程耗时非常短,一
般在微秒级别。
RocketMQ 端口:
rocketmq 默认端口: 9876(即 nameserver 端口)
非 vip 通道端口: 10911
vip 通道端口: 10909
10909 是 VIP 通道对应的端口,在 JAVA 中的消费者对象或者是生产者对象中关闭 VIP 通道
即可, 无需开放 10909 端口

4、单机版部署

这里我们希望使用单机版 k8s 部署一套低配置 rockerMQ, 仅启动一个 nameservice 和 1 个broker

4.1、镜像制作过程

wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-binrelease.zip
由于 ADD 指令只能解压 tar 包,所以这里将 zip 包调整为 tar 包
unzip rocketmq-all-4.8.0-bin-release.zip
[root@k8s-master01 rocketmq_image]# ll
total 13564
-rw-r–r-- 1 root rootdrwxr-xr-x 6 root root 339 Feb 2 11:52 Dockerfile103 Dec 9 19:46 rocketmq-all-4.8.0-bin-release
-rw-r–r-- 1 root root 13881969 Dec 19 19:54 rocketmq-all-4.8.0-bin-release.zip
将 runbroker.sh 脚本文件里的内存设置调整小点
[root@k8s-master01release/bin/runbroker.sh rocketmq_image]# vim rocketmq-all-4.8.0-bin


JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"


[root@k8s-master01 rocketmq_image]# tar -zvcf rocketmq-all-4.8.0-bin-release.tar.gz
rocketmq-all-4.8.0-bin-release
[root@k8s-master01 rocketmq_image]# rm -rf rocketmq-all-4.8.0-bin-release rocketmqall-4.8.0-bin-release.zip
Dockerfile 镜像文件内容:

FROM centos:centos8.3.2011
 
RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
 
ENV LANG en_US.UTF-8
 
ADD jdk-8u301-linux-x64.tar.gz /usr/java/
ADD rocketmq-all-4.8.0-bin-release.tar.gz /usr/local/
RUN mv /usr/local/rocketmq-all-4.8.0-bin-release /usr/local/rocketmq-4.8.0 \
&& mkdir -p /data/rocketmq/store

#jdk enviroment
ENV JAVA_HOME=/usr/java/jdk1.8.0_301
ENV JRE_HOME=/usr/java/jdk1.8.0_301/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=/usr/local/rocketmq-4.8.0/bin:$JAVA_HOME/bin:$PATH
 
CMD ["/bin/bash"]

制作镜像并上传到 docker Hub 仓库
[root@k8s-master01 images]# docker build -t liuyi71sinacom/rocketmq-4.8.0 .
[root@k8s-master01 images]# docker push liuyi71sinacom/rocketmq-4.8.0

4.2、yaml编写

1、namesrv

apiVersion: v1
kind: Service
metadata:
  name: rocketmq
spec:
  ports:
  - port: 9876
    protocol: TCP
    targetPort: 9876
  selector:
    app: mqnamesrv
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mqnamesrv
spec:
  serviceName: mqnamesrv
  replicas: 1
  selector:
    matchLabels:
      app: mqnamesrv
  template:
    metadata:
      labels:
        app: mqnamesrv
    spec:
      containers:
      - name: mqnamesrv
        image: liuyi71sinacom/rocketmq-4.8.0
        command: ["sh","/usr/local/rocketmq-4.8.0/bin/mqnamesrv"]
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9876
          protocol: TCP

这个yaml会创建一个名字为rocketmq为svc和名字为mqnamesrv的sts的namesrv
我这里创建一个单机版的命名空间来做单机版

kubectl create ns single

切换到这个命名空间下面

kubectl config set-context --current --namespace=single

然后执行这个yaml

2、broker yaml定义

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mqbroker
spec:
  serviceName: mqbroker
  replicas: 1
  selector:
    matchLabels:
      app: mqbroker
  template:
    metadata:
      labels:
        app: mqbroker
    spec:
      containers:
      - name: mqbroker
        image: liuyi71sinacom/rocketmq-4.8.0
        command: ["sh","/usr/local/rocketmq-4.8.0/bin/mqbroker", "-n","rocketmq:9876"]
        imagePullPolicy: IfNotPresent
        env:
        - name: JAVA_OPT
          value: "-server -XX:ParallelGCThreads=1 -Xms1g -Xmx1g -Xmn512m"
          #value: "-XX:MaxRAMPercentage=80.0"
        ports:
        - containerPort: 10909
        - containerPort: 10911
        resources:
          requests:
            memory: 128Mi
#          limits:
#            memory: 1024Mi

3、console yaml定义

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: console
  name: console
spec:
  replicas: 1
  selector:
    matchLabels:
      app: console
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: console
    spec:
      containers:
      - image: styletang/rocketmq-console-ng
        name: rocketmq-console-ng
        env: 
        - name: JAVA_OPTS
          value: "-Drocketmq.namesrv.addr=rocketmq:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: console
  name: console
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: console
status:
  loadBalancer: {}

指定了一个jvm参数rocketmq.namesrv.addr=rocketmq:9876 表示连接namesrv的地址

4、创建一个ingress来访问

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rocketmq
spec:
 ingressClassName: nginx
 rules:
 - host: bml.mq.com
   http:
     paths:
     - path: /
       backend:
         serviceName: console
         servicePort: 8080
   

然后我们在windows的hosts中配置了bml.mq.com对应的ingress svc的ip就可以访问了
K8S部署rocketmq单机和集群

5、简单测试使用

在发送/接收消息之前,我们需要告诉客户名称服务器的位置。 RocketMQ 提供了多种方法来实现这一点。为了简单起见,我们使用环境变量 NAMESRV_ADDR。通过使用 bin/tools.sh工具类,实现测试发送消息。命令行操作如下:
进入 mqbroker

kubectl exec -it mqbroker-0 -- sh

设置 Namesrv 服务器的地址

export NAMESRV_ADDR=rocketmq:9876
echo $NAMESRV_ADDR
cd /usr/local/rocketmq-4.8.0/bin/

执行生产者 Producer 发送测试消息

sh ./tools.sh org.apache.rocketmq.example.quickstart.Producer

如果发送成功,我们会看到大量成功的发送日志。
K8S部署rocketmq单机和集群
可以看到消息发送成功了,我们这边可以通过console来看发送的消息
K8S部署rocketmq单机和集群
刚刚发送了1000条消息,还没有消费,我们这用namesrv的pod里面从当消费者进行消费
测试消费消息
通过使用 bin/tools.sh 工具类,实现测试消费消息。命令行操作如下:
设置 Namesrv 服务器的地址

 export NAMESRV_ADDR= rocketmq:9876
echo $NAMESRV_ADDR
cd /usr/local/rocketmq-4.8.0/bin/

执行消费者 Consumer 消费测试消息

sh ./tools.sh org.apache.rocketmq.example.quickstart.Consumer

如果消费成功,我们会看到大量成功的消费日志。
K8S部署rocketmq单机和集群
通过日志可以看到消息被消费了,我们再通过console来看下
K8S部署rocketmq单机和集群
到现在单机版安装部署验证完成

5、常用 rocketmq 命令

上面几个启动和关闭 name server 和 broker 的就不再说了,先进入 bin 目录: # cd bin。
#查看集群情况

./mqadmin clusterList -n rocketmq:9876

#查看 broker 状态

./mqadmin brokerStatus -n rocketmq:9876 -b 172.19.152.208:10911(注意换成你的 broker 地址)

#查看 topic 列表

./mqadmin topicList -n 1 rocketmq:9876

#查看 topic 状态

./mqadmin topicStatus -n rocketmq:9876 -t MyTopic(换成你想查询的 topic)

#查看 topic 路由

./mqadmin topicRoute -n rocketmq:9876 -t MyTopic

6、集群部署

在生产环境下,必须搭建 RocketMQ 高可用集群, 对高性能有比较强的诉求,使用两主两从, 同步模式。

切回命名空间default

kubectl config set-context --current --namespace=default

6.1、部署描述

  1. Producer
    Producer 自身在应用中,所以无需考虑高可用。
    Producer 配置多个 Namesrv 列表,从而保证 Producer 和 Namesrv 的连接高可用。并且,会从 Namesrv 定时拉取最新的 Topic 信息。
    Producer 会和所有 Consumer 直连,在发送消息时,会选择一个 Broker 进行发送。如果发送失败,则会使用另外一个 Broker 。Producer 会定时向 Broker 心跳,证明其存活。而 Broker 会定时检测,判断是否有Producer 异常下线。

  2. Consumer
    Consumer 需要部署多个节点,以保证 Consumer 自身的高可用。当相同消费者分组中有新的 Consumer 上线,或者老的 Consumer 下线,会重新分配 Topic 的 Queue 到目前消费分组的 Consumer 们。Consumer 配置多个 Namesrv 列表,从而保证 Consumer 和 Namesrv 的连接高可用。并且,会从 Consumer 定时拉取最新的 Topic 信息。Consumer 会和所有 Broker 直连,消费相应分配到的 Queue 的消息。如果消费失败,则会发回消息到 Broker 中。
    Consumer 会定时向 Broker 心跳,证明其存活。而 Broker 会定时检测,判断是否有Consumer 异常下线。

  3. Namesrv
    Namesrv 需要部署多个节点,以保证 Namesrv 的高可用。Namesrv 本身是无状态,不产生数据的存储,是通过 Broker 心跳将 Topic 信息同步到
    Namesrv 中。多个 Namesrv 之间不会有数据的同步,是通过 Broker 向多个 Namesrv 多写。

  4. Broker多个 Broker 可以形成一个 Broker 分组。每个 Broker 分组存在一个 Master 和多个 Slave节点。
    Master 节点,可提供读和写功能。 Slave 节点,可提供读功能。Master 节点会不断发送新的 CommitLog 给 Slave 节点。 Slave 节点不断上报本地的CommitLog 已经同步到的位置给 Master 节点。Slave 节点会从 Master 节点拉取消费进度、 Topic 配置等等。多个 Broker 分组,形成 Broker 集群。Broker 集群和集群之间,不存在通信与数据同步。Broker 可以配置同步刷盘或异步刷盘,根据消息的持久化的可靠性来配置。
    部署总结:
    本案例部署的是 RocketMQ 的"双主双从+同步模式",涉及 6 个 pod:
    broker-a 主 1
    broker-b 主 2
    broker-a-s 从 1
    broker-b-s 从 2
    NameServer(注册中心)
    Console(可视化 web 界面)

6.2、使用 NFS 配置 StatefulSet 的动态持久化存储

StatefulSet 使用 volumeClaimTemplates使用 NFS 作为 StatefulSet 持久化存储的操作记录,分别需要创建 nfs-provisioner 的 rbac、storageclass、 nfs-client-provisioner 和 statefulset 的 pod。

6.3、创建 RocketMQ 集群(双主双从异步模式)

使用镜像 rocketmq-4.8.0
使用 Statefulset 部署每一个组件。

rw-r--r-- 1 root root 2437 Jan 19 21:16 broker-a-s.yaml
-rw-r--r-- 1 root root 2317 Jan 19 21:16 broker-a.yaml
-rw-r--r-- 1 root root 2436 Jan 19 21:16 broker-b-s.yaml
-rw-r--r-- 1 root root 2317 Jan 19 21:16 broker-b.yaml
drwxr-xr-x 2 root root  118 Jan 19 21:16 config
-rw-r--r-- 1 root root 1644 Jan 19 21:16 namesrv.yaml
[root@k8s-master cluster]# 

config里面是配置文件,如下:

-rw-r--r-- 1 root root 409 Jan 19 21:16 broker-a.properties 主1配置文件
-rw-r--r-- 1 root root 432 Jan 19 21:16 broker-a-s.properties 从1配置文件
-rw-r--r-- 1 root root 433 Jan 19 21:16 broker-b.properties 主2配置文件
-rw-r--r-- 1 root root 432 Jan 19 21:16 broker-b-s.properties 从2配置文件
[root@k8s-master config]# 

6.4、配置文件详情

1、broker-a.properties 配置文件

brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerId=0
namesrvAddr=rocketmq-0.rocketmq:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=20911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/data/rocketmq/store
maxMessageSize=65536
brokerRole=MASTER

2、broker-a-s.properties配置文件

brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerId=1
namesrvAddr=rocketmq-0.rocketmq:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=20911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/data/rocketmq/store
maxMessageSize=65536
brokerRole=SLAVE
flushDiskType=SYNC_FLUSH

3、broker-b.properties 配置文件

brokerClusterName=rocketmq-cluster
brokerName=broker-b
brokerId=0
namesrvAddr=rocketmq-0.rocketmq:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=20911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/data/rocketmq/store
maxMessageSize=65536
brokerRole=MASTER
flushDiskType=SYNC_FLUSH

3、broker-b-s.properties 配置文件

brokerClusterName=rocketmq-cluster
brokerName=broker-b
brokerId=1
namesrvAddr=rocketmq-0.rocketmq:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=20911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/data/rocketmq/store
maxMessageSize=65536
brokerRole=SLAVE
flushDiskType=SYNC_FLUSH

6.5、准备配置文件,创建 configmap

RocketMQ 默认提供的配置文件都是最基本的,很多配置都是默认值,在生产环境中我们需要根据实际情况进行修改。
broker 的端口是 20911、 nameserver 的端口是 9876
依据上面 rocketmq 的 4 个配置文件创建 configmap 存储卷

kubectl create cm rocketmq-config --from-file=broker-a.properties --from-file=broker-a-s.properties --from-file=broker-b.properties --from-file=broker-b-s.properties 

查看cm rocketmq-config:
K8S部署rocketmq单机和集群

6.6、namesrv安装

apiVersion: v1
kind: Service
metadata:
  labels:
    app: mq-namesrv
  name: rocketmq
spec:
  ports:
  - port: 9876
    targetPort: 9876
    name: namesrv-port
  selector:
    app: mq-namesrv
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rocketmq
spec:
  serviceName: rocketmq
  replicas: 1
  selector:
    matchLabels:
      app: mq-namesrv
  template:
    metadata:
     labels:
       app: mq-namesrv
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - mq-namesrv
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: mq-namesrv
        image: liuyi71sinacom/rocketmq-4.8.0
        imagePullPolicy: IfNotPresent
        command: ["sh","/usr/local/rocketmq-4.8.0/bin/mqnamesrv"]
        ports:
        - containerPort: 9876
          protocol: TCP
        env:
        - name: JAVA_OPT
          value: "-server -XX:ParallelGCThreads=1 -Xms1g -Xmx1g -Xmn512m"
          #value: "-XX:MaxRAMPercentage=80.0"
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh","-c","touch /tmp/health"]
        livenessProbe:
          exec:
            command: ["test","-e","/tmp/health"]
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
        readinessProbe:
          tcpSocket:
            port: 9876
          initialDelaySeconds: 15
          timeoutSeconds: 5
          periodSeconds: 20

执行这个yaml
K8S部署rocketmq单机和集群

6.7、broker安装

1、主1配置文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: broker-a
  name: broker-a
spec:
  ports:
  - port: 20911
    targetPort: 20911
    name: broker-port
  selector:
    app: broker-a
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: broker-a
spec:
  serviceName: broker-a
  replicas: 1
  selector:
    matchLabels:
      app: broker-a
  template:
    metadata:
     labels:
       app: broker-a
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - broker-a
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: broker-a
        image: liuyi71sinacom/rocketmq-4.8.0
        imagePullPolicy: IfNotPresent
        command: ["sh","-c","mqbroker  -c /usr/local/rocketmq-4.8.0/conf/broker-a.properties"]
        env:
        - name: JAVA_OPT
          value: "-server -XX:ParallelGCThreads=1 -Xms1g -Xmx1g -Xmn512m"
          #value: "-XX:MaxRAMPercentage=80.0"
        volumeMounts:
          - mountPath: /root/logs
            name: rocketmq-data
            subPath: mq-brokeroptlogs
          - mountPath: /data/rocketmq
            name: rocketmq-data
            subPath: mq-brokeroptstore
          - name: broker-config
            mountPath: /usr/local/rocketmq-4.8.0/conf/broker-a.properties
            subPath: broker-a.properties
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh","-c","touch /tmp/health"]
        livenessProbe:
          exec:
            command: ["test","-e","/tmp/health"]
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
        readinessProbe:
          tcpSocket:
            port: 20911
          initialDelaySeconds: 15
          timeoutSeconds: 5
          periodSeconds: 20
      volumes:
      - name: broker-config
        configMap:
          name: rocketmq-config
  volumeClaimTemplates:
  - metadata:
      name: rocketmq-data
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi

2、从1配置文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: broker-a-s
  name: broker-a-s
spec:
  ports:
  - port: 20911
    targetPort: 20911
    name: broker-port
  selector:
    app: broker-a-s
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: broker-a-s
spec:
  serviceName: broker-a-s
  replicas: 1
  selector:
    matchLabels:
      app: broker-a-s
  template:
    metadata:
     labels:
       app: broker-a-s
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - broker-a-s
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: broker-a-s
        image: liuyi71sinacom/rocketmq-4.8.0
        imagePullPolicy: IfNotPresent
        command: ["sh","-c","mqbroker  -c /usr/local/rocketmq-4.8.0/conf/broker-a-s.properties"]
        env:
        - name: JAVA_OPT
          value: "-server -XX:ParallelGCThreads=1 -Xms1g -Xmx1g -Xmn512m"
          #value: "-XX:MaxRAMPercentage=80.0"
        volumeMounts:
          - mountPath: /root/logs
            name: rocketmq-data
            subPath: mq-brokeroptlogs
          - mountPath: /data/rocketmq
            name: rocketmq-data
            subPath: mq-brokeroptstore
          - name: broker-config
            mountPath: /usr/local/rocketmq-4.8.0/conf/broker-a-s.properties
            subPath: broker-a-s.properties
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh","-c","touch /tmp/health"]
        livenessProbe:
          exec:
            command: ["test","-e","/tmp/health"]
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
        readinessProbe:
          tcpSocket:
            port: 20911
          initialDelaySeconds: 15
          timeoutSeconds: 5
          periodSeconds: 20
      volumes:
      - name: broker-config
        configMap:
          name: rocketmq-config
          items:
          - key: broker-a-s.properties
            path: broker-a-s.
  volumeClaimTemplates:properties
  - metadata:
      name: rocketmq-data
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi

3、主2配置文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: broker-b
  name: broker-b
spec:
  ports:
  - port: 20911
    targetPort: 20911
    name: broker-port
  selector:
    app: broker-b
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: broker-b
spec:
  serviceName: broker-b
  replicas: 1
  selector:
    matchLabels:
      app: broker-b
  template:
    metadata:
     labels:
       app: broker-b
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - broker-b
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: broker-b
        image: liuyi71sinacom/rocketmq-4.8.0
        imagePullPolicy: IfNotPresent
        command: ["sh","-c","mqbroker  -c /usr/local/rocketmq-4.8.0/conf/broker-b.properties"]
        env:
        - name: JAVA_OPT
          value: "-server -XX:ParallelGCThreads=1 -Xms1g -Xmx1g -Xmn512m"
          #value: "-XX:MaxRAMPercentage=80.0"
        volumeMounts:
          - mountPath: /root/logs
            name: rocketmq-data
            subPath: mq-brokeroptlogs
          - mountPath: /data/rocketmq
            name: rocketmq-data
            subPath: mq-brokeroptstore
          - name: broker-config
            mountPath: /usr/local/rocketmq-4.8.0/conf/broker-b.properties
            subPath: broker-b.properties
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh","-c","touch /tmp/health"]
        livenessProbe:
          exec:
            command: ["test","-e","/tmp/health"]
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
        readinessProbe:
          tcpSocket:
            port: 20911
          initialDelaySeconds: 15
          timeoutSeconds: 5
          periodSeconds: 20
      volumes:
      - name: broker-config
        configMap:
          name: rocketmq-config
  volumeClaimTemplates:
  - metadata:
      name: rocketmq-data
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi

4、从2配置文件

apiVersion: v1
kind: Service
metadata:
  labels:
    app: broker-b-s
  name: broker-b-s
spec:
  ports:
  - port: 20911
    targetPort: 20911
    name: broker-port
  selector:
    app: broker-b-s
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: broker-b-s
spec:
  serviceName: broker-b-s
  replicas: 1
  selector:
    matchLabels:
      app: broker-b-s
  template:
    metadata:
     labels:
       app: broker-b-s
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - broker-b-s
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: broker-b-s
        image: liuyi71sinacom/rocketmq-4.8.0
        imagePullPolicy: IfNotPresent
        command: ["sh","-c","mqbroker -c /usr/local/rocketmq-4.8.0/conf/broker-b-s.properties"]
        env:
        - name: JAVA_OPT
          value: "-server -XX:ParallelGCThreads=1 -Xms1g -Xmx1g -Xmn512m"
          #value: "-XX:MaxRAMPercentage=80.0"
        volumeMounts:
          - mountPath: /root/logs
            name: rocketmq-data
            subPath: mq-brokeroptlogs
          - mountPath: /data/rocketmq
            name: rocketmq-data
            subPath: mq-brokeroptstore
          - name: broker-config
            mountPath: /usr/local/rocketmq-4.8.0/conf/broker-b-s.properties
            subPath: broker-b-s.properties
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh","-c","touch /tmp/health"]
        livenessProbe:
          exec:
            command: ["test","-e","/tmp/health"]
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
        readinessProbe:
          tcpSocket:
            port: 20911
          initialDelaySeconds: 15
          timeoutSeconds: 5
          periodSeconds: 20
      volumes:
      - name: broker-config
        configMap:
          name: rocketmq-config
          items:
          - key: broker-b-s.properties
            path: broker-b-s.properties
  volumeClaimTemplates:
  - metadata:
      name: rocketmq-data
      annotations:
        volume.beta.kubernetes.io/storage-class: "nfs"
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi

执行安装,安装成功以后如下:
K8S部署rocketmq单机和集群
我这电脑资源不够了,始终有一台起不来,但是安装过程是没有问题的,文件也是没有问题的,后面给电脑加点资源再测试
安装完成以后,把ingress和console安装了,和之前的一样,可以通过控制台来访问

第二天我把k8s加了内存过后,启动就正常了,如下图:
K8S部署rocketmq单机和集群
ocketmq-0是namesvr,然后我重新部署了console,console如下图:
K8S部署rocketmq单机和集群
至此,k8s部署rocketmq就完成了

安装文件

有道云笔记里面有附件,这里么有上传:
链接:http://note.youdao.com/noteshare?id=57071743fbef85caf401a04546e5157d&sub=D06D665CBE0D418196DE5F5024879401

上一篇:rocketmq安装部署 ,运行避坑(python3)


下一篇:【软件测试】盘一盘工作中遇到的 MQ 异常测试