异步(高效)、解耦(如数据分发,增删消费者、串行执行时消费者部分异常)、削峰(高qps)
Rabbit | Rocket | kafka | |
单机吞吐 | 万 | 10万 | 10万 |
时效 | us | ms | ms |
可用性 | 高 | 很高,分布式 | 很高,分布式 |
其它 | 丰富界面、功能全、低延时、erlang开发 |
功能完备、扩展性强、Java开发 |
未用过 |
producer | 生产者 |
consumer | 消费者 |
broker | 内部有exchange和多个queue, 负责消息暂存和发送 |
name server | broker管理服务 |
topic | 区分消息的种类,一个发送者可以发送消息给一个或多个topic,一个消息的接收者可以订阅一个或者多个topic |
message queue | topic的分区,用于并行发送,接收消息 |
缺点:宕机就废了
优点:配置简单,单个宕机无影响,在磁盘配置为RAIDIO时,即使机器宕机无法恢复,由于RAIDIO非常可靠,消息不会丢失(异步刷盘丢少量,同步不丢),性能最高
缺点:宕机期间,这台机器未被消费的消息无法被订阅
每个master都配置slave,有多对master-slave,HA(high avaliable)采用异步复制,主备有短暂消息延迟,
优点:若磁盘故障,消息丢失量少,且实时性不受影响,consumer可以通过slave消费,
缺点:master宕机,消息仍然有少量会丢失
每个master配置slave,有多个master-slave,HA(high avaliable)采用同步双写,即只有主备均成功,才返回成功
优点:数据、服务都无单点故障,master宕机,消息无延迟,服务可用性和数据可用性提高
缺点:性能会比异步复制低10%左右,发送单个消息的RT略高,且目前版本在主节点宕机后备机无法自动切换为主机
双主双从集群(2m-2s)同步双写方式,即使用两组 Master-Slave 形成集群
1)启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
2)Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
3)收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
4)Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
5)Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。
防火墙开放端口
在实际工作中,应只对外暴露需要被外部访问的端口。
nameserver: 默认使用 9876 端口
master: 默认使用 10911 端口
slave: 默认使用 11011 端口
# 开放name server默认端口
firewall-cmd --zone=public --add-port=9876/tcp --permanent
# 开放master默认端口
firewall-cmd --zone=public --add-port=10911/tcp --permanent
# 开放slave默认端口 (当前集群模式可不开启)
firewall-cmd --zone=public --add-port=11011/tcp --permanent
# 重启防火墙
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --list-ports
配置环境变量,以实现全局命令:vim /etc/profile
在 profile 文件最底行增加
#set rocketmq
ROCKETMQ_HOME=/usr/local/rocketmq
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PAT
刷新配置:source /etc/profile
创建消息存储路径,mq 获取到消息后,broker 会默认将消息持久化,持久化目录默认为 /home,故可以修改消息存储路径
# 创建消息存储文件夹
cd /usr/local/rocketmq
mkdir store
mkdir ./store/commitlog
mkdir ./store/consumequeue
mkdir ./store/index
创建slave文件夹,避免和master共用一个存储文件夹,否则会报 Lock failed,MQ already started
# 创建 slave 存储的文件夹
cd /usr/local/rocketmq
mkdir s_store
mkdir ./s_store/commitlog
mkdir ./s_store/consumequeue
mkdir ./s_store/index
配置 broker 配置文件,rocketmq 已经提供了一些集群模式的配置文件模板
cd /usr/local/rocketmq/conf
修改集群配置:
序号 | IP | 角色 | 架构模式 |
1 | 192.168.234.135 | nameserver、brokerserver | Master1、Slave2 |
2 | 192.168.234.139 | nameserver、brokerserver | Master2、Slave1 |
1)Master1 配置(192.168.234.135)
vi /usr/soft/rocketmq/conf/2m-2s-sync/broker-a.properties
修改配置文件内容:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
brokerIP1=192.168.234.135
#nameServer地址,分号分割
namesrvAddr=192.168.234.135:9876;192.168.234.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
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
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
2)Slave2 配置(192.168.234.135)
vi /usr/soft/rocketmq/conf/2m-2s-sync/broker-b-s.properties
修改配置文件内容:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
brokerIP1=192.168.234.135
#nameServer地址,分号分割
namesrvAddr=192.168.234.135:9876;192.168.234.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/s_store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/s_store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/s_store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/s_store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/s_store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/s_store/abort
#限制的消息大小
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
3)Master2 配置(192.168.234.139)
vi /usr/soft/rocketmq/conf/2m-2s-sync/broker-b.properties
修改配置文件内容:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
brokerIP1=192.168.234.139
#nameServer地址,分号分割
namesrvAddr=192.168.234.139:9876;192.168.234.135:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
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
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
4)Slave1 配置(192.168.234.139)
vi /usr/soft/rocketmq/conf/2m-2s-sync/broker-a-s.properties
修改配置文件内容:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
brokerIP1=192.168.234.139
#nameServer地址,分号分割
namesrvAddr=192.168.234.135:9876;192.168.234.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/s_store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/s_store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/s_store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/s_store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/s_store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/s_store/abort
#限制的消息大小
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
【注:】
master的配置文件中有brokerIP1和brokerIP2:多网卡的机器,可以用IP1来标注broker要监听的具体ip,如果有备机,备机会连接IP2节点同步数据,根据需要配置
slave的配置文件中有brokerIP1:可以配置IP1,且由于是备机不需要IP2
开放对应端口
根据自己在 Master 文件中设定的 ListenPort 值,计算需要开放的端口:
1) Master1
在 Master1 中定义的 listenPort 为 10911,故需要暴露:
vip通道端口:10911 - 2 = 10909
HA 端口:10911 + 1 = 10912
firewall-cmd --zone=public --add-port=10909/tcp --permanent
firewall-cmd --zone=public --add-port=10912/tcp --permanent
firewall-cmd --reload
2) Master2
在 Master2 中定义的 listenPort 为 11011,故需要暴露:
vip通道端口:11011 - 2 = 11009
HA 端口:11011 + 1 = 11012
firewall-cmd --zone=public --add-port=11009/tcp --permanent
firewall-cmd --zone=public --add-port=11012/tcp --permanent
firewall-cmd --reload
创建脚本文件
nameserver 脚本:
# 创建启动文件
vim name_start.sh
# 添加内容
nohup sh mqnamesrv &
echo "nameserver 启动成功 .."
tail -f ~/logs/rocketmqlogs/namesrv.log
# 创建关闭文件
vim name_stop.sh
# 添加内容
sh mqshutdown namesrv
echo "nameserver 关闭成功..."
echo "再次搜索结果为:"
sleep 3
jps
在135服务器上:
# 编写master1启动脚本
vim b_master1_start.sh
# 添加内容
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a.properties &
tail -f ~/logs/rocketmqlogs/broker.log
# 编写slave2启动脚本
vim b_slave2_start.sh
# 添加内容
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b-s.properties &
tail -f ~/logs/rocketmqlogs/broker.log
在139服务器上:
# 编写master2启动脚本
vim b_master2_start.sh
# 添加内容
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-b.properties &
tail -f ~/logs/rocketmqlogs/broker.log
# 编写slave1启动脚本
vim b_slave1_start.sh
# 添加内容
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/broker-a-s.properties &
tail -f ~/logs/rocketmqlogs/broker.log
RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,这个便是管理控制台项目了,先将incubator-rocketmq-externals拉到本地,因为我们需要自己对rocketmq-console进行编译打包运行。
下载项目 -> git clone https://github.com/apache/rocketmq-externals
修改配置文件:
打包:
mvn clean package -Dmaven.test.skip=true
将打包后的jar包放到服务器上,启动控制台:java -jar rocketmq-console-ng-1.0.0.jar
启动成功后,在浏览器访问 localhost:8080 进入控制台界面即可