mq部署方案
1、rocketmq 顺序消费记录
一个master ,一个 brocker ,多个group ,多个topic,采用集群消费模式。
注意 一个group 对应一个 topic。 生产者 和 消费者 可以有多个,但是 主题和分组 都是一对一的。这样保证了 消息在集群模式下 的 顺序存储 和消费。
Linux 部署rocketmq centos7
参考资料:
https://blog.csdn.net/YuanFudao/article/details/130307086
进入 opt目录
https://www.yisu.com/ask/32687639.html
1、设置rocketmq日志路径
1、先创建mq安装目录
1、上传压缩包
1、解压
1、配置环境变量
1、配置日志路径(日志配置文件)
1、配置数据存储文件路径(主要是store文件)
1、配置占用内存大小(那几个启动文件)
1、修改 broker.conf 内容 ip地址等
1、开放端口
开始
1、
Mq安装目录
/home/software/rocketmq-dev/
/home/software/rocketmq-dev/rocketmq5.1.4
Mq日志路径
/home/software/rocketmq-dev/logs/rocketmqlogs/
2、 配置环境变量
ls .bash_*
https://www.cnblogs.com/wucongzhou/p/12579468.html
我们现在的环境变量 。如java8 我们是配置在 用户变量这一级别的
配置在了 用户目录下 的 .bash_profile 文件里
cat .bash_profile
export JAVA_HOME=/usr/bin/java
export PATH= P A T H : PATH: PATH:JAVA_HOME
1、rocketmq 安装路径放到 linux /home目录下 在 .bash_profile文件里
rocketmq 安装目录
export ROCKETMQ_HOME=/home/software/rocketmq-dev/rocketmq5.1.4
将 rocketmq 环境变量加入到 PATH中
export PATH= R O C K E T M Q H O M E / b i n : ROCKETMQ_HOME/bin: ROCKETMQHOME/bin:PATH
客户端NameServer的地址
export NAMESRV_ADDR=10.xx.xx.xx:9876
应用更改
source .bash_profile
2、修改 mq配置文件
(1)修改 broker.conf文件
在 mq 安装目录的 conf文件夹里
在修改mq 安装目录的bin文件夹里 这个是复制 conf里的
(2)修改 启动时的内存大小
进入到 bin 的目录结构
参考 也可以参考自己的 Windows配置
JAVA_OPT=" J A V A O P T − s e r v e r − X m s 512 m − X m x 512 m − X m n 256 m − X X : M e t a s p a c e S i z e = 128 m − X X : M a x M e t a s p a c e S i z e = 320 m " J A V A O P T = " {JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" JAVA_OPT=" JAVAOPT−server−Xms512m−Xmx512m−Xmn256m−XX:MetaspaceSize=128m−XX:MaxMetaspaceSize=320m"JAVAOPT="{JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC" JAVA_OPT=" J A V A O P T − v e r b o s e : g c − X l o g g c : {JAVA_OPT} -verbose:gc -Xloggc: JAVAOPT−verbose:gc−Xloggc:{GC_LOG_DIR}/rmq_srv_gc_%p_%t.log
-XX:+PrintGCDetails -XX:+PrintGCDateStamps" JAVA_OPT=" J A V A O P T − X X : + U s e G C L o g F i l e R o t a t i o n − X X : N u m b e r O f G C L o g F i l e s = 5 − X X : G C L o g F i l e S i z e = 30 m " e l s e J A V A O P T = " {JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" else JAVA_OPT=" JAVAOPT−XX:+UseGCLogFileRotation−XX:NumberOfGCLogFiles=5−XX:GCLogFileSize=30m"elseJAVAOPT="{JAVA_OPT} -server -Xms512 -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改 runbroker.sh
JAVA_OPT=" J A V A O P T − s e r v e r − X m s 512 m − X m x 512 m " c h o o s e g c o p t i o n s J A V A O P T = " {JAVA_OPT} -server -Xms512m -Xmx512m" choose_gc_options JAVA_OPT=" JAVAOPT−server−Xms512m−Xmx512m"choosegcoptionsJAVAOPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT=" J A V A O P T − X X : + A l w a y s P r e T o u c h " J A V A O P T = " {JAVA_OPT} -XX:+AlwaysPreTouch" JAVA_OPT=" JAVAOPT−XX:+AlwaysPreTouch"JAVAOPT="{JAVA_OPT} -XX:MaxDirectMemorySize=1g"
(3)
修改 mq存储文件和 日志输出位置
默认输出位置为
默认路径 /root/logs/rocketmqlogs。
Linux centos7 更改rocketmq存储文件地址
https://blog.csdn.net/m0_73570288/article/details/127275904
Windows 数据存储使用 默认路径,
Linux 使用指定路径
就是在 conf 文件夹下面 broker.conf 文件里填写 路径即
日志存储位置:
/home/software/rocketmq-dev/logs
数据文件存储位置:
/home/software/rocketmq-dev/store
在 store 里创建相应文件夹
commitlog 等文件夹
#存储路径
storePathRootDir=/home/software/rocketmq-dev/store
#commitLog存储路径
storePathCommitLog=/home/software/rocketmq-dev/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/home/software/rocketmq-dev/store/consumequeue
#消息索引存储路径
storePathIndex=/home/software/rocketmq-dev/store/index
#checkpoint文件存储路径
storeCheckpoint=/home/software/rocketmq-dev/store/checkpoint
#abort文件存储路径
abortFile=/home/software/rocketmq-dev/store/abort
但是执行后 store文件和有这些文件
abort checkpoint compaction consumequeue lock
abort.bak commitlog config index timerwheel
abort.bak 、abort、lock、timerwheel、checkpoint 是文件,其余是文件夹
(3)修改日志文件输出路径,
修改 conf 目录下 6各日志的xml文件
rmq.broker.logback.xml
rmq.client.logback.xml
rmq.controller.logback.xml
rmq.namesrv.logback.xml
rmq.proxy.logback.xml
rmq.tools.logback.xml
{LOG_DIR}{file.separator}logs{file.separator}rocketmqlogs{brokerLogDir:-{file.separator}}{brokerContainerLogDir}${file.separator}broker_default.log 3、 安装 rocketmq_dashboard 目录 /home/software/rocketmq_dashboard 日志输出在此目录下 4、 测试启动 https://www.cnblogs.com/xl99/p/14294622.html?ivk_sa=1024320u 前提 bin文件夹下 复制了 conf文件夹下的broker.conf文件,因为要指定 broker的信息 也可以不放在同一目录下 不过就得写全路径 这是在同一个目录下的示例 都在bin目录 mqbroker.cmd -c your_config_file.properties
(1)启动namesrv
cd /home/software/rocketmq-dev/rocketmq5.1.4/bin 执行
nohup sh mqnamesrv &
出现忽略输入并把输出追加到"nohup.out" 直接回车即可
查看是否启动成功
tail nohup.out
看到 The Name Server boot success... 则为启动成功
Pid = 3819411
(2)启动broker
nohup sh mqbroker -n xx.xx.xx.xx:9876 autoCreateTopicEnable=true -c broker.conf &
查看是否成功 输出如下成功了
tail nohup.out
The broker[localhost.localdomain, xx.xx.xx.xx:9876 boot success. serializeType=JSON and name server is xx.xx.xx.xx:9876
5、查看是否启动成功
使用jps查看 服务是否启动
6、
启动 rocketmq_dashboard
jar包所在目录
cd /home/software/rocketmq_dashboard
执行 ./startup.sh
执行成功输出 Application started with PID: 3859794
可能会提示权限不够 就执行下面命令
chmod +x startup.sh
#!/bin/bash
#定义jar文件的名称
JAR_FILE=rocketmq-dashboard-1.0.0.jar
启动jar文件
nohup java -Dfile.encoding=utf-8 -jar $JAR_FILE --rocketmq.config.namesrvAddr=xx.xx.xx.xx:9876 > dashboard-consol.log 2>&1 &
echo "Application started with PID: $!"
7、
关闭 rocketmq
./mqshutdown broker
./mqshutdown namesrv
https://www.cnblogs.com/jifeng/p/10175124.html
六、遇到问题
1、使用控制面板 查询 消息 无返回值
面板日志显示
DESC: The stats <TOPIC_PUT_NUMS> not exist
就是因为 你还没有像broker创建数据 ,有数据后 就不会报错了
后续完善:
在 broker conf 文件里 添加 listenPort = 10911
面板启动时 指定
另一个问题
发送消息到 rocketmq 服务端失败
Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE:service not available now. It may be caused by one of the following reasons: the broker's disk is full [CL: 0.92 CQ: 0.92 INDEX: 0.92], messages are put to the slave, message store has been shut down, etc. BROKER: xx.xx.xx.xx:10911
解决办法:
https://github.com/apache/rocketmq/issues/3750
https://blog.csdn.net/muriyue6/article/details/130607492
在 conf 文件夹下 broker.conf文件最后面添加如下属性
diskMaxUsedSpaceRatio=99
在 runserver.sh 、runbroker.sh 中 扩大内存
7、
目前 mq的 broker.conf文件的内容为
broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
listenPort = 10911
namesrvAddr = xx.xx.xx.xx:9876
brokerIP1 = xx.xx.xx.xx
diskMaxUsedSpaceRatio=99
#存储路径
storePathRootDir=/home/software/rocketmq-dev/store
#commitLog存储路径
storePathCommitLog=/home/software/rocketmq-dev/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/home/software/rocketmq-dev/store/consumequeue
#消息索引存储路径
storePathIndex=/home/software/rocketmq-dev/store/index
#checkpoint文件存储路径
storeCheckpoint=/home/software/rocketmq-dev/store/checkpoint
#abort文件存储路径
abortFile=/home/software/rocketmq-dev/store/abort
1
2024.7.14遇到问题记录
因为linux的盘符使用 占满 只剩 430k了 ,已经超过 99%了。
所以线上向mq 服务端发消息失败。
后来是因为 我们的文件服务器 有人一次性上传了 5各G左右的文件导致。
2
记录异常 rocketmq的 异常事故
生产服务器上 有一个 rocketmq的 server 和 brocker ip= 10.82.xxx.1
测试服务器 也部署了一套rocketmq的 server 和brocker ip=10.82.xxx.2
我在测试服务器上 启动 server 然后 要启动 brocker
执行命令
nohup sh mqbroker -n 10.82.xxx.2:9876 autoCreateTopicEnable=true -c broker.conf &
但是不小心 将 这里的 ip指向了 生产服务器的ip
nohup sh mqbroker -n 10.82.xxx.1:9876 autoCreateTopicEnable=true -c broker.conf &
导致 生产上 通过控制台 查看 发现 集群那里显示的 brocker 竟然是 测试环境的 ip地址。
然后 就发生了 生产环境的 consumer 在不断地消费 测试环境上的 历史的 消息。导致数据库 入库了很多 错误的数据库。
最后 解决方式 就是 将 生产的 rocketmq 的 store文件夹都删除,然后重新创建了 一个空的 store 文件夹 ,重新启动 rocketmq 服务 server 和 brocker 。这下就好了。
因为目前并没有 恢复历史数据。 好在我们每天凌晨12点会备份 昨天的 store文件。
只删除 store文件中 如下文件即可
abort abort.bak checkpoint commitlog compaction config consumequeue index lock timerwheel
里面的完全删除 commitlog 、完全删除 consumequeue 、完全删除index
部分删除 config中的 四个文件
consumerOffset.json delayOffset.json
consumerOffset.json.bak delayOffset.json.bak
2、由于我们的mq 目前是 单线程处理任务消息的,处理不及时 也会导致 后面的消息 堆积。
RocketMQ 客户端突然不消费了,部分不消费,部分队列不消费
3、另一个可能的原因 由于某个任务业务处理时间过长 导致线程一直没有返回 block,线程一直处于 runnable状态.
可以看下消费进度,看看哪里的问题。看topic消费时间、看Brocker
看 死信队列中的 任务有哪些。
4、当一个消息 消费失败,会被放到死信队列中
6、
解耦合 消息处理 和 业务处理 拆成两个线程分别处理