kubebetes 搭建rocketmq集群
k8s 部署rocketmq集群
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端口
本案例部署的是RocketMQ的"双主双从+同步模式",涉及6个pod:
- broker-a 主1
- broker-b 主2
- broker-a-s 从1
- broker-a-s 从2
- NameServer(注册中心)
- mq-console(可视化web界面)
部署说明
本次部署主双从集群
rocketmq根据官方部署制作镜像参考:https://www.cnblogs.com/pgy674477230/p/15601744.html
准备集群broker配置文件
配置文件说明参考文章:https://www.cnblogs.com/pgy674477230/p/16287735.html
mq-broker-a.conf
brokerClusterName=k8s-mq-cluster brokerName=broker-a brokerId=1 deleteWhen=04 fileReservedTime=120 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=10911
mq-broker-a-s.conf
brokerClusterName=k8s-mq-cluster brokerName=broker-a brokerId=2 deleteWhen=04 fileReservedTime=120 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH listenPort=10911
mq-broker-b.conf
brokerClusterName=k8s-mq-cluster brokerName=broker-b brokerId=1 deleteWhen=04 fileReservedTime=120 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=11011
mq-broker-b-s.conf
brokerClusterName=k8s-mq-cluster brokerName=broker-b brokerId=2 deleteWhen=04 fileReservedTime=120 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH listenPort=11011
创建k8s cm配置管理
命令说明:kubectl create cm cmname --from-file=filename -n namespace
kubectl create cm mq-broker-a --from-file=mq-broker-a.conf kubectl create cm mq-broker-a-s --from-file=mq-broker-a-s.conf kubectl create cm mq-broker-b --from-file=mq-broker-b.conf kubectl create cm mq-broker-b-s --from-file=mq-broker-b-s.conf
查看创建结果:
kubectl -n namespace get cm cmname
[root@k8s-master-1 ~]# kubectl -n test get cm mq-broker-a NAME DATA AGE mq-broker-a 1 20h
查看具体内容:
[root@k8s-master-1 ~]# kubectl -n test describe cm mq-broker-a Name: mq-broker-a Namespace: test03 Labels: <none> Annotations: <none> Data ==== broker-a.conf: ---- brokerClusterName=k8s-mq-cluster brokerName=broker-a brokerId=1 deleteWhen=04 fileReservedTime=120 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH listenPort=10911 Events: <none>
部署nameserver
部署nameserver节点1
部署StatefulSets或者是Deployments
cat nameserver-01.yml
kind: StatefulSet apiVersion: apps/v1 metadata: name: nameserver-01 namespace: test labels: app: nameserver-01 spec: replicas: 1 selector: matchLabels: app: nameserver-01 template: metadata: labels: app: nameserver-01 annotations: kubectl.kubernetes.io/restartedAt: '2022-06-01T03:36:04.740Z' spec: containers: - name: nameserver-01 image: testregister/public/rocketmq:4.9.3 command: - sh args: - mqnamesrv ports: - name: ports containerPort: 9876 protocol: TCP resources: {} imagePullPolicy: IfNotPresent restartPolicy: Always
创建service关联pod对外提供服务
cat nameserver-01-svc.yml
kind: Service apiVersion: v1 metadata: name: nameserver-01 namespace: test spec: ports: - name: ports protocol: TCP port: 9876 targetPort: 9876 selector: app: nameserver-01 clusterIP: type: ClusterIP
部署nameserver节点2
部署StatefulSets或者是Deployments
cat nameserver-02.yml
kind: StatefulSet apiVersion: apps/v1 metadata: name: nameserver-02 namespace: test labels: app: nameserver-02 spec: replicas: 1 selector: matchLabels: app: nameserver-02 template: metadata: labels: app: nameserver-02 annotations: kubectl.kubernetes.io/restartedAt: '2022-06-01T03:36:04.740Z' spec: containers: - name: nameserver-02 image: testregister/public/rocketmq:4.9.3 command: - sh args: - mqnamesrv ports: - name: ports containerPort: 9876 protocol: TCP resources: {} imagePullPolicy: IfNotPresent restartPolicy: Always
创建service关联pod对外提供服务
cat nameserver-02-svc.yml
kind: Service apiVersion: v1 metadata: name: nameserver-02 namespace: test spec: ports: - name: ports protocol: TCP port: 9876 targetPort: 9876 selector: app: nameserver-02 clusterIP: type: ClusterIP
部署mq-console 可视化界面
为了后续部署broker调试方便优先部署mq-console
cat mq-console.yml
kind: Deployment apiVersion: apps/v1 metadata: name: mq-console namespace: test labels: app: mq-console kubepi.org/name: mq-console annotations: deployment.kubernetes.io/revision: '4' spec: replicas: 1 selector: matchLabels: app: mq-console kubepi.org/name: mq-console template: metadata: creationTimestamp: null labels: app: mq-console kubepi.org/name: mq-console spec: containers: - name: container-0 image: apacherocketmq/rocketmq-dashboard:1.0.0 ports: - name: ports containerPort: 8080 protocol: TCP env: - name: JAVA_OPTS value: >- -Drocketmq.namesrv.addr=nameserver-01:9876;nameserver-02:9876;nameserver-03:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false resources: {} imagePullPolicy: IfNotPresent restartPolicy: Always
部署broker节点
部署broker-a
部署StatefulSets或者是Deployments
cat mq-broker-a.yml
kind: StatefulSet apiVersion: apps/v1 metadata: name: mq-broker-a namespace: test labels: app: rockermq-broker kubepi.org/name: mq-broker-a spec: replicas: 1 selector: matchLabels: app: rockermq-broker kubepi.org/name: mq-broker-a template: metadata: labels: app: rockermq-broker kubepi.org/name: mq-broker-a spec: volumes: - name: mq-broker-a # 挂载broker的cm配置 configMap: name: mq-broker-a defaultMode: 493 containers: - name: container-0 image: testregister/public/rocketmq:4.9.3 command: - sh args: - mqbroker - '-c' - /opt/broker-a.conf #指定启动配置文件 ports: - name: listenport containerPort: 10911 protocol: TCP - name: fastlistenport containerPort: 10909 protocol: TCP - name: halistenport containerPort: 10912 protocol: TCP env: - name: NAMESRV_ADDR #指定nameserver的serivce名称和端口 value: nameserver-01:9876;nameserver-02:9876;nameserver-03:9876 - name: JAVA_OPT_EXT # 默认主机内存>16G 使用8G内存,需指定,否则无法启动 value: '-server -Xms256m -Xmx256m -Xmn256m' resources: {} volumeMounts: - name: data mountPath: /home/rocketmq/store - name: mq-broker-a mountPath: /opt - name: data mountPath: /home/rocketmq/logs imagePullPolicy: IfNotPresent restartPolicy: Always volumeClaimTemplates: - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data creationTimestamp: null spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: managed-nfs-storage volumeMode: Filesystem
部署broker-a-s
部署StatefulSets或者是Deployments
cat mq-broker-a-s.yml
kind: StatefulSet apiVersion: apps/v1 metadata: name: mq-broker-a-s namespace: test labels: app: rockermq-broker kubepi.org/name: mq-broker-a-s spec: replicas: 1 selector: matchLabels: app: rockermq-broker kubepi.org/name: mq-broker-a-s template: metadata: labels: app: rockermq-broker kubepi.org/name: mq-broker-a-s spec: volumes: - name: mq-broker-a-s # 挂载broker的cm配置 configMap: name: mq-broker-a-s defaultMode: 493 containers: - name: container-0 image: testregister/public/rocketmq:4.9.3 command: - sh args: - mqbroker - '-c' - /opt/broker-a-s.conf #指定启动配置文件 ports: - name: listenport containerPort: 10911 protocol: TCP - name: fastlistenport containerPort: 10909 protocol: TCP - name: halistenport containerPort: 10912 protocol: TCP env: - name: NAMESRV_ADDR #指定nameserver的serivce名称和端口 value: nameserver-01:9876;nameserver-02:9876;nameserver-03:9876 - name: JAVA_OPT_EXT # 默认主机内存>16G 使用8G内存,需指定,否则无法启动 value: '-server -Xms256m -Xmx256m -Xmn256m' resources: {} volumeMounts: - name: data mountPath: /home/rocketmq/store - name: mq-broker-a-s mountPath: /opt - name: data mountPath: /home/rocketmq/logs imagePullPolicy: IfNotPresent restartPolicy: Always volumeClaimTemplates: - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data creationTimestamp: null spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: managed-nfs-storage volumeMode: Filesystem
部署broker-b
部署StatefulSets或者是Deployments
cat mq-broker-b.yml
kind: StatefulSet apiVersion: apps/v1 metadata: name: mq-broker-b namespace: test labels: app: rockermq-broker kubepi.org/name: mq-broker-b spec: replicas: 1 selector: matchLabels: app: rockermq-broker kubepi.org/name: mq-broker-b template: metadata: labels: app: rockermq-broker kubepi.org/name: mq-broker-b spec: volumes: - name: mq-broker-b # 挂载broker的cm配置 configMap: name: mq-broker-b defaultMode: 493 containers: - name: container-0 image: testregister/public/rocketmq:4.9.3 command: - sh args: - mqbroker - '-c' - /opt/broker-b.conf #指定启动配置文件 ports: - name: listenport containerPort: 10911 protocol: TCP - name: fastlistenport containerPort: 10909 protocol: TCP - name: halistenport containerPort: 10912 protocol: TCP env: - name: NAMESRV_ADDR #指定nameserver的serivce名称和端口 value: nameserver-01:9876;nameserver-02:9876;nameserver-03:9876 - name: JAVA_OPT_EXT # 默认主机内存>16G 使用8G内存,需指定,否则无法启动 value: '-server -Xms256m -Xmx256m -Xmn256m' resources: {} volumeMounts: - name: data mountPath: /home/rocketmq/store - name: mq-broker-b mountPath: /opt - name: data mountPath: /home/rocketmq/logs imagePullPolicy: IfNotPresent restartPolicy: Always volumeClaimTemplates: - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data creationTimestamp: null spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: managed-nfs-storage volumeMode: Filesystem
部署broker-b
部署StatefulSets或者是Deployments
cat mq-broker-b-s.yml
kind: StatefulSet apiVersion: apps/v1 metadata: name: mq-broker-b-s namespace: test labels: app: rockermq-broker kubepi.org/name: mq-broker-b-s spec: replicas: 1 selector: matchLabels: app: rockermq-broker kubepi.org/name: mq-broker-b-s template: metadata: labels: app: rockermq-broker kubepi.org/name: mq-broker-b-s spec: volumes: - name: mq-broker-b-s # 挂载broker的cm配置 configMap: name: mq-broker-b-s defaultMode: 493 containers: - name: container-0 image: testregister/public/rocketmq:4.9.3 command: - sh args: - mqbroker - '-c' - /opt/broker-b-s.conf #指定启动配置文件 ports: - name: listenport containerPort: 10911 protocol: TCP - name: fastlistenport containerPort: 10909 protocol: TCP - name: halistenport containerPort: 10912 protocol: TCP env: - name: NAMESRV_ADDR #指定nameserver的serivce名称和端口 value: nameserver-01:9876;nameserver-02:9876;nameserver-03:9876 - name: JAVA_OPT_EXT # 默认主机内存>16G 使用8G内存,需指定,否则无法启动 value: '-server -Xms256m -Xmx256m -Xmn256m' resources: {} volumeMounts: - name: data mountPath: /home/rocketmq/store - name: mq-broker-b-s mountPath: /opt - name: data mountPath: /home/rocketmq/logs imagePullPolicy: IfNotPresent restartPolicy: Always volumeClaimTemplates: - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data creationTimestamp: null spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: managed-nfs-storage volumeMode: Filesystem
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)