服务器环境:    
A:192.168.2.201  nameserver、master、slave    
B:192.168.2.202  nameserver、master、slave    
nameserver默认监听端口:9876    
broker默认监听端口:10911    
本实验是:2m-2s-sync模式,启动顺序为:nameserver—>broker master—>broker slave

1、下载二进制安装包:    
下载:http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip
官网:http://rocketmq.apache.org/

2、解压并重命名:    
# unzip  rocketmq-all-4.4.0-bin-release.zip     
# mv  rocketmq-all-4.4.0  /usr/local/rocketmq

3、新建数据和日志目录(两台都执行):    
若不新建日志目录,则日志在当前用户的logs目录下   
# mkdir -p /usr/local/rocketmq/{‘data-master’,’logs-master’}     
# mkdir -p /usr/local/rocketmq/{‘data-slave’,’logs-slave’}

4、修改日志配置文件(两台都执行):    
# cd /usr/local/rocketmq/conf && sed -i ‘s#${user.home}#/usr/local/rocketmq#g’ *.xml

5、修改broker的master配置文件(两台都执行):    
# broker-a.properties      表示master的配置文件    
# broker-a-s.properties   表示master所对应的slave的配置文件

# vi /usr/local/rocketmq/conf/2m-2s-sync/broker-a.properties    
#所属集群名字    
brokerClusterName=Cluster-2012

#broker名字    
brokerName=broker-201    

#0表示master,>0表示slave    
brokerId=0    

#删除文件时间点,默认凌晨4点    
deleteWhen=04  
 
#文件保留时间,默认48小时    
fileReservedTime=48    

#broker的角色,ASYNC_MASTER:表示异步复制master,SYNC_MASTER:表示双写master  
brokerRole=ASYNC_MASTER    

#刷盘方式,ASYNC_FLUSH:表示异步刷盘,ASYNC_FLUSH:表示同步刷盘    
flushDiskType=ASYNC_FLUSH    

#nameserver地址,如有多个以分号分割
namesrvAddr=192.168.2.201:9876;192.168.2.202:9876    

#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数    
defaultTopicQueueNums=4    

#是否允许broker自动创建topic,建议线下开启,线上关闭    
autoCreateTopicEnable=true    

#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭     
autoCreateSubscriptionGroup=true    

#broker对外服务的监听端口    
listenPort=10911    

#commitlog每个文件的大小默认为1G    
mapedFileSizeCommitLog=1073741824  
 
#ConsumeQueue每个文件默认存30w条    
mapedFileSizeConsumeQueue=300000    

#强制删除文件间隔时间(单位毫秒)    
destroyMapedFileIntervalForcibly=120000    

#定期检查Hanged文件间隔时间(单位毫秒)    
redeleteHangedFileInterval=120000       

#检测物理文件侧畔空间    
diskMaxUsedSpaceRatio=88    

#存储路径    
storePathRootDir=/usr/local/rocketmq/data1    

#commitlog存储路径    
storePathCommitLog=/usr/local/rocketmq/logs1    

#限制的消息大小    
maxMessageSize=65536    

#刷commitlog,至少刷几个page    
flushCommitLogLeastPages=4    

#刷ConsumeQueue,至少刷几个page    
flushConsumeQueueLeastPages=2  
 
#刷commitlog,彻底刷盘间隔时间    
flushCommitLogThoroughInterval=10000 
   
#刷ConsumeQueue,彻底刷盘间隔时间        
flushConsumeQueueThoroughInterval=60000    

checkTransactionMessageEnable=false    
#发消息线程池数量    
sendMessageThreadPoolNums=128    

#拉消息线程池数量    
pullMessageThreadPoolNums=128

6、修改broker的slave配置文件(两台都执行):    
# vi /usr/local/rocketmq/conf/2m-2s-sync/broker-a-s.properties   
(除了下列几项不同,其他配置均相同)    
brokerId=20    
brokerRole=SLAVE    
listenPort=11911

