服务器环境:
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配置决定。