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