rocketmq_001_集群搭建

优点

异步(高效)、解耦(如数据分发,增删消费者、串行执行时消费者部分异常)、削峰(高qps)

缺点

  1. 可用性降低:越引入依赖,稳定性越差,一旦宕机会对业务造成影响,也就是说要更深一层执行可用性策略
  2. 一致性降低:如果群发各个服务,如何处理个别机器未收到消息的情况,也就是说要更深一层执行一致性策略
  3. 复杂度升高:使用异步通信机制,如何保证消息的消费次数重复,如果防止消息丢失,如果保证消息顺序

主流MQ

  Rabbit Rocket kafka
单机吞吐 10万 10万
时效 us ms ms
可用性 很高,分布式 很高,分布式
其它

丰富界面、功能全、低延时、erlang开发

功能完备、扩展性强、Java开发

未用过


rocketmq_001_集群搭建_第1张图片

角色介绍

producer 生产者
consumer 消费者
broker 内部有exchange和多个queue, 负责消息暂存和发送
name server broker管理服务
topic 区分消息的种类,一个发送者可以发送消息给一个或多个topic,一个消息的接收者可以订阅一个或者多个topic
message queue topic的分区,用于并行发送,接收消息

集群特点

  1. name sever是一个无状态节点,集群间并无信息同步,而是broker向每一个server发送信息实现同步
  2. 所有broker要和每一个nameserver建立长连接,定时发送route info(心跳、ip、topic...); broker部署相对复杂,broker分为master、slave ( 一个master对多个slave、一个slave对一个master ),master和slave对应关系通过指定相同的 brokerClusterName、brokerName 和 不同的 brokerId 来确定(0是master,>0是slave)
  3. producer和nameServer集群进行长连接,定时发送心跳,定时获取nameServer集群的topic信息
  4. producer和master建立长连接,定时向master发送心跳,master支持producer的topic
  5. consumer和master、slave都可建立长连接,定时发送心跳,具体和哪一个建立长连接要看broker的配置信息,master、slave需要支持consumer订阅的topic

集群模式

单master

缺点:宕机就废了

多master

优点:配置简单,单个宕机无影响,在磁盘配置为RAIDIO时,即使机器宕机无法恢复,由于RAIDIO非常可靠,消息不会丢失(异步刷盘丢少量,同步不丢),性能最高

缺点:宕机期间,这台机器未被消费的消息无法被订阅

多master多slave(异步)

每个master都配置slave,有多对master-slave,HA(high avaliable)采用异步复制,主备有短暂消息延迟,

优点:若磁盘故障,消息丢失量少,且实时性不受影响,consumer可以通过slave消费,

缺点:master宕机,消息仍然有少量会丢失

多master多slave(同步)

每个master配置slave,有多个master-slave,HA(high avaliable)采用同步双写,即只有主备均成功,才返回成功

优点:数据、服务都无单点故障,master宕机,消息无延迟,服务可用性和数据可用性提高

缺点:性能会比异步复制低10%左右,发送单个消息的RT略高,且目前版本在主节点宕机后备机无法自动切换为主机

双主双从集群搭建(同步)

1、总体架构图

双主双从集群(2m-2s)同步双写方式,即使用两组 Master-Slave 形成集群

rocketmq_001_集群搭建_第2张图片

2 工作流程

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建立连接通道,开始消费消息。

3 双主双从集群搭建流程

防火墙开放端口
在实际工作中,应只对外暴露需要被外部访问的端口。

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

rocketmq_001_集群搭建_第3张图片

修改集群配置:

序号 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

rocketmq_001_集群搭建_第4张图片

在 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

rocketmq_001_集群搭建_第5张图片

在 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
修改配置文件:

rocketmq_001_集群搭建_第6张图片

打包:

mvn clean package -Dmaven.test.skip=true

将打包后的jar包放到服务器上,启动控制台:java -jar rocketmq-console-ng-1.0.0.jar

启动成功后,在浏览器访问 localhost:8080 进入控制台界面即可

rocketmq_001_集群搭建_第7张图片

你可能感兴趣的:(中间件)