目录
由于网上找到的大部分部署方案以及rocketmq-operator都是不能很灵活的调整副本数,毕竟每个副本对应其唯一的配置的文件,不同的broker实例使用的配置文件都是不一样的,都存在差异,一旦副本变化了,就不能很好的和broker 的配置文件内容一 一对应起来。
在这里创建一个基于k8s部署单master以及多master部署rocketmq集群,并且只需要一个broker配置文件,多个broker实例会自动基于该broker配置文件模板,自动生成不同broker实例的broker配置文件,扩容或者伸缩rocketmq集群 nameserver或者broker副本数的时候不需要理会配置文件,仅仅是调整实例的副本即可。
备注:该方案不适合有slave节点的部署方式。
rocketmq-namesrv和 rocketmq-broker共用同一个镜像,仅仅是启动命令和启动参数不一样,后期可灵活的通过调整启动命令和启动参数来实现不同的效果(比如通过挂载configMap的方式自定义rocketmq的配置文件,而不需要重建rocketmq的镜像。
## docker build -t test/rocketmq:v1 . --no-cache
### 构建rocketmq 镜像
## cat Dockerfile
FROM docker.io/library/openjdk:8u102-jdk AS JDK
LABEL "作者"=fanqietudou mail=123456@qq.com
RUN rm -vf /etc/localtime \
&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& export LANG=zh_CN.UTF-8
RUN 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:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
ENV ROCKETMQ_HOME=/opt/rocketmq
WORKDIR $ROCKETMQ_HOME
rocketmq-dashboard是一个可视化的rocketmq集群运维监控工具。
# cat Dockerfile
# docker build -t test/rocketmq-dashboard:v1 . --no-cache
# docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" -p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest
#
# 下载地址 https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/rocketmq-dashboard/1.0.0/rocketmq-dashboard-1.0.0-source-release.zip
# github 地址 https://github.com/apache/rocketmq-dashboard.git
# git clone https://github.com/apache/rocketmq-dashboard.git
# 下载源码后,通过mvn 编译 得到 rocketmq-dashboard.jar
# 编译命令 mvn clean package -Dmaven.test.skip=true docker:build
# 也可以直接 拉取别人做好的镜像 docker pull apacherocketmq/rocketmq-dashboard:latest
# 也可以直接使用编译后,代码生成的 Dockerfile 文件构建 镜像
# 由于我的环境 无法直接拉取 java:8 基础镜像,所以我 换了一个基础镜像
# FROM java:8
FROM docker.io/library/openjdk:8u102-jdk AS JDK
VOLUME /tmp
ADD rocketmq-dashboard-*.jar rocketmq-dashboard.jar
RUN sh -c 'touch /rocketmq-dashboard.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /rocketmq-dashboard.jar" ]
该部署文件包含了rocketmq-nameserver和rocketmq-broker两部分内容,此部分要重点关注各自的启动命令和启动参数,启动命令和启动参数(command)是部署成功的关键,不同的需求,需要适当调整启动命令和启动参数(这里我只做简单的启动参数做例子)。
## cat rocketmq.yaml
## kubectl apply -f rocketmq.yaml
---
# rocketmq-namesrv 部署文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
generation: 2
labels:
app: rocketmq-namesrv
name: rocketmq-namesrv
# namespace: mq
spec:
podManagementPolicy: OrderedReady
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: rocketmq-namesrv
serviceName: rocketmq-namesrv
template:
metadata:
creationTimestamp: null
labels:
app: rocketmq-namesrv
spec:
containers:
- command:
- bin/mqnamesrv
env:
- name: JAVA_OPT
value: -server -Xms2g -Xmx2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
image: test/rocketmq:v1
imagePullPolicy: IfNotPresent
name: rocketmq-namesrv
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
---
# rocketmq-broker 部署文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
labels:
app: rocketmq-broker
name: rocketmq-broker
# namespace: mq
spec:
podManagementPolicy: OrderedReady
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: rocketmq-broker
serviceName: rocketmq-broker
template:
metadata:
creationTimestamp: null
labels:
app: rocketmq-broker
spec:
containers:
- command:
- bin/mqbroker
- --namesrvAddr=rocketmq-namesrv:9876
env:
- name: JAVA_OPT
value: -server -Xms4g -Xmx4g
image: test/rocketmq:v1
imagePullPolicy: IfNotPresent
name: rocketmq-broker
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
---
# rocketmq-namesrv 服务文件
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
app: rocketmq-namesrv
name: rocketmq-namesrv
# namespace: mq
spec:
clusterIP: None
ports:
- port: 9876
protocol: TCP
targetPort: 9876
selector:
app: rocketmq-namesrv
sessionAffinity: None
type: ClusterIP
---
前四个步骤已经完成创建rocketmq集群,接下来是部署一个能实现运维监控rocketmq的可视化web应用。
部署rocketmq-dashboard应用时候重点关注部署文件里面的env环境变量参数JAVA_OPTS,该env环境变量(JAVA_OPTS)决定了应用是否能成功连接到 rocketmq-namesrv 服务。
---
# rocketmq-dashboard 部署文件
# cat rocketmq-dashboard.yaml
# kubectl apply -f rocketmq-dashboard.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
labels:
app: rocketmq-dashboard
name: rocketmq-dashboard
# namespace: mq
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: rocketmq-dashboard
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: rocketmq-dashboard
spec:
containers:
- env:
- name: JAVA_OPTS
value: -Drocketmq.namesrv.addr=rocketmq-namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
image: test/rocketmq-dashboard:v1
imagePullPolicy: IfNotPresent
name: rocketmq-dashboard
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
---
# rocketmq-dashboard 服务文件
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
app: rocketmq-dashboard
name: rocketmq-dashboard
# namespace: mq
spec:
clusterIP: 10.96.149.156
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: rocketmq-dashboard
sessionAffinity: None
type: ClusterIP
---
## 副本数按照自己需求调整即可
## 1、 调整 rocketmq-namesrv 副本数
kubectl scale sts rocketmq-namesrv --replicas=3
## 2、调整 rocketmq-broker 副本数
kubectl scale sts rocketmq-broker --replicas=3
由于我的环境是使用Ingress方式访问,在这里我就不在写ingress配置了,如果有需要可以将上边的 rocketmq-dashboard得服务 service修改成nodeport形式访问。
rocketmq-dashboard应用默认端口是8080,登录账号和密码都是: admin。
默认情况rocketmq-dashboard的访问地址是: http://ip:8080 ,在k8s环境,rocketmq-dashboard的访问端口取决于nodeport映射的实际端口。
该部分内容是我们测试环境完整的部署文件,该部署方法是挂载自定义的可通过configMap 修改的配置文件。(rocketmq-dashboard是通过Ingress提供外网访问的,该Ingress部署内容部分就不展示了)
### cat rocketmq.yaml
### kubectl apply -f rocketmq.yaml
---
###########################################################
### 1、部署 rocketmq-namesrv
###########################################################
---
### rocketmq-namesrv configMap 配置文件 (无配置)
### rocketmq-namesrv 没有必要挂载 配置文件使用 默认的就好了
---
### rocketmq-namesrv 部署文件,已挂载 configMap 配置文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
labels:
app: rocketmq-namesrv
name: rocketmq-namesrv
# namespace: mq
spec:
podManagementPolicy: OrderedReady
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: rocketmq-namesrv
serviceName: rocketmq-namesrv
template:
metadata:
annotations:
kubectl.kubernetes.io/restartedAt: "2022-10-26T09:27:22+08:00"
creationTimestamp: null
labels:
app: rocketmq-namesrv
spec:
containers:
- command:
- bin/mqnamesrv
image: 172.18.6.97/test/rocketmq:v1
imagePullPolicy: IfNotPresent
name: rocketmq
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
---
### rocketmq-namesrv 服务文件
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
labels:
app: rocketmq-namesrv
name: rocketmq-namesrv
# namespace: mq
spec:
clusterIP: None
ports:
- port: 9876
protocol: TCP
targetPort: 9876
selector:
app: rocketmq-namesrv
sessionAffinity: None
type: ClusterIP
---
###########################################################
### 2、部署 rocketmq-broker
###########################################################
---
### rocketmq-broker configMap 配置文件
apiVersion: v1
data:
broker.conf: |
# 所属集群名字(同一主从下: Master 和 Slave 名称要一致)
brokerClusterName = RocketMQ-cluster
# Broker 名字,注意此处不同的配置文件填写的不一样
#brokerName = broker-a
# 0 表示 Master,> 0 表示 Slave
brokerId = 0
# Broker 对外服务的监听端口, 如果一台机器上启动了多个Broker,则要设置不同的端口号,避免冲突
listenPort = 10911
# nameServer地址,如果nameServer是多台集群的话,就用分号分割,比如
# namesrvAddr=192.168.0.1:9876;192.168.0.2:9876
# 是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable = true
# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup = true
# 与fileReservedTime参数呼应,表明在几点做消息删除动作,默认值04表示凌晨4点
deleteWhen = 04
# 在磁盘上保存消息的时长,单位是小时,自动删除超时的消息
fileReservedTime = 48
# brokerRole有3种:SYNC_MASTER、ASYNC_MASTER、SLAVE
# 关键词 SYNC 和 ASYNC 表示 Master 和 Slave 之间同步消息的机制
# SYNC 的意思是当 Slave 和 Master 消息同步完成后,再返回发送成功的状态
brokerRole = ASYNC_MASTER
# 刷盘方式 ASYNC_FLUSH 异步刷盘; SYNC_FLUSH 同步刷盘
flushDiskType = ASYNC_FLUSH
# #存储路径
# storePathRootDir = /opt/rocketmq/store
# #commitLog 存储路径
# storePathCommitLog = /opt/rocketmq/store/commitlog
# #消费队列存储路径存储路径
# storePathConsumeQueue = /opt/rocketmq/store/consumequeue
# #消息索引存储路径
# storePathIndex=/opt/rocketmq/store/index
# #checkpoint 文件存储路径
# storeCheckpoint=/opt/rocketmq/store/checkpoint
#限制的消息大小
maxMessageSize=65536
kind: ConfigMap
metadata:
name: rocketmq-broker
# namespace: mq
---
### rocketmq-broker 部署文件 ,已挂载 configMap 作为配置文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
labels:
app: rocketmq-broker
name: rocketmq-broker
# namespace: mq
spec:
podManagementPolicy: OrderedReady
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: rocketmq-broker
serviceName: rocketmq-broker
template:
metadata:
annotations:
cattle.io/timestamp: "2022-10-26T01:46:48Z"
creationTimestamp: null
labels:
app: rocketmq-broker
spec:
affinity: {}
containers:
- command:
- bin/mqbroker
- --configFile=conf/broker.conf
- --namesrvAddr=rocketmq-namesrv:9876
image: 172.18.6.97/test/rocketmq:v1
imagePullPolicy: IfNotPresent
name: rocketmq
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /opt/rocketmq/conf/broker.conf
name: rocketmq-broker-conf
readOnly: true
subPath: broker.conf
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
name: rocketmq-broker
name: rocketmq-broker-conf
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
---
###########################################################
### 3、部署 rocketmq-dashboard
###########################################################
---
### rocketmq-dashboard configMap 文件
apiVersion: v1
data:
users.properties: |2-
# This file supports hot change, any change will be auto-reloaded without Dashboard restarting.
# Format: a user per line, username=password[,N] #N is optional, 0 (Normal User); 1 (Admin)
# Define Admin
admin=admin,1
# Define Users
user1=user1
user2=user2
kind: ConfigMap
metadata:
name: rocketmq-dashboard
# namespace: mq
---
### rocketmq-dashboard 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
labels:
app: rocketmq-dashboard
name: rocketmq-dashboard
# namespace: mq
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: rocketmq-dashboard
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: rocketmq-dashboard
spec:
affinity: {}
containers:
- env:
- name: JAVA_OPTS
value: -Drocketmq.namesrv.addr=rocketmq-namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
image: 172.18.6.97/test/rocketmq-dashboard:v1
imagePullPolicy: IfNotPresent
name: rocketmq-dashboard
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: tmp/rocketmq-console/data/users.properties
name: users-properties
readOnly: true
subPath: users.properties
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
name: rocketmq-dashboard
name: users-properties
---
### rocketmq-dashboard 服务文件
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
app: rocketmq-dashboard
name: rocketmq-dashboard
# namespace: mq
spec:
clusterIP: 10.96.149.156
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: rocketmq-dashboard
sessionAffinity: None
type: ClusterIP
---


我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答
我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在Heroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t
如何使用Capistrano将Rails应用程序部署到无法访问外部网络或存储库的生产或暂存服务器?我已经设法完成部署的一半,并意识到Capistrano没有在我的本地机器上下载gitrepo,但它首先连接到远程服务器并尝试在那里下载Git存储库。我希望有一个类似Javaee的构建系统,其中创建可交付成果并将该可交付成果发送到服务器。就像您构建.ear文件并将其部署到您想要的任何服务器上一样。显然在RoR中,你被迫(据我所知)在该服务器上构建应用程序,在那里创建一个gem存储库,在那里克隆最新的分支等等。有什么方法可以将准备运行的包发送到远程服务器吗? 最佳答
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
集成背景我们当前集群使用的是ClouderaCDP,Flink版本为ClouderaVersion1.14,整体Flink安装目录以及配置文件结构与社区版本有较大出入。直接根据Streampark官方文档进行部署,将无法配置FlinkHome,以及后续整体Flink任务提交到集群中,因此需要进行针对化适配集成,在满足使用需求上,尽量提供完整的Streampark使用体验。集成步骤版本匹配问题解决首先解决无法识别Cloudera中的FlinkHome问题,根据报错主要明确到的事情是无法读取到Flink版本、lib下面的jar包名称无法匹配。修改对象:修改源码:(解决无法匹配clouderajar