RocketMQ(二)消息中间件【实战与部署】OS,JVM,MQ参数调优
2021-03-27 19:18:09 1 举报
为你推荐
查看更多
快速部署RocketMQ、完成正式三台NameServer部署、完成一组broker集群的部署、MQ集群性能压测、编写最基本的生产者和消费者进行压测、如何对mq进行可视化的监控和管理?压测前的准备:OS内核参数调整,JVM参数调整以及中间件核心参数调整、MQ知识点梳理小总结
作者其他创作
大纲/内容
订单数据库负载过高
这里必须要在启动的时候设置好nameServer的地址,如果有多个地址,可以使用分号分开,接着就会看到工作台启动了,然后通过浏览器访问启动的这台机器的8080端口就可以看到rocketmq的工作台了
JVM GC频率使用jstat命令查看
进入脚本参数解释
完成正式三台NameServer部署
依据后台系统QPS
通知发货
rocketMq大优势
关键
机器:物理机或者是虚拟机(硬件)
机器自身监控:zabblx
积分系统
MQ可视化管理工作台
数据路由:nameserver
使用场景,大中小型公司的业务系统
快速部署RocketMQ
这一行的内容就是用这个runbroker.sh脚本启动一个JVM进程JVM进程刚刚开始执行的main方法就是,BrokerStartup
如何对MQ进行技术选型
消息消费者
阿里,滴滴,网易等互联网大厂都在使用
XX:SoftRefLRUPolicyMSPerMB=0
通知取货
默认值是10%,这里需要根据服务器的情况而定
可以用如下的命令修改为1
/bin/runbroker.sh
JVM进程(jvm生产参数)
小总
nameservAddr=127.0.0.1:9876
增加积分
在界面中还有两个button
nohup sh bin/mqbroker -c conf/dledger/broker-n0.conf &
解义
例如有一个master和两个slave,那么他们的broker名称必须是一样的,因为它们是三个分一组,如果有另外一组的master和两个slave,也可以起名称为例如:RaftNode01
修改命令
磁盘的IO负载情况,top命令
状态查看
参数说明
MQ生产环境的部署
库存系统
网卡流量 sar -n DEV 1 2
举例说明:例如使用broker-n0.conf文件为例子
主题
订单支付前
官方文档相对较为简单
建议调大10倍也就是655360
默认这个参数是60,有点偏高,可能会导致MQ中间件运行不活跃的时候被迫腾出内存控件,然后放入磁盘swap区域中去
引入mq依赖
vm.overcommint_memory
-Xms8g -Xmx8g -Xmn4g
思考问题
通过TPS的数据统计,就是每秒写入或者是消费的消息数量,就可以看出这个集群的TPS的并发访问量
超高吞吐量
公司仓库
git clone https://github.com/apache/rocketmq.gitcd rocketmqgit checkout -b store_with_dledger origin/store_with_dledgermvn -Prelease-all -DskipTests clean install -U
jvm
broker数据文件放
稳定性不高
进入这几个文件
完成多机器的小规模集群部署
在三台nameServer机器中,随便找一台机器,在里面执行命令拉取RocketMq的工作源码
这个很关键,对于每一组broker,得必须要保证他们的这个配置是一样的,在这里要写出来第一个组有哪几个broker,假设这里有三台机器部署了broker,要作为一个组,那么在这个配置文件中就要写入这三个的ip地址和监听的端口号
准备最基本的生产者和消费者代码
生产者
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
mqnamsvr
默认设置是0,建议这个参数不要设置为0,避免频繁回收一些软引用的class对象,这里例如可以调整成1000
注释
检查集群状态
每次支付完一个订单后都需要做同样的这些操作· 更新订单状态· 扣减库存· 增加积分· 发放优惠券· 发送短信· 通知发货导致的问题:一次核心链路执行时间过长,可能长达几秒钟
这个参数的意思就是rocketMq内部用来发送消息的线程池的默认数量为16.可以根据自己的机器配置,例如CPU是24核的,可以增加到24或者30都可以
broker长连接和心跳感知
一般的中间件,例如kafka,es,mycat,MQ很多都是Java开发的,或者是基于jvm的scala开发的
这个配置文件代表的是broker的name
第三方物流系统
cd rocketmq- externals/rocketmq-console
可以直接访问都MQ集群中的消费者和生产者,做集中管理
生产机器配置
可以对消息进行查询和管理
订单支付后
举例:假设你的机器配置:24核的CPU,结果你的默认就开启了4个工作线程去处理请求,这不是极大的浪费资源
订单支付消息
线上环境
中间件本身的核心参数设置
nohup sh mqnamesrv &
扣减库存
MQ专栏的35day小总
OS内核参数调整
Java语言开发,方便改造源码
echo 'ulimit -n 1000000' >>/etc/profile
其他系统的改造
broker
天生设计允许数据丢失,保证高吞吐
Rocketmq的核心参数调整
生成物流单
是否启动dledger技术
rocketmq/distribution/target/apache-rocktmq/conf/dledger
对JVM参数进行调整
在三台nameServer的机器上面,按照快速部署MQ,安装好Java,构件号dledger和rocketMQ,然后编辑对应的文件,设置好Java-home就可以了
如果值为0的话,在中间件系统申请内存的时候,os内核会检查可用内存是否足够,如果足够的话就分配内存给你,如果觉得内存不大够了,干脆就拒绝申请,导致申请内存失败,进而导致中间件系统异常出错
在这个可视化见面中可以看到broker的大体消息负载,还有各个topic的消息负载,还可以选择日期要看具体哪天的监控数据,点击导航栏的集群,就会进入集群的一个监控界面
3.构建RocketMQ
其他语言开发,不方便改造源码
sendMessageThreadPoolNums=16
订单系统
这个一般配置和机器的cpu核数一样,这里假设的是24核的机器
比平时多几倍的QPS压力
sendMessageThreadPoolNums=24
消息
架构原理
快速rocketMQ集群启动
MQ集群的可视化监控
数据库扛不住
接着需要启动一个master broker和两个slave broker,分别在三台broker准备的机器上,安装好Java,构件号dledger和rocketMQ,然后编辑对应的文件,设置好Java-home就可以了
cpu负载情况top/uptime命令查看
包括重要的一些信息,每台机器的生产消息TPS和消费信息的TPS,还有消息总数
也可以实现零数据丢失,但是吞吐量下降
MQ到底是什么
只要代码一执行,就立马不停的在while死循环中发送消息,根据需要可以设置为多个线程;消费者不停的去获取消息,打印在控制台即可
slave是如何切换为master的
默认是65536,但是这个值有时候是不够的,比如大数据团队的生产环境部署的kafka集群就可能报这个异常,无法开启足够多的线程,直接导致kafka宕机
参数为10
几百行的SQL
这里说rocketMQ里大量用来NIO种的direct buffer,这里限定来direct buffer最多申请多少,如果机器内不能比较大,可以适当的调大这个值
劣势
/usr/libexec/java_hom -V修改为java主目录即可
XX:-OmitStackTraceInFastThrow
什么是同步调用?
broker监听的端口号
物流公司运输队
git clone https://github.com/apache/roketmq-externals.git
第三方退款失败
slave提升为master
1、下单核心流程环节太多,性能比较差2、订单退款的流程可能面临退款失败的风险3、关闭过期订单的时候,存在扫描大量订单数据的问题。4、跟第三方物流系统耦合在一起,性能存在抖动的风险5.大数据团队要获取订单数据,存在不规范直接查询订单数据库的问题6、做秒杀活动时候,订单数据库压力比较大
第三方短信系统
broker无差别注册机制
GC日志打印输出说明
这个参数就是说明用服务器模式启动意思
交易数据报表
点击配置可以看到这个broker具体的一些配置参数的值
-XX:-UseLargePages -XX:-UseBiasedLocking
点击状态,可以看到这个broker更加细节和具体的一些统计项,
这里的G1的地区(region)大小设置为了16m,根据自己分配的机器来调整,如果内存比较多,可以调大一些,如果用2m,会导致region太多
多机器多线程压测
这个是用来控制Linux上的最大文件连接数的,默认的是1024,一般是不够的,因为如果在大量频繁的读写磁盘文件的时候,或者是进行网络通信的时候,都会跟这个参数有关系。
ulimit
配置文件
可以根据需要改变
此时发现作为leader的BID为0的节点,变成另外一个broker了,切换成功
master slave同步机制
第一步
参数为60
因此一般都需要将这个参数的值调整为1,意思就是把所有可用的物理内存全都分配给中间件,只要有内存就可以用,这样就避免了申请内存失败的问题
首先考虑一个问题?这些测试性的压测也好,实际上的环境压测也好,最终的cpu使用情况,jvm的GC情况,在哪里看呢?
通知仓储发货
4.进入目录,修改对应配置文件
整个rocketMQ集群的元数据都集中在nameServer中,包括有多少broker,有哪些topic数据模型,右安歇producer,有哪些consumer,目前集群中有多少消息等等
状态
brokerClusterName = RaftCluster
git clone https://github.com/openmessaging/openmessaging-storage-dledger.gitcd openmessaging-storage-dledgermvn clean install -DskipTests
仓储系统
演变
小结:大体的工作台和管理功能就是这些了,这个工作台可以对集群整体的消息数量以及消息的TPS,还有各个broker的消息数量和消息TPS进行监控,同时还可以对broker,topic,消费者,生产者,消息这些东西进行对应的查询和管理,非常的便捷
国内大中小公司落地实践案例多
更新订单状态
-XX:MaxDirectMemorySize=15g
客户端系统集群部署
如果这个参数过小,有的时候会导致有些中间件无法开启足够的线程,进而导致报错,甚至中间件系统挂掉
topic如何分布式存储在broker集群中
NameServer配置nameServer的监听地址,可以写多个
性能被拖累
在这个界面可以看到broker的分组信息,哪些节点是master,哪些是slave,各自的host+ip地址,还有版本号
vm.swappiness
在rocketMQ/distribution/target/apache-rocketmq/bin目录下的脚本
dlegerSelfId=n0
sh bin/mqadmin clusterList -n 127.0.0.1:9876
对于一个中间件,首先要对Linux操作系统的一些内核参数做一些适当的调整,因为OS内核参数很多默认值不一定适合生产环境的系统运行,有些参数需要调整的大一些,才能让中间件发挥性能
使用场景:大数据领域的用户日志传输,高吞吐,允许数据丢失
完美
对rocketMQ集群进行OS内核参数的调整
如何通过MQ做异步调用
changeLanguage
执行命令对rocketmq-console进行打包,打成jar包
大数据团队
取货发货
正常情况就是n0,n1,n2
海量消息分布式存储
1M2S组设定
nameServer监听的默认端口就是9876,所以如果在三台机器上面都启动了nameserver,那么他们的端口就都是9876,此时就成功的启动了三个nameServer
完善的可视化管理工作台
集群化部署
生产者的代码
这个参数的值会直接影响到中间件系统可以开启的线程数量,同样也是非常重要的
发起支付
1.改造系统,订单系统除掉调用积分系统,促销系统,推送系统以及仓储系统的业务逻辑,改成发送一个消息到MQ中
发送push推送
Linux操作系统(OS内核参数)
问题环节分析
JVM参数调整
通常在生产环境建议将这个参数调小一些,例如10,尽量的使用物理内存,不放磁盘swap区域中去
订单量大,扫描低
优势
对于一个消息中间件系统肯定不能使用默认的,如果采用默认值 ,很有可能在线上出现这个错误:error: too many open files
订单系统可能会遇到的问题梳理图
图解【重点理解】
例如:更新订单状态需要30ms,扣减库存需要80ms,调用第三方短信需要200ms,调用仓储和发货500ms,促销系统200ms,积分系统200ms,还不算网络波动等其他的情况,整个链路执行完,客户要在页面转好几秒中的时间【优化后:更新订单状态30ms,扣减库存80ms,总共110ms就可以响应回去了,客户端是很爽的,其他的操作异步的从mq中获取数据执行自己要处理的业务逻辑,这样就不会影响到整个订单核心链路的性能了】
新建两个工程
支持零数据丢失
mq功能强大
更新积分
促销系统
执行命令
这个参数是用来控制swap行为的,简单说就是os会将一部分磁盘空间作为swap区域,如果又进程可能不是很活跃,就会被操作系统将进程调整为休眠状态,将进程种的数据放入磁盘种的swap区域,任何将这个进程原来占用的控件腾出来,交给其他活跃运行的进程来使用
订单数据库
RocketMQ的TPS和消息延迟
kafka
这里一般建议和broker设置的名称一样,一个master和两个slave会组成一个group
如果是普通的那种Java web业务系统,通常而言上线只用关注的就是JVM的参数而已,对os内核参数以及业务系统自身参数大多数情况下都没有太多的要求
如果要看JDK安装位置
mqbroker
大促活动
进入target目录下,可以看到一个jar包,接着执行下面的命令启动工作台
broker与nameServer通信机制
在里面找到如下的三行,然后将第一二行和第三行都删了,同时将第一行的值修改为自己的JDK目录
但是对于中间件系统而言,往往必须要对os内核参数,jvm参数以及自身核心的参数,都需要做出对应合理的调整,再开始进行压测
编写最基本的生产者和消费者进行压测
依据公司整体业务情况
JVM合理的优化配置
基于dledger的broker主从架构的部署
发送消息的线程数量
中间件核心参数调整
vm.max_map_count
dledger目文件下的这个核心参数
dledger关键技术
等待10s
rocketMQ的核心原理
问题:订单系统中如何发送消息到rocketMQ中呢?
这两个都是存放数据和日志的
重点
RocketMQ集群
sudo yum install maven
enableDlegerCommintLog=true
第二件事
这里不说明,百度或者是参照redis
订单支付中复杂的流程步骤
脚本中
完成一组broker集群的部署
之前的问题
抗高并发方面比较弱
压测看哪几点?
如何通过工作台进行集群监控
直接查订单数据库
master/slave宕机后的处理
第一件事
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
客户端路由机制
第四件事
需要关注的参数
集群监控界面
订单逆向工程
例如:明明部署的是一个几十个GB的高配置 物理机,结果给中间件系统的JVM分配了1GB的内存,what???
此时需要等待一会,这个命令执行周期会有点慢,接着会看到3行记录
中间件系统(Java代码)
启动nameServer
j进入rocketmq-console目录
如果将这个参数的值设置为0,意思就是尽量别把任何一个进程放入到磁盘swap区域去,尽量使用物理内存
ribbitmq
生产者和消费者如何与broker通信
切换为简体中文
1.安装JDK配置JAVA_home
整个broker集群都可以使用这个名称
调整中间件系统的核心参数
nameserver
优惠券,红包
如何对mq进行可视化的监控和管理?
如果这个参数的值是100,那么意思就是尽量把一些进程给放入swap区域去,内存腾出来给活跃的进程使用
dledger主从自动切换
冗余部署一些机器,以防万一
MQ集群压测
观察MQ的TPS
例如:曾经在线上环境部署的redis就是因为这个参数是0,导致在save数据快照到磁盘文件的时候,需要申请大内存的时候被拒绝了,从而导致了异常报错
如果要启用,必须设置为true
storePathRootDir=/tmp/mqstore/node00
这个参数需要重点调整,系统给出的默认堆大小是8g内存,新生代是4g内存,这个要根据自己的物理机配置来配置,
-XX:G1ReservePercent=25
参数为0
中间件的核心参数主要也是关注其中跟网络通信,磁盘,IO,线程数量,内存管理相关的,根据服务器机器资源,可以适当的增加网络通信线程,控制同步刷磁盘或者是异步刷磁盘,线程数量有多少,内存中一些队列的大小等等
storePathCommitLog=/tmp/rmqstore/node00/commitlog
MQ功能强大
后台扫描订单
-XX:+AlwaysPreTouch
MQ生产级参数调整
最后启动起来:sh bin/mqadmin clusterList -n 127.0.0.1:9876
TPS数据
快速部署单机小集群
可以使用如下命令修改
这两个参数的意思是禁用大内存页和偏向锁
高可用:主从架构
这个参数的意思是刚开始指定的JVM用多少内存,不会真正的分配给他,会在实际使用需要的时候再分配给他
有时候JVM会抛弃一些异常堆栈的信息,因此这个参数设置之后,就是禁用这个特性,将完整的异常堆栈信息打印出来
例如内存区域的大小分配,垃圾回收以及对应的行为参数,GC日志存放的位置,OOM自动到处内存快照的配置等等
listenPort=30911
rocketMQ
配置
系统之间解藕
第三件事
-XX:+UseG1GC -XX:HeapRegionSize=16m
点击导航就可以看到下面的界面,通过这个界面就可以对topic进行管理了,比如说创建topic,删除,装填,配置,等等各种管理
监听同组内的所有broker
java -jar rocketmq-console-ng-1.0.1.jar --server.port=8080 --rocketmq.config.namesrvAddr=127.0.0.1:9876
类似可以改成自己的/usr/local/mq/node00等等
所以对于一个生产环境的中间件系统而言,在部署和启动之前,需要关注的第二个东西就是jvm的各种参数
锁定库存
RaftCluster,broker名称叫做raftnode00,然后是BID是0、1、2,也有可能是0、1、3
2.构建Dledger
这个参数是说,在G1管理的老年代里预留25%的空闲内存,保证新生代对象晋升到老年代的时候有足够空间,避免老年代内存都满了,新生代有对象要进入老年代没有足够的内存
比较适用于中小学公司业务系统的使用,无超高并发场景,不需要改造源码
压测前的准备:OS内核参数调整,JVM参数调整以及中间件核心参数调整
启动broker
消息生产者
跟第三方系统耦合
MQ消息中间件(三)
-server
分析问题,解决问题
mq功能过于简单
注意事项
消费者
nameServer集群化部署
第一个问题解决方案
再次执行命令查看集群状态:sh bin/mqadmin clusterList -n 127.0.0.1:9876
brokerName=RaftNode00
总结:RocketMQ默认的JVM参数是采用来G1垃圾回收器,默认堆内存大小是8G
2.启动nameServer
另外的积分系统、促销系统、推送系统和仓储系统都要从MQ中获取消息,根据消息来执行自己的业务逻辑
这个命令会在当前这台机器上启动一个nameServer和三个broker,三个broker其中一个是master,另外两个是slave,瞬间就可以组成一个最小可用的rocketMQ集群。
不和你场景举例
dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40922;n2-127.0.0.1:40933
在nameServer中执行命令
这个参数也比较重要,这里选用了G1垃圾回收期来做分代回收,对新生代和老年代都是用G1来回收的
异步话提升系统性能
优化这个调用链路,是不是直接在用户支付完成后,只需要执行最核心的更新订单状态和扣减库存就可以了,从而来保证响应速度够快,剩下的操作是否可以通过MQ实现异步执行?
中间件系统自己本身的一些核心参数的设置,例如中间件系统会开启很多线程处理清酒和工作负载,然后还会进行大量的网络通信,同时会进行大量的磁盘IO流的操作
broker在组里面的id
echo 'vm.swappiness=10' >> /etc/sysctl.conf
核心数据模型:topic
发放优惠券发放红包
高并发流量削峰
mvn package -DskipTests
这个时候就说明rocketMQ集群启动成功了,BID为0的就是mater,BID大于0的就是slave,其实在这里也可以叫做leader和follower
读写分离机制
消息轨迹
group分组
可视化的界面管理
思考
sh bin/dledger/fast-try.sh start
dlegerGroup=RaftNode00
性能压测
peer集群化部署
1
消息中间件有哪些作用?
rocketMQ生产部署方案
这里第一个broker的配置文件是broker-n0.conf,第二个broker的配置文件可以是broker-n1.conf,第三个broker的配置文件可以是broker-n2.conf【可以对对应的配置文件做自己想要做的修改】
配置举例
小规模MQ集群部署
MQ生产集群的规划
消费者的代码
所以可以认为在一台机器上面部署和启动一个中间件系统来说,大白话就是启动了一个jvm的进程,由这个jvm进程来运行中间件的所有代码,实现中间件系统的功能
能抗住超高并发
首先查看下三台机器的进程,然后kill -9将BID为0的直接杀死
内存的使用率使用free命令查看
用户退款
什么是异步调用?
0 条评论
回复 删除
下一页