**
原理:
RocketMQ是阿里巴巴团队研发的高性能、分布式消息中间件,已捐赠给Apache基金会,面向所有开发人员开源免费使用,本文主要参考其官方快速文档和自己亲自动手实践,我们从了解RocketMQ开始,循序渐进,一步一步亲自实现中间件部署,测试消息收发,从理论和实践两方面学会使用RocketMQ。
1.RocketMQ 是什么
上图是一个典型的消息中间件收发消息的模型,RocketMQ也是这样的设计,简单说来,RocketMQ具有以下特点:
1)是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。
2)Producer、Consumer、队列都可以分布式。
3)Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。
4)支持严格的消息顺序;
5)提供丰富的消息拉取模式
6)高效的订阅者水平扩展能力
7)实时的消息订阅机制
8)亿级消息堆积能力
9)较少的依赖
10)支持Topic与Queue两种模式;
11)同时支持Push与Pull方式消费消息;
2.RocketMQ 物理部署结构
NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic 服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读老消息,产生读I/O),以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。
结合架构技术图和部署图,描述集群工作流程:
启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。
3.RocketMQ 逻辑部署结构
如上图所示,RocketMQ的逻辑部署结构有Producer和Consumer两个特点。
Producer Group
用来表示一个发送消息应用,一个Producer Group下包含多个Producer实例,可以是多台机器,也可以是一台机器的多个进程,或者一个进程的多个Producer对象。一个Producer Group可以发送多个Topic消息,Producer Group作用如下:
4.RocketMQ 数据存储结构
如上图所示,RocketMQ采取了一种数据与索引分离的存储方法。有效降低文件资源、IO资源,内存资源的损耗。即便是阿里这种海量数据,高并发场景也能够有效降低端到端延迟,并具备较强的横向扩展能力。
5.Broker集群有多种配置方式:
1)单Master
优点:除了配置简单没什么优点
缺点:不可靠,该机器重启或宕机,将导致整个服务不可用
2)多Master
优点:配置简单,性能最高
缺点:可能会有少量消息丢失(配置相关),单台机器重启或宕机期间,该机器下未被消费的消息在机器恢复前不可订阅,影响消息实时性
3)多Master多Slave,每个Master配一个Slave,有多对Master-Slave,集群采用异步复制方式,主备有短暂消息延迟,毫秒级
优点:性能同多Master几乎一样,实时性高,主备间切换对应用透明,不需人工干预
缺点:Master宕机或磁盘损坏时会有少量消息丢失
4)多Master多Slave,每个Master配一个Slave,有多对Master-Slave,集群采用同步双写方式,主备都写成功,向应用返回成功
优点:服务可用性与数据可用性非常高
缺点:性能比异步集群略低,当前版本主宕备不能自动切换为主
Master和Slave的配置文件参考conf目录下的配置文件
Master与Slave通过指定相同的brokerName参数来配对,Master的BrokerId必须是0,Slave的BrokerId必须是大于0的数。
一个Master下面可以挂载多个Slave,同一Master下的多个Slave通过指定不同的BrokerId来区分。
Rocketmq默认给出了三种建议配置模式: 2m-2s-async(主从异步); 2m-2s-sync(主从同步); 2m-noslave(仅master)
1)异步刷盘方式:在返回写成功状态时,消息可能只是被写入了内存的PAGECACHE,写操作的返回快,吞吐量大;当内存里的消息量积累到一定程度时,统一触发写磁盘操作,快速写入。
2)同步刷盘方式:在返回写成功状态时,消息已经被写入磁盘。具体流程是,消息写入内存的PAGECACHE后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态。
这两种复制方式各有优劣
在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果Master出了故障,有些数据因为没有被写入Slave,有可能会丢失;在同步复制方式下,如果Master出故障,Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。
同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成ASYNC_MASTER、SYNC_MASTER、SLAVE三个值中的一个。
**
**
1.基础信息
ip地址 主机名 角色
192.168.1.101 mq-master01 broker-master
192.168.1.102 mq-master02 broker-master
192.168.1.103 mq-slave01 broker-slave
192.168.1.104 mq-slave02 broker-slave
192.168.1.105 mq-console-nameserver nameserver、console
192.168.1.106 mq-nameserver nameserver
namesrv端口:9876
console-web端口:18080
broker主节点端口:29701
broker从节点端口:29501
async同步配置,主从不要配置在一台服务器上
2.rocketmq下载地址
http://rocketmq.apache.org/release_notes/release-notes-4.8.0/
3.基础配置
5台机器都要安装统一的java环境(这里安装jdk1.8,参考:http://www.cnblogs.com/kevingrace/p/7607442.html)
[root@mq-master01 ~]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
--------------------------------------------------------------------------
5台机器一定要提前做hosts绑定,否则后续启动broker的时候,会报错诸如:
java.net.UnknownHostException: mq-master01: mq-master01: Name or service not known
[root@mq-master01 bin]# cat /etc/hosts
......
192.168.1.101 mq-master01
192.168.1.102 mq-master02
192.168.1.103 mq-slave01
192.168.1.104 mq-slave02
192.168.1.105 mq-console-nameserver
192.168.1.106 mq-nameserver
4.双master双slave部署
[root@mq-master01 software]# pwd
/data/software
[root@mq-master01 software]# unzip rocketmq-all-4.8.0-bin-release.zip
[root@mq-master01 software]# mv rocketmq-all-4.8.0-bin-release /data/rocketmq
配置broker四个节点机器都要操作:
1.修改master01
192.168.1.100
[root@mq-master01 ~]# vim /data/rocketmq/conf/2m-2s-sync/broker-m.properties
####需要修改的配置项
#Broker集群名称
brokerClusterName=Cluster-RocketMq
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-001100
#当前broker监听的IP
brokerIP1=192.168.1.100
#存在broker主从时,在broker主节点上配置了brokerIP2的话,broker从节点会连接主节点配置的brokerIP2来同步。
brokerIP2=192.168.1.100
#端口设置
listenPort=29701
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE 从节点
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.1.105:9876;192.168.1.106:9876
#rocketmq主路径
rocketmqHome=/data/middleware/rocketmq
#NameServer配置文件路径,建议使用-c指定
configStorePath=/data/middleware/rocketmq/conf/
#存储路径
storePathRootDir=/data/rocketmq/store-m
#commitLog存储路径
storePathCommitLog=/data/rocketmq/store-m/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store-m/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq/store-m/index
#checkpoint文件存储路径
storeCheckpoint=/data/rocketmq/store-m/checkpoint
#abort文件存储路径
abortFile=/data/rocketmq/store-m/abort
#服务端发送线程个数,建议配置成Cpu核数
sendMessageThreadPoolNums=32
#服务端处理查询消息线程池数量默认为8加上当前操作系统CPU核数的两倍
queryMessageThreadPoolNums=40
#服务端处理消息拉取线程池线程数量 默认为16加上当前操作系统CPU核数的两倍
pullMessageThreadPoolNums=80
#是否统计磁盘的使用情况,默认为true
diskFallRecorded=true
#检测物理文件磁盘空间,当磁盘达到预设值的时候程序推送topic会报错。
diskMaxUsedSpaceRatio=80
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数。由于是4个broker节点,所以设置为4
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
####可修改可不修改
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#允许的最大消息体, 默认4M
maxMessageSize=6291456
#文件保留时间,默认 48 小时
fileReservedTime=72
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#在发送线程池任务队列的最大等待时间, 超过时间任务会被移除, 默认200ms
waitTimeMillsInSendQueue=500
#一次消息服务端消息拉取,消息在磁盘中传输允许的最大条数,默认为8条
maxTransferCountOnMessageInDisk=2000
#消息存储到commitlog文件时获取锁类型,如果为true使用ReentrantLock否则使用自旋锁
useReentrantLockWhenPutMessage=false
#延迟队列等级
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 1d 2d
#是否支持消息轨迹
traceTopicEnable=true
#从节点是否可读, 默认false
slaveReadEnable=true
#一次服务消息拉取,消息在内存中传输运行的最大消息条数,默认为32条
maxTransferCountOnMessageInMemory=2000
#IO线程池线程个数,主要是NameServer.broker端解析请求,返回相应的线程个数,这类县城主要是处理网络请求的,解析请求包。然后转发到各个业务线程池完成具体的业务无操作,然后将结果在返回调用方
serverSelectorThreads=3
#netty网络socket接收缓存区大小16MB
serverSocketRcvBufSize=131072
#putMessage锁占用超过该时间,表示 PageCache忙
osPageCacheBusyTimeOutMills=1000
#短轮训等待时间
shortPollingTimeMills=1000
#客户端socket接收缓冲区大小
clientSocketRcvBufSize=131072
#集群名称是否可用在主题使用
clusterTopicEnable=true
#broker名称是否可以用做主体使用
brokerTopicEnable=true
maxErrorRateOfBloomFilter=20
maxMsgsNumBatch=64
#清除过期文件线程调度频率
cleanResourceInterval=10000
commercialBaseCount=1
#是否支持broker快速失败 如果为true表示会立即清除发送消息线程池,消息拉取线程池中排队任务 ,直接返回系统错误
brokerFastFailureEnable=true
commercialBigCount=1
mappedFileSizeConsumeQueue=6000000
#消息消费堆积阈值默认16GB在disableConsumeifConsumeIfConsumerReadSlowly为true时生效
consumerFallbehindThreshold=17179869184
#Commitlog是否开启 transientStorePool机制,默认为 false
transientStorePoolEnable=false
flushConsumerOffsetInterval=5000
#清理broker心跳线程等待时间
waitTimeMillsInHeartbeatQueue=31000
flushCommitLogLeastPages=4
#是否支持强行删除过期文件
cleanFileForciblyEnable=true
msgTraceTopicName=RMQ_SYS_TRACE_TOPIC
#布隆过滤器参数
expectConsumerNumUseFilter=32
#是否启用Epoll IO模型。Linux环境建议开启
useEpollNativeSelector=true
#是否支持根据属性过滤 如果使用基于标准的sql92模式过滤消息则改参数必须设置为true
enablePropertyFilter=true
#删除commitlog文件的时间间隔,删除一个文件后等一下再删除一个文件
deleteCommitLogFilesInterval=100
maxTransferBytesOnMessageInDisk=65536
flushConsumeQueueLeastPages=2
flushIntervalConsumeQueue=1000
#消息发送线程池任务队列初始大小
sendThreadPoolQueueCapacity=10000
#是否支持 PutMessage Lock锁打印信息
debugLockEnable=false
haHousekeepingInterval=20000
#是否支持消息索引文件
messageIndexEnable=true
clientAsyncSemaphoreValue=65535
clientCallbackExecutorThreads=32
putMsgIndexHightWater=600000
#客户端管理线程池任务队列初始大小
clientManagerThreadPoolQueueCapacity=1000000
#netty网络socket发送缓存区大小16MB
serverSocketSndBufSize=131072
maxDelayTime=40
#客户端socket发送缓冲区大小
clientSocketSndBufSize=131072
commercialEnable=true
maxHashSlotNum=5000000
heartbeatThreadPoolNums=32
#事物回查超时时间
transactionTimeOut=6000
#服务端处理控制台管理命令线程池线程数量
adminBrokerThreadPoolNums=16
#查询消息默认返回条数,默认为32
defaultQueryMaxNum=32
maxTransferBytesOnMessageInMemory=262144
forceRegister=true
#是否启用ConsumeQueue扩展属性
enableConsumeQueueExt=false
longPollingEnable=true
#netty业务线程池个数
serverWorkerThreads=8
#消息索引是否安全,默认为 false,文件恢复时选择文件检测点(commitlog.consumeque)的最小的与文件最后更新对比,如果为true,文件恢复时选择文件检测点保存的索引更新时间作为对比
messageIndexSafe=false
#删除consumequeue文件时间间隔
deleteConsumeQueueFilesInterval=100
haSlaveFallbehindMax=268435456
#netty public任务线程池个数,netty网络设计没根据业务类型会创建不同线程池毛笔如处理发送消息,消息消费心跳检测等。如果业务类型(RequestCode)未注册线程池,则由public线程池执行
serverCallbackExecutorThreads=0
flushCommitLogThoroughInterval=10000
commercialTimerCount=1
enableDLegerCommitLog=false
#是否使用安全传输层协议
useTLS=false
#重试删除文件间隔,配合destorymapedfileintervalforcibly
redeleteHangedFileInterval=120000
flushIntervalCommitLog=500
#网络连接最大空闲时间。如果链接空闲时间超过此参数设置的值,连接将被关闭
serverChannelMaxIdleTimeSeconds=120
maxIndexNum=20000000
#清除过滤数据的时间间隔
filterDataCleanTimeSpan=86400000
#broker服务器过滤服务器数量
filterServerNums=0
#一次提交至少需要脏页的数量,默认4页,针对 commitlog文件
commitCommitLogLeastPages=4
#清除消息拉取线程池任务队列的等待时间。如果系统时间减去任务放入队列中的时间小于waitTimeMillsInPullQueue,本次请求任务暂时不移除该任务
waitTimeMillsInPullQueue=5000
haSendHeartbeatInterval=5000
processReplyMessageThreadPoolNums=80
clientChannelMaxIdleTimeSeconds=120
#消息过滤是否支持重试
filterSupportRetry=false
flushDelayOffsetInterval=10000
#是否允许重复复制,默认为 false
duplicationEnable=false
replyThreadPoolQueueCapacity=10000
#从服务器是否坚持 offset检测
offsetCheckInSlave=false
clientCloseSocketIfTimeout=false
#transientStorePool中缓存 ByteBuffer个数,默认5个
transientStorePoolSize=5
#是否温和地使用 MappedFile如果为true,将不强制将内存映射文件锁定在内存中
warmMapedFileEnable=false
#处理提交和回滚消息线程池
endTransactionThreadPoolNums=72
flushCommitLogTimed=false
flushLeastPagesWhenWarmMapedFile=4096
clientWorkerThreads=4
#处理提交和回滚消息线程池线程队列大小
endTransactionPoolQueueCapacity=100000
#broker注册频率 大于1分钟为1分钟小于10秒为10秒
registerNameServerPeriod=30000
#注册broker超时时间
registerBrokerTimeoutMills=6000
#访问消息在内存中比率,默认为40
accessMessageInMemoryMaxRatio=40
highSpeedMode=false
#事物回查次数
transactionCheckMax=15
#文件恢复时是否校验CRC
checkCRCOnRecover=true
#销毁MappedFile被拒绝的最大存活时间,默认120s。清除过期文件线程在初次销毁mappedfile时,如果该文件被其他线程引用,引用次数大于0.则设置MappedFile的可用状态为false,并设置第一次删除时间,下一次清理任务到达时,如果系统时间大于初次删除时间加上本参数,则将ref次数一次减1000,知道引用次数小于0,则释放物理资源
destroyMapedFileIntervalForcibly=120000
#commitlog提交频率
commitIntervalCommitLog=200
clientOnewaySemaphoreValue=65535
storeReplyMessageEnable=true
traceOn=true
#服务端处理客户端管理(心跳 注册 取消注册线程数量)
clientManageThreadPoolNums=32
channelNotActiveInterval=60000
mappedFileSizeConsumeQueueExt=50331648
#消费管理线程池任务队列大小
consumerManagerThreadPoolQueueCapacity=1000000
#send oneway消息请求并发度
serverOnewaySemaphoreValue=256
haListenPort=19702
#是否开启比特位映射
enableCalcFilterBitMap=false
clientPooledByteBufAllocatorEnable=false
aclEnable=false
#同步刷盘超时时间
syncFlushTimeout=5000
#是否拒绝事物消息
rejectTransactionMessage=false
#Commitlog两次提交的最大间隔,如果超过该间隔,将忽略commitCommitLogLeastPages直接提交
commitCommitLogThoroughInterval=200
#链接超时时间
connectTimeoutMillis=3000
#查询消息线程池任务队列初始大小
queryThreadPoolQueueCapacity=20000
#消息区域
regionId=DefaultRegion
#服务端处理消费管理 获取消费者列表 更新消费者进度查询消费进度等
consumerManageThreadPoolNums=32
#如果消费组消息消费堆积是否禁用该消费组继续消费消息
disableConsumeIfConsumerReadSlowly=false
flushConsumerOffsetHistoryInterval=60000
#是否支持从服务器获取nameServer
fetchNamesrvAddrByAddressServer=false
haTransferBatchSize=32768
compressedRegister=false
commercialTransCount=1
#事物回查周期
transactionCheckInterval=60000
mappedFileSizeCommitLog=1073741824
startAcceptSendRequestTimeStamp=0
#ByteBuffer是否开启缓存
serverPooledByteBufAllocatorEnable=true
#异步消息发送最大并发度
serverAsyncSemaphoreValue=64
#清理提交和回滚消息线程队列等待时间
waitTimeMillsInTransactionQueue=3000
heartbeatThreadPoolQueueCapacity=50000
#ConsumeQueue扩展过滤bitmap大小
bitMapLengthConsumeQueueExt=112
#从 transientStorepool中获取 ByteBuffer是否支持快速失败
fastFailIfNoBufferInStorePool=false
flushConsumeQueueThoroughInterval=60000
#消费者数量变化后是否立即通知RebalenceService线程,以便马上进行重新负载
notifyConsumerIdsChangedEnable=true
#Broker权限 默认为6表示可读可写
brokerPermission=6
#消息传输是否使用堆内存
transferMsgByHeap=true
#消息拉去线程池任务队列初始大小
pullThreadPoolQueueCapacity=100000
2.修改master02
192.168.1.101
[root@mq-master02 ~]# vim /data/rocketmq/conf/2m-2s-sync/broker-m.properties
#Broker集群名称
brokerClusterName=Cluster-RocketMq
#broker名字具有唯一性不可重复
brokerName=broker-00101
#Broker服务地址
brokerIP1=192.168.1.101
#BrokerIP地址,供slave同步消息的地址
brokerIP2=192.168.1.101
#端口设置
listenPort=29701
#0 表示 Master,>0 表示 Slave
brokerId=0
3.修改slave01
192.168.1.103
[root@mq-slave01 software]# vim /data/rocketmq/conf/2m-2s-sync/brokers-s.properties
###只修改如下内容
#注意这一行的名称要和master01保持一致
brokerName=broker-001100
#Broker服务地址
brokerIP1=192.168.1.103
#端口设置
listenPort=29501
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 的角色
brokerRole=SLAVE
#存储路径
storePathRootDir=/data/rocketmq/store-s
#commitLog存储路径
storePathCommitLog=/data/rocketmq/store-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store-s/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq/store-s/index
#checkpoint文件存储路径
storeCheckpoint=/data/rocketmq/store-s/checkpoint
#abort文件存储路径
abortFile=/data/rocketmq/store-s/abort
4.修改slave02
192.168.1.104
[root@mq-slave02 software]# vim /data/rocketmq/conf/2m-2s-sync/brokers-s.properties
###只修改如下内容
#注意这一行的名称要和master02保持一致
brokerName=broker-001101
#Broker服务地址
brokerIP1=192.168.1.104
#端口设置
listenPort=29501
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 的角色
brokerRole=SLAVE
5.修改nameserver
[root@mq-console-nameserver software]# vim /data/rocketmq/conf/namesrv.properties
listenPort=9876
6.修改日志文件(六台都要修改)
[root@mq-master01 ~]# mkdir -p /data/rocketmq/logs
[root@mq-master01 ~]# cd /data/rocketmq/conf
[root@mq-master01 conf]# sed -i 's#${user.home}#/data/rocketmq#g' *.xml
7.设置rocketmq内存大小
runbroker.sh
runserver.sh
搜索-server -Xms 根据自己服务器修改
4.启动NameServer和BrokerServer
启动顺序:先启动NameServer,再启动BrokerServer(启动BrokerServer之前先关闭防火墙)
停止顺序:先停止BrokerServer,再停止NameServer
首先在5个节点机器上设置下rocketmq启动的java路径,否则会报错:
ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! !!
(可以使用find / -name java找出java的安装路径,取出JAVA_HOME路径)
[root@mq-master01 bin]# vim /data/rocketmq/bin/runbroker.sh
.....
JAVA_HOME=/usr/java/jdk1.8.0_131 #加入这一行
1.首先在192.168.1.105和106节点机器上启动NameServer
编写启动脚本startNameServer.sh:
[root@mq-console-nameserver ~]# cat /data/rocketmq/startNameServer.sh
export ROCKETMQ_HOME=/data/middleware/rocketmq
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv -c $ROCKETMQ_HOME/conf/namesrv.properties > $ROCKETMQ_HOME/logs/namesrv.log 2>&1 &
[root@mq-console-nameserver ~]# chmod 755 /data/rocketmq/startNameServer.sh
[root@mq-console-nameserver ~]# sh /data/rocketmq_namesrv/startNameServer.sh
2.接着在四个broker节点机器上启动BrokerServer
编写启动脚本:
master:
[root@mq-master01 ~]# cat /data/rocketmq/start-Broker-m.sh
export ROCKETMQ_HOME=/data/middleware/rocketmq
nohup /bin/sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-m.properties > $ROCKETMQ_HOME/logs/broker-m.log 2>&1 &
slave:
[root@mq-slave01 ~]# cat /data/rocketmq/start-Broker-s.sh
export ROCKETMQ_HOME=/data/middleware/rocketmq
nohup /bin/sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-s.properties > $ROCKETMQ_HOME/logs/broker-s.log 2>&1 &
5.修改rocketMq的tools.sh文件不然执行rocketmq命令会报错
[root@mq-console-nameserver software]# vim /data/rocketmq/bin/tools.sh
#在JAVA_OPT配置中,在-Djava.ext.dirs这一行的后面添加ext的路径,原配置如下:
JAVA_OPT="${
JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
JAVA_OPT="${
JAVA_OPT} -Djava.ext.dirs=${
BASE_DIR}/lib:${
JAVA_HOME}/jre/lib/ext"
JAVA_OPT="${
JAVA_OPT} -cp ${
CLASSPATH}"
修改为:
JAVA_OPT="${
JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
JAVA_OPT="${
JAVA_OPT} -Djava.ext.dirs=${
BASE_DIR}/lib:${
JAVA_HOME}/jre/lib/ext:/usr/java/jdk1.8.0_65/jre/lib/ext"
JAVA_OPT="${
JAVA_OPT} -cp ${
CLASSPATH}"
查看rocketmq集群状态:
[root@mq-console-nameserver software]# /data/rocketmq/bin/mqadmin clusterList -n 192.168.1.105:9876
6.rocketMq监控平台rocketmq-console部署
RocketMQ-Console是RocketMQ项目的扩展插件,是一个图形化管理控制台,提供Broker集群状态查看,Topic管理,Producer、Consumer状态展示,消息查询等常用功能,这个功能在安装好RocketMQ后需要额外单独安装、运行。
#克隆项目到本地
git clone https://github.com/apache/rocketmq-externals.git
#进入目录
cd rocketmq-externals/rocketmq-console/
#修改maven项目的资源文件
vim src/main/resources/application.properties
###管理后台访问上下文路径,默认为空,如果填写,一定要前面加“/”,后面不要加,否则启动报错
server.contextPath=/rocketmq
###访问端口
server.port=18080
### SSL setting 默认就行
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
#logback配置文件路径,先默认即可
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
###namesrv地址,多个地址用英文分号“;”隔开
rocketmq.config.namesrvAddr=192.168.1.105:9876;192.168.1.106:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket
#Must create userInfo file: ${
rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false
#mvn构建成jar包
mvn clean package -Dmaven.test.skip=true
#启动jar包
java -jar target/rocketmq-console-ng-1.0.0.jar
#如果配置文件没有填写Name Server的话,可以在启动项目时指定namesrvAddr
java -jar target/rocketmq-console-ng-1.0.0.jar --rocketmq.config.namesrvAddr='localhost:9876'
#访问管理平台
192.168.1.105:18080/rockermq
#查看集群状态
/data/rocketmq/bin/mqadmin clusterList -n 192.168.1.105:9876
生产遇到的问题排错处理
今天开发说程序推送topic的时候报错如下:
org.apache.rocketmq.client.exception.MQBrokerException: CODE: 14 DESC: service not available now, maybe disk full, CL: 0.04 CQ: 0.04 INDEX: 0.04, maybe your broker machine memory too small. BROKER: 137.192.6.81:19801
此问题是rocketmq配置的安装目录磁盘空间不足导致,每个版本默认的阈值是不一样的,当磁盘空间超过这个阈值的时候在推送topic会出错。
1.修改broker配置文件提高默认阈值
diskFallRecorded=true
diskMaxUsedSpaceRatio=80
2.加硬盘或者删数据