作品展示的網(wǎng)站百度下載正版
Rocketmq
rocketmq角色
RocketMQ由四部分構(gòu)成:Producer、Consumer、Broker和NameServer
啟動順序:NameServer->Broker
為了消除單點(diǎn)故障,增加可靠性或增大吞吐量,可以在多臺機(jī)器上部署多個nameserver和broker,并且為每個broker部署1個或多個slave
Topic & message queue:一個分布式消息隊列中間件部署好以后,可以給很多個業(yè)務(wù)提供服務(wù),同一個業(yè)務(wù)也有不同類型的消息要投遞,這些不同類型的消息以不同的 Topic 名稱來區(qū)分。所以發(fā)送和接收消息前,先創(chuàng)建topic,針對某個 Topic 發(fā)送和接收消息。有了 Topic 以后,還需要解決性能問題 。 如果一個Topic 要發(fā)送和接收的數(shù)據(jù)量非常大, 需要能支持增加并行處理的機(jī)器來提高處理速度,這時候一個 Topic 可以根據(jù)需求設(shè)置一個或多個 Message Queue, Message Queue 類似分區(qū)或 Partition 。Topic有了多個 Message Queue 后,消息可以并行地向各個Message Queue 發(fā)送,消費(fèi)者也可以并行地從多個 Message Queue 讀取消息并消費(fèi) 。
rocketmq集群部署方式
- 單Master模式
? 只有一個 Master節(jié)點(diǎn)
? 優(yōu)點(diǎn):配置簡單,方便部署
? 缺點(diǎn):這種方式風(fēng)險較大,一旦Broker重啟或者宕機(jī)時,會導(dǎo)致整個服務(wù)不可用,不建議線上環(huán)境使用
- 多Master模式
? 一個集群無 Slave,全是 Master,例如 2 個 Master 或者 3 個 Master
? 優(yōu)點(diǎn):配置簡單,單個Master 宕機(jī)或重啟維護(hù)對應(yīng)用無影響,在磁盤配置為RAID10 時,即使機(jī)器宕機(jī)不可恢復(fù)情況下,由與 RAID10磁盤非??煽?#xff0c;消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)。性能最高。
? 缺點(diǎn):單臺機(jī)器宕機(jī)期間,這臺機(jī)器上未被消費(fèi)的消息在機(jī)器恢復(fù)之前不可訂閱,消息實(shí)時性會受到受到影響
- 多Master多Slave模式(異步復(fù)制)
? 每個 Master 配置一個 Slave,有多對Master-Slave, HA,采用異步復(fù)制方式,主備有短暫消息延遲,毫秒級。
? 優(yōu)點(diǎn):即使磁盤損壞,消息丟失的非常少,且消息實(shí)時性不會受影響,因?yàn)镸aster 宕機(jī)后,消費(fèi)者仍然可以從 Slave消費(fèi),此過程對應(yīng)用透明。不需要人工干預(yù)。性能同多 Master 模式幾乎一樣。
? 缺點(diǎn): Master 宕機(jī),磁盤損壞情況,會丟失少量消息。
- 多Master多Slave模式(同步雙寫)
? 每個 Master 配置一個 Slave,有多對Master-Slave, HA采用同步雙寫方式,主備都寫成功,向應(yīng)用返回成功。
? 優(yōu)點(diǎn):數(shù)據(jù)與服務(wù)都無單點(diǎn), Master宕機(jī)情況下,消息無延遲,服務(wù)可用性與數(shù)據(jù)可用性都非常高
? 缺點(diǎn):性能比異步復(fù)制模式略低,大約低 10%左右,發(fā)送單個消息的 RT會略高。目前主宕機(jī)后,備機(jī)不能自動切換為主機(jī),后續(xù)會支持自動切換功能
rocketmq集群部署
rocketmq-operator都是不能很靈活的調(diào)整副本數(shù),畢竟每個副本對應(yīng)其唯一的配置的文件,不同的broker實(shí)例使用的配置文件都是不一樣的,都存在差異,一旦副本變化了,就不能很好的和broker 的配置文件內(nèi)容一 一對應(yīng)起來。
接下來我們創(chuàng)建一個基于k8s部署單master以及多master部署rocketmq集群,并且只需要一個broker配置文件,多個broker實(shí)例會自動基于該broker配置文件模板,自動生成不同broker實(shí)例的broker配置文件,擴(kuò)容或者伸縮rocketmq集群 nameserver或者broker副本數(shù)的時候不需要理會配置文件,僅僅是調(diào)整實(shí)例的副本即可。
備注:該方案不適合有slave節(jié)點(diǎn)的部署方式。
環(huán)境說明
- 提供持久存儲動態(tài)供給功能
[root@k8s-master01 ~]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client fuseim.pri/ifs Delete Immediate false 8d
- 提供metallb功能
按官網(wǎng)提供的方式修改即可,鏈接:https://metallb.universe.tf/
# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
# vim ippool.yaml
# cat ippool.yamlapiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: first-poolnamespace: metallb-system
spec:addresses:- 192.168.10.100-192.168.100.110
# kubectl create -f ippool.yaml
# vim l2.yaml
# cat l2.yamlapiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: examplenamespace: metallb-system
# kubectl create -f l2.yaml
- 提供ingress nginx controller
# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.4.0/deploy/static/provider/cloud/deploy.yaml
部署前修改362行,把Local修改為Cluster# kubectl apply -f deploy.yaml
# kubectl get ns
NAME STATUS AGE
ingress-nginx Active 8s
# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-r9gqt 0/1 Completed 0 62s
ingress-nginx-admission-patch-r24d6 0/1 Completed 0 62s
ingress-nginx-controller-7844b9db77-mxrgn 1/1 Running 0 62s
# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.96.21.124 192.168.10.100 80:31844/TCP,443:32294/TCP 49m
ingress-nginx-controller-admission ClusterIP 10.109.18.235 <none> 443/TCP 49m
- 容器鏡像倉庫
沒有本地容器鏡像倉庫,可以使用hub.dockcer.com。
構(gòu)建rocketmq鏡像
rocketmq-namesrv和 rocketmq-broker共用同一個鏡像,僅僅是啟動命令和啟動參數(shù)不一樣,后期可靈活的通過調(diào)整啟動命令和啟動參數(shù)來實(shí)現(xiàn)不同的效果(比如通過掛載configMap的方式自定義rocketmq的配置文件,而不需要重建rocketmq的鏡像。
# vim Dockerfile
# cat DockerfileFROM docker.io/library/openjdk:8u102-jdk AS JDKLABEL mail=admin@kubemsb.comRUN rm -vf /etc/localtime \&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone \&& export LANG=zh_CN.UTF-8RUN curl -k https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip \-o /tmp/rocketmq-all-4.9.4-bin-release.zip \&& unzip /tmp/rocketmq-all-4.9.4-bin-release.zip -d /tmp/ \&& mv /tmp/rocketmq-all-4.9.4-bin-release /opt/rocketmq \&& rm -rf /tmp/*RUN sed -ir '/-Xmx/c JAVA_OPT=${JAVA_OPT}' /opt/rocketmq/bin/runserver.sh \&& sed -ir '/-Xmx/c JAVA_OPT=${JAVA_OPT}' /opt/rocketmq/bin/runbroker.sh## 運(yùn)行 MQ 應(yīng)用時候可以通過環(huán)境變量設(shè)置 jvm 數(shù)值,如:JAVA_OPT="-server -Xms2g -Xmx2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"ENV ROCKETMQ_HOME=/opt/rocketmqWORKDIR $ROCKETMQ_HOME
# docker build -t docker.io/nextgomsb/rocketmq:v1 . --no-cache
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nextgomsb/rocketmq v1 ed01df462eb3 31 seconds ago 677MB
# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: nextgomsb 替換為自己倉庫的用戶名
Password: 替換為自己倉庫的用戶名
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
# docker push docker.io/nextgomsb/rocketmq:v1
獲取rocketmq-dashboard鏡像
rocketmq-dashboard是一個可視化的rocketmq集群運(yùn)維監(jiān)控工具。
rocketmq部署描述文件編寫
rocketmq-namesrv部署描述文件
# vim rocketmq-namesrv.yaml
# cat rocketmq-namesrv.yaml---
apiVersion: v1
kind: Namespace
metadata:name: rocketmq---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: rocketmq-namesrvnamespace: rocketmq
spec:serviceName: rocketmq-namesrvreplicas: 2selector:matchLabels:app: rocketmq-namesrvtemplate:metadata:labels:app: rocketmq-namesrvspec:containers:- name: rocketmq-namesrv-containerimage: docker.io/nextgomsb/rocketmq:v1imagePullPolicy: IfNotPresentcommand:- bin/mqnamesrvenv:- name: JAVA_OPTvalue: -server -Xms2g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
---
apiVersion: v1
kind: Service
metadata:name: rocketmq-namesrvnamespace: rocketmqlabels:app: rocketmq-namesrv
spec:ports:- port: 9876protocol: TCPtargetPort: 9876selector:app: rocketmq-namesrvtype: ClusterIP
# dig -t a rocketmq-namesrv.rocketmq.svc.cluster.local. @10.96.0.10
rocketmq-broker部署描述文件
# vim rocketmq-broker.yaml
# cat rocketmq-broker.yaml---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: rocketmq-brokernamespace: rocketmq
spec:serviceName: rocketmq-brokerreplicas: 2selector:matchLabels:app: rocketmq-brokertemplate:metadata:labels:app: rocketmq-brokerspec:containers:- name: rocketmq-brokerimage: nextgomsb/rocketmq:v1imagePullPolicy: IfNotPresentcommand:- bin/mqbroker- --namesrvAddr=rocketmq-namesrv.rocketmq.svc.cluster.local.:9876env:- name: JAVA_OPTvalue: -server -Xms1g -Xmx1gdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerterminationGracePeriodSeconds: 30updateStrategy:rollingUpdate:partition: 0type: RollingUpdate
rocketmq-dashboard部署描述文件
部署一個能實(shí)現(xiàn)運(yùn)維監(jiān)控rocketmq的可視化web應(yīng)用。
部署rocketmq-dashboard應(yīng)用時候重點(diǎn)關(guān)注部署文件里面的env環(huán)境變量參數(shù)JAVA_OPTS,該env環(huán)境變量(JAVA_OPTS)決定了應(yīng)用是否能成功連接到 rocketmq-namesrv 服務(wù)。
# vim rocketmq-dashboard.yaml
# cat rocketmq-dashboard.yaml---
apiVersion: apps/v1
kind: Deployment
metadata:name: rocketmq-dashboardnamespace: rocketmqlabels:app: rocketmq-dashboard
spec:replicas: 1selector:matchLabels:app: rocketmq-dashboardtemplate:metadata:labels:app: rocketmq-dashboardspec:containers:- name: rocketmq-dashboardimage: apacherocketmq/rocketmq-dashboard:latestimagePullPolicy: IfNotPresentenv:- name: JAVA_OPTSvalue: -Drocketmq.namesrv.addr=rocketmq-namesrv.rocketmq.svc.cluster.local.:9876dnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30---
apiVersion: v1
kind: Service
metadata:name: rocketmq-dashboardnamespace: rocketmqlabels:app: rocketmq-dashboard
spec:ports:- port: 8080protocol: TCPtargetPort: 8080selector:app: rocketmq-dashboardtype: ClusterIP
執(zhí)行部署描述文件
rocketmq-namesrv部署
# kubectl create -f rocketmq-namesrv.yaml
# kubectl get pods -n rocketmq
NAME READY STATUS RESTARTS AGE
...
rocketmq-namesrv-0 1/1 Running 0 14m
rocketmq-namesrv-1 1/1 Running 0 13m
rocketmq-broker部署
# kubectl create -f rocketmq-broker.yaml
# kubectl get pods -n rocketmq
NAME READY STATUS RESTARTS AGE
rocketmq-broker-0 1/1 Running 0 4m16s
rocketmq-broker-1 1/1 Running 0 4m15s
rocketmq-dashboard部署
# kubectl create -f rocketmq-dashboard.yaml
# kubectl get pods -n rocketmq
NAME READY STATUS RESTARTS AGE
rocketmq-dashboard-f4ccdf496-sv984 1/1 Running 0 73s
調(diào)整副本
調(diào)整rocket-namesrv副本數(shù)kubectl scale sts rocketmq-namesrv --replicas=3 -n rocketmq
# kubectl get pods -n rocketmq
NAME READY STATUS RESTARTS AGE
rocketmq-namesrv-0 1/1 Running 0 15m
rocketmq-namesrv-1 1/1 Running 0 14m
rocketmq-namesrv-2 1/1 Running 0 4s
調(diào)整rocket-broker副本數(shù),集群節(jié)點(diǎn)內(nèi)存要大于副本數(shù)中內(nèi)存。
kubectl scale sts rocketmq-broker --replicas=3 -n rocketmq
創(chuàng)建ingress資源對象實(shí)現(xiàn)域名訪問dashboard
# vim rocketmq-dashboard-ingress.yaml
# cat rocketmq-dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-rocketmq-dashboard #自定義ingress名稱namespace: rocketmqannotations:ingressclass.kubernetes.io/is-default-class: "true"kubernetes.io/ingress.class: nginx
spec:rules:- host: rocketmq-dashboard.kubemsb.com # 自定義域名http:paths:- pathType: Prefixpath: "/"backend:service:name: rocketmq-dashboard # 對應(yīng)上面創(chuàng)建的service名稱port:number: 8080
# kubectl create -f rocketmq-dashboard-ingress.yaml
# kubectl get ingress -n rocketmq
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-rocketmq-dashboard <none> rocketmq-dashboard.kubemsb.com 80 31s