相关概念
NameServer
这里我们可以理解成类似于zk的一个注册中心,而且rocketmq最初也是基于zk作为注册中心的,现在相当于为rocketmq自定义了一个注册中心,代码不超过1000行。RocketMQ 有多种配置方式可以令客户端找到 Name Server, 然后通过 Name Server 再找到 Broker,分别如下,优先级由高到低,高优先级会覆盖低优先级。客户端提供http和ip:端口号的两种方式,推荐使用http的方式可以实现nameserver的热部署。
Push Consumer
Consumer 的一种,应用通常通过 Consumer 对象注册一个 Listener 接口,一旦收到消息,Consumer 对象立刻回调 Listener 接口方法,类似于activemq的方式
Pull Consume
Consumer 的一种,应用通常主动调用 Consumer 的拉消息方法从 Broker 拉消息,主动权由应用控制
Producer Group
一类producer的集合名称,这类producer通常发送一类消息,且发送逻辑一致
Consumer Group
同上,consumer的集合名称
Broker
消息中转的角色,负责存储消息(实际的存储是调用的store组件完成的),转发消息,一般也成为server,同jms中的provider
Message Filter
可以实现高级的自定义的消息过滤
Master/Slave
集群的主从关系,broker的name相同,brokerid=0的为主master,大于0的为从slave,可以一主多从,但一从只能有一主
RocketMQ角色介绍
RocketMQ由四部分构成:Producer、Consumer、Broker和NameServer
启动顺序:NameServer->Broker
rocketmq架构图
RocketMQ的使用
下载
RocketMQ的下载地址http://rocketmq.apache.org/release_notes/release-notes-4.4.0/
配置环境变量
集群部署方式
单Master模式
优点:配置简单,方便部署
缺点:这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用
多Master模式
优点: 配置简单,一个Master宕机重启不会有什么影响
缺点: 单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅
多Master多Slave模式(异步复制)
一个Master配置一个Slave,有多对Master-Slave,采用的异步的方式
,可以一主多从,但一从只能有一主
优点: 即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master 宕机后,消费者仍然可以从 Slave消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。
缺点: Master 宕机,磁盘损坏情况,会丢失少量消息。
多Master多Slave模式(同步双写)
同多 master 多 slave 异步复制模式类似,区别在于 master 和 slave 之间的数据同步方式。
优点:同步双写的同步模式能保证数据不丢失。
缺点:发送单个消息 RT 会略长,性能相比异步复制低10%左右。
刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)
同步方式:同步双写和异步复制(指的一组 master 和 slave 之间数据的同步)
开始搭建
修改broker-a.properties内容
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=localhost:9876;localhost:9877
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口,
listenPort=10910
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=C:\Users\Tang\Desktop\path\broker-a\RootDir
#commitLog 存储路径
storePathCommitLog=C:\Users\Tang\Desktop\path\broker-a\CommitLog
#消费队列存储路径存储路径
storePathConsumeQueue=C:\Users\Tang\Desktop\path\broker-a\ConsumeQueue
#消息索引存储路径
storePathIndex=C:\Users\Tang\Desktop\path\broker-a\Index
#checkpoint 文件存储路径
storeCheckpoint=C:\Users\Tang\Desktop\path\broker-a\point
#abort 文件存储路径
abortFile=C:\Users\Tang\Desktop\path\broker-a\File
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
修改broker-a-b.properties内容
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=localhost:9876;localhost:9877
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口,
listenPort=10920
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=C:\Users\Tang\Desktop\path\broker-a-s\RootDir
#commitLog 存储路径
storePathCommitLog=C:\Users\Tang\Desktop\path\broker-a-s\CommitLog
#消费队列存储路径存储路径
storePathConsumeQueue=C:\Users\Tang\Desktop\path\broker-a-s\ConsumeQueue
#消息索引存储路径
storePathIndex=C:\Users\Tang\Desktop\path\broker-a-s\Index
#checkpoint 文件存储路径
storeCheckpoint=C:\Users\Tang\Desktop\path\broker-a-s\point
#abort 文件存储路径
abortFile=C:\Users\Tang\Desktop\path\broker-a-s\File
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-b 与 broker-a的配置基本相同
修改配置文件
rocketmq默认自带了三种建议的配置
rocketmq-all-4.4.0-bin-release\conf 下我们可以看到
- 2m-2s-async (2主2从异步)
- 2m-2s-sync (2主2从同步)
- 2m-noslave (2主)
我们这里搭建2主2从的模式,企业为了保证数据的不丢失使用的是2主2从 同步
注意事项
- autoCreateTopicEnable=true,建议线下开启测试,线上关闭
- listenPort默认为10911,当一个机器上启动多个broker示例时,需区分开端口
- brokerClusterName 配置集群名字必须相同
- namesrvAddr 配置的时候 有多少个nameSev就写多少个,用";"号隔开.
- broker启动时,默认内存设置比较大,改成适合机器的,细节看下面
- 当一个节点启动多个broker实例时,存储路径如果显示的设置,则需要指定不同的storePath路径,(不设置的话,默认不同)
- brokerName 设置的时候 主broker需要和从broker相同
- brokerId 设置的时候 主设置为0 ,从设置为1,2,3…(有多少从设置多少)
需求内存太大
默认大小
-Xms8g -Xmx8g -Xmn4g
改为:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
该配置视环境情况而定,配置一定要在环境内存允许的情况下,否则启动会报错,本地虚拟机配置很多问题都出在这一步
启动mqnamesrv.cmd(这里是有一台主机上)
启动第一个mqnamesrv 我们可以使用默认的端口地址:9876
启动第二个mqnamesrv 我们需要创建mqnamesrv的配置文件(namesrv.properties)
启动命令
格式: mqnamesrv -c 配置文件
例如:
F:\rocketmq-all-4.4.0-bin-release\bin\mqnamesrv -c F:\rocketmq-all-4.4.0-bin-release\conf\namesrv.properties
启动broker(2主2从)
启动命令
格式: mqbroker -c 配置文件
例如
F:\rocketmq-all-4.4.0-bin-release\bin\mqbroker -c F:\rocketmq-all-4.4.0-bin-release\conf\2m-2s-async\broker-a.properties
启动结果
成功开启
可视化界面查看效果
下载地址:https://github.com/apache/rocketmq-externals
进入到 rocketmq-console
文件夹下,执行如下命令:
mvn clean package -Dmaven.test.skip=true
执行完之后启动
java -jar target/rocketmq-console-ng-1.0.1.jar --server.port=8888 --rocketmq.config.namesrvAddr=localhost:9876;localhost:9877
或者修改application.properties文件
启动
java -jar target/rocketmq-console-ng-1.0.1.jar
测试
成功了(累死了)