K8S部署rocketmq单机和集群

2023-11-05

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。
在这里插入图片描述
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 的关系图:
在这里插入图片描述
Tags
Tags 是 Topic 下的次级消息类型/二级类型(注: Tags 也支持 TagA ||TagB 这样的表达式),可以在同一个 Topic 下基于 Tags 进行消息过滤。 Tags
的过滤需要经过两次比对,首先会在 Broker 端通过 Tag hashcode 进行一次比对过滤,匹配成功传到 consumer 端后再对具体 Tags 进行比对,以防止
Tag hashcode 重复的情况。比如交易消息又可以分为:交易创建消息,交易完成消息… 一条消息可以没有 Tag。 RocketMQ 提供 2 级消息分类,方便大家灵活控制。标签,换句话说,为用户提供了额外的灵活性。有了标签,来自同一个业务模块的不同目的的消息可能具有相同的主题和不同的标签。标
签将有助于保持您的代码干净和连贯,并且标签还可以为 RocketMQ 提供的查询系统提供帮助。
• Queue 中具体的存储单元结构如下图,最后面的 8 个 Byte 存储 Tag 信息
在这里插入图片描述

2.2、Producer 与 Producer Group

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

2.3、Consumer 与 Consumer Group

在这里插入图片描述

2.4、组件的关系

1.Broker, Producer 和 Consumer

如果不考虑负载均衡和高可用,最简单的 Broker, Producer 和 Consumer 之间的关系如下
图所示:在这里插入图片描述

2、Topic, Topic 分片和 Queue

Queue 是 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 控制台指定
在这里插入图片描述
我们知道,数据分片的主要目的是突破单点的资源(网络带宽, CPU,内存或文件存储)限
制从而实现水平扩展。 RocketMQ 在进行 Topic 分片以后,已经达到水平扩展的目的了,为
什么还需要进一步切分为 Queue 呢?解答这个问题还需要从负载均衡说起。以消息消费为例,借用 Rocket MQ 官方文档中的
Consumer 负载均衡示意图来说明:在这里插入图片描述
如图所示, 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就可以访问了
在这里插入图片描述

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

如果发送成功,我们会看到大量成功的发送日志。
在这里插入图片描述
可以看到消息发送成功了,我们这边可以通过console来看发送的消息
在这里插入图片描述
刚刚发送了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

如果消费成功,我们会看到大量成功的消费日志。
在这里插入图片描述
通过日志可以看到消息被消费了,我们再通过console来看下
在这里插入图片描述
到现在单机版安装部署验证完成

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:
在这里插入图片描述

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
在这里插入图片描述

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

执行安装,安装成功以后如下:
在这里插入图片描述
我这电脑资源不够了,始终有一台起不来,但是安装过程是没有问题的,文件也是没有问题的,后面给电脑加点资源再测试
安装完成以后,把ingress和console安装了,和之前的一样,可以通过控制台来访问

第二天我把k8s加了内存过后,启动就正常了,如下图:
在这里插入图片描述
ocketmq-0是namesvr,然后我重新部署了console,console如下图:
在这里插入图片描述
至此,k8s部署rocketmq就完成了

安装文件

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S部署rocketmq单机和集群 的相关文章

