网站名百度搜不到,seo专家招聘,宜宾网站开发招聘,简单的asp网站Rocketmq
rocketmq角色
RocketMQ由四部分构成#xff1a;Producer、Consumer、Broker和NameServer
启动顺序#xff1a;NameServer-Broker
为了消除单点故障#xff0c;增加可靠性或增大吞吐量#xff0c;可以在多台机器上部署多个nameserver和broker#xff0c;并…Rocketmq
rocketmq角色
RocketMQ由四部分构成Producer、Consumer、Broker和NameServer
启动顺序NameServer-Broker
为了消除单点故障增加可靠性或增大吞吐量可以在多台机器上部署多个nameserver和broker并且为每个broker部署1个或多个slave Topic message queue一个分布式消息队列中间件部署好以后可以给很多个业务提供服务同一个业务也有不同类型的消息要投递这些不同类型的消息以不同的 Topic 名称来区分。所以发送和接收消息前先创建topic针对某个 Topic 发送和接收消息。有了 Topic 以后还需要解决性能问题 。 如果一个Topic 要发送和接收的数据量非常大 需要能支持增加并行处理的机器来提高处理速度这时候一个 Topic 可以根据需求设置一个或多个 Message Queue, Message Queue 类似分区或 Partition 。Topic有了多个 Message Queue 后消息可以并行地向各个Message Queue 发送消费者也可以并行地从多个 Message Queue 读取消息并消费 。 rocketmq集群部署方式
单Master模式
只有一个 Master节点
优点配置简单方便部署
缺点这种方式风险较大一旦Broker重启或者宕机时会导致整个服务不可用不建议线上环境使用
多Master模式
一个集群无 Slave全是 Master例如 2 个 Master 或者 3 个 Master
优点配置简单单个Master 宕机或重启维护对应用无影响在磁盘配置为RAID10 时即使机器宕机不可恢复情况下由与 RAID10磁盘非常可靠消息也不会丢异步刷盘丢失少量消息同步刷盘一条不丢。性能最高。
缺点单台机器宕机期间这台机器上未被消费的消息在机器恢复之前不可订阅消息实时性会受到受到影响
多Master多Slave模式异步复制
每个 Master 配置一个 Slave有多对Master-Slave HA采用异步复制方式主备有短暂消息延迟毫秒级。
优点即使磁盘损坏消息丢失的非常少且消息实时性不会受影响因为Master 宕机后消费者仍然可以从 Slave消费此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。
缺点 Master 宕机磁盘损坏情况会丢失少量消息。
多Master多Slave模式同步双写
每个 Master 配置一个 Slave有多对Master-Slave HA采用同步双写方式主备都写成功向应用返回成功。
优点数据与服务都无单点 Master宕机情况下消息无延迟服务可用性与数据可用性都非常高
缺点性能比异步复制模式略低大约低 10%左右发送单个消息的 RT会略高。目前主宕机后备机不能自动切换为主机后续会支持自动切换功能
rocketmq集群部署 rocketmq-operator都是不能很灵活的调整副本数毕竟每个副本对应其唯一的配置的文件不同的broker实例使用的配置文件都是不一样的都存在差异一旦副本变化了就不能很好的和broker 的配置文件内容一 一对应起来。 接下来我们创建一个基于k8s部署单master以及多master部署rocketmq集群并且只需要一个broker配置文件多个broker实例会自动基于该broker配置文件模板自动生成不同broker实例的broker配置文件扩容或者伸缩rocketmq集群 nameserver或者broker副本数的时候不需要理会配置文件仅仅是调整实例的副本即可。 备注该方案不适合有slave节点的部署方式。 环境说明
提供持久存储动态供给功能
[rootk8s-master01 ~]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client fuseim.pri/ifs Delete Immediate false 8d提供metallb功能 按官网提供的方式修改即可链接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。 构建rocketmq镜像
rocketmq-namesrv和 rocketmq-broker共用同一个镜像仅仅是启动命令和启动参数不一样后期可灵活的通过调整启动命令和启动参数来实现不同的效果比如通过挂载configMap的方式自定义rocketmq的配置文件而不需要重建rocketmq的镜像。
# vim Dockerfile
# cat DockerfileFROM docker.io/library/openjdk:8u102-jdk AS JDKLABEL mailadminkubemsb.comRUN rm -vf /etc/localtime \ ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ echo Asia/Shanghai /etc/timezone \ export LANGzh_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## 运行 MQ 应用时候可以通过环境变量设置 jvm 数值如JAVA_OPT-server -Xms2g -Xmx2g -XX:MetaspaceSize128m -XX:MaxMetaspaceSize320mENV 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 dont 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集群运维监控工具。
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:MetaspaceSize256m -XX:MaxMetaspaceSize512m
---
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.10rocketmq-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- --namesrvAddrrocketmq-namesrv.rocketmq.svc.cluster.local.:9876env:- name: JAVA_OPTvalue: -server -Xms1g -Xmx1gdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerterminationGracePeriodSeconds: 30updateStrategy:rollingUpdate:partition: 0type: RollingUpdaterocketmq-dashboard部署描述文件 部署一个能实现运维监控rocketmq的可视化web应用。 部署rocketmq-dashboard应用时候重点关注部署文件里面的env环境变量参数JAVA_OPTS该env环境变量JAVA_OPTS决定了应用是否能成功连接到 rocketmq-namesrv 服务。
# 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.addrrocketmq-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执行部署描述文件
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 13mrocketmq-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 4m15srocketmq-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调整副本
调整rocket-namesrv副本数kubectl scale sts rocketmq-namesrv --replicas3 -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调整rocket-broker副本数,集群节点内存要大于副本数中内存。
kubectl scale sts rocketmq-broker --replicas3 -n rocketmq创建ingress资源对象实现域名访问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: truekubernetes.io/ingress.class: nginx
spec:rules:- host: rocketmq-dashboard.kubemsb.com # 自定义域名http:paths:- pathType: Prefixpath: /backend:service:name: rocketmq-dashboard # 对应上面创建的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