7、启动nameserver(两台都执行):    
# cd /usr/local/rocketmq/bin    
# nohup ./mqnamesrv &   
(停止:./mqshutdown namesrv)

8、启动broker master(两台都执行):    
# cd /usr/local/rocketmq/bin
# nohup ./mqbroker -c ../conf/2m-2s-sync/broker-a.properties &
(停止:./mqshutdown broker)

9、启动broker slave(两台都执行):    
# cd /usr/local/rocketmq/bin    
# nohup ./mqbroker -c ../conf/2m-2s-sync/broker-a-s.properties &

10、验证,查看集群信息:   
# cd /usr/local/rocketmq/bin    
# ./mqadmin clusterList -n ‘192.168.2.201:9876;192.168.2.202:9876’

搭建RocketMQ的web监控界面:RocketMQ-Console:
1、拉取镜像:     
# docker pull styletang/rocketmq-console-ng

2、运行镜像:    
# docker run -e “JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.2.201:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false” -p 8080:8080 -t styletang/rocketmq-console-ng

3、浏览器输入:http://192.168.2.201:8080

启动常见错误:   
若启动时出现OOM错误,则是因为服务器内存不足,修改启动脚本中的 JAVA_OPT参数:    
修改nameserver启动脚本:    
# vi /usr/local/rocketmq/bin/runserver.sh
修改broker启动脚本:    
# vi /usr/local/rocketmq/bin/runbroker.sh

RocketMQ中的主要角色:
NameServer:单点,供Producer和Consumer获取Broker地址。
Broker:通俗的讲就是MQ的服务器,消息中转角色,负责存储消息,转发消息。
Producer:发送消息到消息队列。
Consumer:从消息队列接收消息。
Consumer Group:同一个Consumer Group下的各个实例将共同消费topic的消息,起到负载均衡的作用。
Topic 消息的逻辑管理单位。
Message Queue:消息物理管理单位,一个Topic将有若干个Queue。
Offset:message queue是无限长的数组。一条消息进来下标就会涨1,而这个数组的下标就是offset。
max offset:下一条消息的offset。
min offset:标识现存在的最小offset,消费会被物理地从磁盘删除,message queue的min offset也就对应增长。这意味着比min offset要小的那些消息已经不在broker上了。

consumer offset:
Message 消息 
body 消息体,用于携带消息具体内容
key 消息的key,用于区别不同的消息一般是业务id,根据key查询到消息
tag 消息的Tag,用于不同的订阅者过滤消息

RocketMQ基本的部署结构,主要分为NameServer集群、Broker集群、Producer集群和Consumer集群四个部分。
NameServer集群:NameServer的作用是注册中心,类似于Zookeeper,但又有区别于它的地方。每个NameServer节点互相之间是独立的,没有任何信息交互,也就不存在任何的选主或者主从切换之类的问题,因此NameServer与Zookeeper相比更轻量级。单个NameServer节点中存储了活跃的Broker列表(包括master和slave),这里活跃的定义是与NameServer保持有心跳。
Broker集群:Broker是具体提供业务的服务器,分为Master与Slave。一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。master和slave之间的同步方式分为同步双写和异步复制,异步复制方式master和slave之间虽然会存在少量的延迟,但性能较同步双写方式要高出10%左右。
Producer集群:Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳(与nameserver之间没有心跳)。Producer完全无状态,可集群部署。单个Producer和与其关联的所有broker保持长连接,并维持心跳。默认情况下消息发送采用轮询方式,会均匀发到对应Topic的所有queue中。
Consumer集群:Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。单个Consumer和与其关联的所有broker保持长连接,并维持心跳,失去心跳后,则关闭连接,并向该消费者分组的所有消费者发出通知,分组内消费者重新分配队列继续消费。

NameServer的主要功能:
是为整个MQ集群提供服务协调与治理,具体就是记录维护Topic、Broker的信息,及监控Broker的运行状态。为client提供路由能力(具体实现和zk有区别,NameServer是没有leader和follower区别的,不进行数据同步,通过Broker轮训修改信息)。看下阿里中间件团队对NameServer特点总结:Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注