随机推荐

  • spring 01 :基础(IoC控制反转、DI依赖注入)、整合Junit、整合web

    struts web层 比较简单 ValueStack值栈 拦截器 hibernate dao层 知识点杂 spring service层 重要 会多少用多少 gt 了解 spring day01 基础 IoC控制反转 DI依赖注入 整合J
  • 《数据安全法》今日实施,中国信通院联合百度等企业发起“数据安全推进计划”

    9月1日讯 数据安全法 今天正式实施 个人信息保护法 也将于11月1日实施 这标志着我国数据安全制度建设进入了新的阶段 发展数字经济 加快培育数据要素市场 必须把保障数据安全放在突出位置 为推动法律法规及监管要求的贯彻落实 促进数据安全技术
  • Raid0、Raid1、Raid5及Raid10的区别

    博主推荐谷歌搜索 看Youtube视频 国外学习网站 Github必备神器 SockBoom 或者网址 SockBoomhttps sockboom shop auth register affid 212828 一 概况 Raid Red
  • Python中 ''.JOIN()的用法

    Python join 方法 描述 将序列中的元素以指定的字符连接生成一个新的字符串 语法 语法 sep join seq 参数说明 sep 分隔符 可以为空 seq 要连接的元素序列 字符串 元组 字典 返回值 返回通过指定字符连接序列中
  • 机器自主学习创造新数据

    近年来 人工智能 AI 的发展带来了许多革命性的改变 其中 生成式AI Generative AI 也被称为AIGC Artificial IntelligenceGenerated Content 引起了人们的极大关注 生成式AI是一种使
  • 内存回收

    内存回收 内存状态分为 使用 未使用 可回收 这几点有啥区别 使用 标记状态已使用 未使用 使用地址到结束地址 可回收 标记状态为回收 怎么判断内存可回收 因为调用释放接口了 怎么回收性能高 批量回收 不要回收太频繁 避免磁盘碎片 磁盘内碎
  • QT基础:QPainte 绘制文本并设置动态设置字体演示

    QPainte 是QT里面的一个绘制控件 这里演示的是 用 QPainte 绘制一个文本 并通过 ui 上的 fontComboBox 控件 改变文本字体后触发 widget 槽函数 update 来刷新界面 演示过于简单 适合初学者食用
  • 揭开gRPC神秘面纱

    一 什么是RPC RPC Remote Procedure Call 远程过程调用 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的思想 RPC 是一种技术思想而非一种规范或协议 常见 RPC 技术和框架有 应用级的服
  • el-submenu实现单个菜单折叠

    以上的效果就是 我打开 系统管理 折叠框 然后再打开 采集服务器 折叠框 这样一来的话就会让这个navMenu显得很高 严重的情况 就会撑破整个页面 怎么办呢 element代码实现如下
  • 进程和线程、协程的区别

    一 进程 进程是程序一次动态执行的过程 是程序运行的基本单位 每个进程都有自己的独立内存空间 不同进程通过进程间通信来通信 进程占据独立的内存 所以上下文进程间的切换开销 栈 寄存器 页表 文件句柄等 比较大 但相对比较稳定安全 协程切换和
  • ESP32C3对接阿里云生活物联网平台

    文章目录 1 装好ESP32 VSCode开发环境 2 git阿里云代码 3 先编译例程 看看能否编译成功 4 创建分区表 增加ota分区 5 查看分区空间 6 擦除整片Flash 7 未烧录四元组情况下 看看会报什么错 8 阿里云四元组
  • 使用EDU邮箱申请JetBrains学生包免费使用一年JetBrains全家桶

    写在最前 使用EDU邮箱申请JetBrains学生包可以免费使用一年JetBrains全家桶 欢迎光顾本人的博客 以后会经常记录生活点滴 学习工作所见 1 首先你需要一个EDU邮箱 JetBrains学生包的申请很简单 所以国内的EDU邮箱
  • java后台地址(省,市,区)、姓名、手机号算法智能识别

    最近项目中需要根据前台需要识别的信息去做后台处理 根据地址识别出来姓名 手机号 以及地址信息返回给前端 我借用了一套算法 这套算法是androi开发时候用的 我门java用的时候需要修改里面部分内容 用的时候项目中也必须要有封装好的省 市
  • BigDecimal转String类型

    从数据库取出一个NUMBER类型的值 在代码中要转成Integer类型的时候 代码如下 int a map get CONSTRICTION 报错 Cannot cast from Object to int Integer parseIn
  • OpenWrt UCI 学习笔记

    UCI Unified Configuration Interface 统一配置接口 是OpenWrt的集中配置管理工具 关于UCI的具体介绍可以查看官方文档 The UCI System 可以通过ubuntu安装UCI或使用openwrt
  • 当语音识别搭配AI之后,我的语音助手更懂我的心了

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯云AI中心发表于云 社区专栏 我今天演讲主要分四个部分 第一个是分享语音识别概述 然后是深度神经网络的基础 接下来就是深度学习在语音识别声学模型上面的应用 最后要分享的是语
  • MapReduce分片阶段详解

    MapReduce作为第一代的大数据计算引擎 其经典地位至今仍然得到认可 MapReduce之后的Spark计算引擎 本质上来说 依然是借用了MapReduce的核心思想 今天的大数据技术分享 我们就主要来讲讲MapReduce计算前的准备
  • 关于jsp文件中写System类报错问题

    我最近在学习javaWeb时出现几个莫名其妙的问题 我解决问题之后 觉得还是把这些坑都写清楚 方便javaweb的初学者避坑 用IDEA的tomcat7插件或者tomcat低版本 JDK高版本会遇到这个问题 我刚开始用的是IDEA的tomc
  • python判断今天周几_如何用python判断今天是星期几

    本文利用Python计算今天日期 明天日期 和昨天日期的相关方法 及获取当前日期是星期几 python编程操作日期时间主要用到的python模块是datetime和time这2个模块 获取星期几from datetime import da
  • K8S部署rocketmq单机和集群

    K8S部署rocketmq单机和集群 版本 Rocketmq介绍 RocketMQ 的核心概念 2 1 Topic Queue tags 2 2 Producer 与 Producer Group 2 3 Consumer 与 Consum