十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
RocketMQ的部署,这里不做太多的说明,因为官方文档上面写的已经非常清晰了,可以照着官方文档一顿操作,下面为官方文档的地址:
成都创新互联提供成都做网站、成都网站建设、网页设计,品牌网站建设,1元广告等致力于企业网站建设与公司网站制作,10年的网站开发和建站经验,助力企业信息化建设,成功案例突破上1000+,是您实现网站建设的好选择.
RocketMQ的调优其实在官方文档的最佳实践中也写的挺清晰的,可以直接参考官方文档,笔者记录的这主要是自己消化后,自己理解的一些东西。
备注:以下几个参数对所有的中间件都起作用,比如redis、kafka等
该参数有三个值可以选择:0、1、2
"0":在中间件系统申请内存对时候,os内核会检查可用内存是否足够,如果足够的话就分配给你,如果感觉剩余内存不是太够,干脆就直接拒绝申请,从而导致中间件申请内存失败,出现异常。
"1":所有可用的物理内存都允许分配给你,只要有内存就给你用,这样可以避免内存申请失败的问题,一般将这个参数的值调整为1。
"2":表示内核允许分配超过所有物理内存和交换空间总和的内存
该参数影响中间件系统可以开启线程的数量,如果参数的值太少,可能会造成有些中间无法开启足够的线程,从而导致出错,然后使中间件系统挂掉。该参数的默认值为:65536,这个默认值有时候是不够的,建议这个参数值调大10倍,为655360。
该参数是用来控制swap行为的,这个简单的来说,就是os会把一部分磁盘空间作为swap区域,然后如果有的进程现在可能是不太活跃,就会被操作系统把进程调整为睡眠状态,把进程中的数据放入磁盘上的swap区域,然后让该进程原来占有的内存空间腾出来,交给其他活跃的进程来使用。
将该参数的值设置为0 :意思就是尽量别把任何一个进程放到磁盘swap区域,尽量大家都用物理内存。
将该参数的值设置为100 :意思是尽量把一些进程给放到swap区域去,内存腾出来给活跃的进程使用。
默认该参数的值为60 :有点偏高,可能会导致我们的中间件运行不活跃的时候被迫腾出内存空间然后放磁盘swap区域去。因此一般在生产环境建议将该值调小一些,比如10,让进程尽量使用物理内存,别放磁盘swap区域去。
该参数是用来控制linux上的最大文件链接数的,默认值为1024,一般肯定是不够的,因为在大量频繁的读写磁盘文件的时候或进行网络通信的时候,都会和这个参数有关系。如果采用默认值,可能会出现如下错误:error: too many openfiles。
总结:
因为RocketMQ是用java语言编写的所以在启动的时候需要使用虚拟机,所以对JVM进行调优。
在runbroker.sh启动脚本中可以看到如下内容:
对上面参数对解释:
-server :以服务器的模式启动。
-Xms8g -Xmx8g -Xmn4g : 默认的堆大小是8g,新生代是4g,这里根据实际生产服务器的内存大小,然后进行调整,比如:物理机是48g内存,堆内存可以给到20g,新生代给到8g,剩下的一些留给操作系统。
-XX:+UseG1GC -XX:G1HeapRegionSize=16m :选择G1垃圾回收器来做分代回收,对新生代和老年代都用G1回收。这里把G1的region设置为16m,是因为物理内存比较大,如果物理内存不多时,可以设置成2m,设置大,是可以防止region数量过多。region的含义是:G1的各代存储地址是不连续的,每一代都使用了n个不连续的大小相同的Region,每个Region占有一块连续的虚拟内存地址,如下图所示:
在rocketmq/distribution/target/apache-rocketmq/conf/dledger目录下面的配置文件中,可以找到sendMessageThreadPoolNums=16参数,该参数的意思是:RocketMQ内部用来发送消息的线程池的线程数量,默认是16,如果机器的CPU是24核的话,该参数的值可以设置成24或者30
ons 默认有两个brokerName组,分别有0-7共16个队列
还有两个死信队列 topic是 %RETRY%+tag
consumer15分钟消费超时,broker会重发消息
轮询发送到broker队列
如果发送失败会换个队列
自动创建topic时设置队列数量
ons不允许自动创建topic,也不允许修改队列数量
平均分配可消费的 Broker 对应的消息队列 c1对应b1,b2,b3 c2对应d1,d2,d3
以环状轮流分Broker
每个Consume都订阅每个Broker
borker配置说明文档
#broker所属的集群名字
brokerClusterName=rocketmq-cluster
#broker名字,同个集群中的每个broker应当具有它自己独有的名字
brokerName=broker-a
#设置主broker和从broker 其中0 表示 主机,0 表示 从机
brokerId=0
#nameServer地址(地址为ip:端口),多个地址之间用分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,测试时可以开启,实用时关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,测试时可以开启,实用时关闭
#在pull形式消费时若设置了falsename会报subscription group not exist,且收不到消息,在push形式消费时没有影响
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#haService中使用
haListenPort=10912
#主要用于slave同步master
fastListenPort=10909
#定时删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留最长时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#强制删除文件时间间隔(单位毫秒)
#destroyMapedFileIntervalForcibly=120000
#定期检查Hanged文件间隔时间(单位毫秒)
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间,磁盘空间使用率不能超过88%
diskMaxUsedSpaceRatio=88
#存储总路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#异常退出产生的文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#Commitlog每次刷盘最少页数,每页4kb
flushCommitLogLeastPages=4
#ConsumeQueue每次刷盘最页数,每页4kb
#flushConsumeQueueLeastPages=2
#刷盘时间间隔(单位毫秒),此间隔时间优先级高于上面两个参数,即当时间间隔超过之后直接进行刷盘,不考虑页数问题
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色 (1) ASYNC_MASTER 异步复制Master (2) SYNC_MASTER 同步双写Master (3) SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式 (1) ASYNC_FLUSH 异步刷盘 (2)SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#是否开启事务check过程,消息体量大的时候可以不开启,默认为关闭状态
checkTransactionMessageEnable=false
#发消息线程池数量(如果不做配置,个数为16+(核*线程)*4)
#sendMessageThreadPoolNums=128
#拉消息线程池数量(如果不做配置,个数为16+(核*线程)*4)
#pullMessageThreadPoolNums=12
参考资源链接