目录
1、集群方案:
为了消除单点故障,增加可靠性或增大吞吐量,可以在多台机器上部署多个nameserver和broker,并且为每个broker部署1个或多个slave形成集群。集群的模式大概有以下三种,推荐生产环境使用多master多slave同步复制模式,本文也使用此模式进行搭建集群。
(1)多master模式:
一个集群无 Slave,全是 Master。
优点:配置简单,单个Master 宕机或重启维护对应用无影响,在磁盘配置为RAID10 时,即使机器宕机不可恢复情况下,由与 RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到受到影响。
(2)多master多slave异步复制模式:
每个 Master 配置一个 Slave,有多对Master-Slave, HA,采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master 宕机后,消费者仍然可以从 Slave消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。
缺点: Master 宕机,磁盘损坏情况,会丢失少量消息。
(3)(推荐)多master多slave同步复制模式:
每个 Master 配置一个 Slave,有多对Master-Slave, HA采用同步双写方式,主备都写成功,向应用返回成功。
优点:数据与服务都无单点, Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。
缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。
2、集群说明:
本次搭建采用的是多master多slave同步复制集群模式。
RocketMQ集群启动也是先启动所有nameserver节点,然后再启动broker master节点,最后再启动broker slave节点。
3、集群规划:
本地规划使用4个nameserver,2对master-slave,实质上就是在4个linux服务器上安装4个rocketmq,然后分别启动4个rocketmq中的nameserver,然后在每个rocketmq中分别启动broker,每个broker启动对应一个不同的配置文件,在规划的时候一对master-slave的broker所在服务器IP时设计好的。规划表如下:
服务器IP |
节点编号 |
应用角色 |
应用描述 |
端口号 |
192.168.1.141 |
节点a |
nameserver-a |
a节点nameserver |
5432 |
broker-master-a |
a节点master-broker |
10912 |
||
192.168.1.142 |
节点b |
nameserver-b |
b节点nameserver |
5432 |
broker-master-b |
b节点master-broker |
10912 |
||
192.168.1.143 |
节点c |
nameserver-c |
c节点nameserver |
5432 |
broker-slave-a |
a节点slave-broker |
10912 |
||
192.168.1.144 |
节点d |
nameserver-d |
d节点nameserver |
5432 |
broker-slave-b |
b节点slave-broker |
10912 |
4、集群架构图:
5、关闭防火墙:
本次搭建使用虚拟机,为了防止出现防火墙问题,直接关闭了集群中节点服务器的防火墙,如果是在生产环境不允许关闭防火墙,那么就开放集群中用到的nameserver和broker端口号即可。
6、JDK环境安装:
在集群所有节点上配置好JDK环境。
RocketMQ中的NameServer、Broker以及Client都是需要jdk环境的,不同的软件需要的jdk环境最低版本可能不同,详情见下表:
Version |
Client |
Broker |
NameServer |
4.0.0-incubating |
>=1.7 |
>=1.8 |
>=1.8 |
4.1.0-incubating |
>=1.6 |
>=1.8 |
>=1.8 |
4.2.0 |
>=1.6 |
>=1.8 |
>=1.8 |
4.3.x |
>=1.6 |
>=1.8 |
>=1.8 |
4.4.x |
>=1.6 |
>=1.8 |
>=1.8 |
4.5.x |
>=1.6 |
>=1.8 |
>=1.8 |
4.6.x |
>=1.6 |
>=1.8 |
>=1.8 |
4.7.x |
>=1.6 |
>=1.8 |
>=1.8 |
7、软件下载:
一个集群中,所有节点都要使用相同版本的软件。
软件下载地址:http://rocketmq.apache.org/dowloading/releases/
8、软件安装:
在集群所有节点上都要安装好rocketmq。
将下载好的RocketMQ软件包解压到指定文件夹中。
9、配置环境变量:
在集群所有节点上都要配置rocketmq环境变量。
配置rocketmq的环境变量:ROCKETMQ_HOME,值为rocketmq解压安装文件夹的路径,然后将ROCKETMQ_HOME/bin添加到PATH中去。
10、修改日志存储位置:
在集群所有节点上都要修改日志存储位置。
在rocketmq解压安装文件夹conf中的logback_broker.xml、logback_namesrv.xml、logback_tools.xml三个配置文件中配置的各自的日志默认为${user.home}/logs,这样不太好,建议将三个xml文件中所有的user.home全部修改为ROCKETMQ_HOME(rocketmq环境变量)。这样日志就会在rocketmq解压安装文件夹中的logs内了。
11、修改配置文件:
在集群所有节点上都要根据各自节点的角色进行按照对应配置文件各自修改。
在rocketmq中默认的有多master、多master多slave异步复制、多master多slave同步复制的基本配置,我们可以在此基础上进行修改,也可以自己根据下面的master、slave不同角色的节点配置信息样例,进行手动配置一个个参数。
(1)创建namesrv.properties配置文件:
在rocketmq解压安装文件夹中conf中创建namesrv.properties配置文件,并在其中写入:listenPort=5432,这个参数就是指定nameserver端口号的参数。各nameserver可以自定义各自端口号。
(2)修改broker-master配置文件:
以下是master模板配置参数,集群内其它的master节点,只需要复制该配置参数,然后按照对应需要进行修改即可:配置文件见对应文件夹中即可。
# 所属集群名称,同一个集群中所有节点应一致,---不能修改---
brokerClusterName=test-rocketmq-cluster
# broker名称,不同的broker节点,在一个master-slave组内参数相同,不在一个master-slave组内参数不通,---参考修改---
brokerName=broker-a
# 0,表示master;>0,表示slave,---可以不修改---
brokerId=0
# broker对外服务的监听端口,同一个服务器上该端口号避免冲突,---参考修改---
listenPort=10911
# nameserver地址,多个地址用英文分号分隔,---不能修改---
namesrvAddr=127.0.0.1:9876;127.0.0.1:9877;127.0.0.1:9878
# 删除文件时间点,默认凌晨4点,该参数集群所有节点可以默认保持不变,---可以不修改---
deleteWhen=04
# 文件保留时间,默认48小时,该参数集群所有节点可以保持默认不变,---可以不修改---
fileReservedTime=48
# broker角色,有三种:SYNC MASTER、ASYNC MASTER、SLAVE,
# 关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,
# SYNC即同步更新,指当Slave和Master消息同步完成后,再返回发送成功的状态。
# ASYNC即异步更新,master与slave有短暂消息延迟,毫秒级。
# 本次使用同步更新数据,该节点又是master,因此采用:SYNC_MASTER,---不能修改---
brokerRole=SYNC_MASTER
# 刷盘方式,有两种:ASYNC_FLUSH、SYNC_FLUSH,ASYNC表示异步刷新,SYNC表示同步刷新。---可以不修改---
# 同步刷新:生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。
# 异步刷新:生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,
# 异步刷新有两种情况:1是定期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行刷盘。这种方式会存在消息丢失,但是性能很好。默认是这种模式。
flushDiskType=ASYNC_FLUSH
# 是否允许broker自动创建Topic,---可以不修改---
autoCreateTopicEnable=true
# 是否允许broker自动创建订阅组,---可以不修改---
autoCreateSubscriptionGroup=true
# 存储路径,---可以不修改---
storePathRootDir=/wocloud/soft/rocketmq/store-a-master
# commitLog存储路径,---可以不修改---
storePathCommitLog=/wocloud/soft/rocketmq/store/commitlog-a-master
# 消费队列存储路径,---可以不修改---
storePathConsumeQueue=/wocloud/soft/rocketmq/store/consumequeue-a-master
# 消息索引存储路径,---可以不修改---
storePathIndex=/wocloud/soft/rocketmq/store/index-a-master
# checkpoint 文件存储路径,---可以不修改---
storeCheckpoint=/wocloud/soft/rocketmq/store/checkpoint-a-master
# abort 文件存储路径,---可以不修改---
abortFile=/wocloud/soft/rocketmq/store/abort-a-master
(3)修改broker-slave配置文件:
以下是slave模板配置参数,集群内其它的slave节点,只需要复制该配置参数,然后按照对应需要进行修改即可:配置文件见对应文件夹中即可。
# 所属集群名称,同一个集群中所有节点应一致,---不能修改---
brokerClusterName=test-rocketmq-cluster
# broker名称,不同的broker节点,在一个master-slave组内参数相同,不在一个master-slave组内参数不通,---参考修改---
brokerName=broker-a
# 0,表示master;>0,表示slave,---可以不修改---
brokerId=1
# broker对外服务的监听端口,同一个服务器上该端口号避免冲突,---参考修改---
listenPort=10912
# nameserver地址,多个地址用英文分号分隔,---不能修改---
namesrvAddr=127.0.0.1:9876;127.0.0.1:9877;127.0.0.1:9878
# 删除文件时间点,默认凌晨4点,该参数集群所有节点可以默认保持不变,---可以不修改---
deleteWhen=04
# 文件保留时间,默认48小时,该参数集群所有节点可以保持默认不变,---可以不修改---
fileReservedTime=48
# broker角色,有三种:SYNC MASTER、ASYNC MASTER、SLAVE,
# 关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,
# SYNC即同步更新,指当Slave和Master消息同步完成后,再返回发送成功的状态。
# ASYNC即异步更新,master与slave有短暂消息延迟,毫秒级。
# 本次使用同步更新数据,该节点又是master,因此采用:SYNC_MASTER,---不能修改---
brokerRole=SLAVE
# 刷盘方式,有两种:ASYNC_FLUSH、SYNC_FLUSH,ASYNC表示异步刷新,SYNC表示同步刷新。---可以不修改---
# 同步刷新:生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。
# 异步刷新:生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,
# 异步刷新有两种情况:1是定期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行刷盘。这种方式会存在消息丢失,但是性能很好。默认是这种模式。
flushDiskType=ASYNC_FLUSH
# 是否允许broker自动创建Topic,---可以不修改---
autoCreateTopicEnable=true
# 是否允许broker自动创建订阅组,---可以不修改---
autoCreateSubscriptionGroup=true
# 存储路径,---可以不修改---
storePathRootDir=/wocloud/soft/rocketmq/store-a-slave
# commitLog存储路径,---可以不修改---
storePathCommitLog=/wocloud/soft/rocketmq/store/commitlog-a-slave
# 消费队列存储路径,---可以不修改---
storePathConsumeQueue=/wocloud/soft/rocketmq/store/consumequeue-a-slave
# 消息索引存储路径,---可以不修改---
storePathIndex=/wocloud/soft/rocketmq/store/index-a-slave
# checkpoint 文件存储路径,---可以不修改---
storeCheckpoint=/wocloud/soft/rocketmq/store/checkpoint-a-slave
# abort 文件存储路径,---可以不修改---
abortFile=/wocloud/soft/rocketmq/store/abort-a-slave
12、创建文件夹:
按照对应配置文件中最后几个参数配置的各个存储路径,创建对应的文件夹,有可能一个rocketm中启动多个broker实例,因此在配置的时候注意添加a、b、c等节点编号以及master、slave角色。
创建存储路径:
mkdir -p /wocloud/soft/rocketmq/store-a-master
创建commitLog存储路径:
mkdir -p /wocloud/soft/rocketmq/store/commitlog-a-master
创建消费队列存储路径
mkdir -p /wocloud/soft/rocketmq/store/consumequeue-a-master
创建消息索引存储路径
mkdir -p /wocloud/soft/rocketmq/store/index-a-master
创建checkpoint文件存储路径
mkdir -p /wocloud/soft/rocketmq/store/checkpoint-a-master
创建abort文件存储路径
mkdir -p /wocloud/soft/rocketmq/store/abort-a-master
13、修改脚本启动内存:
在集群所有节点上都要根据服务器内存情况进行对应修改。
(1)修改nameserver启动内存:
java的默认启动参数中,启动时堆内存的大小为2g,老旧一点的机器上根本没有这么多空闲内存,通过查看mqbroker.sh文件实质上是调用了同级的runbroker.sh,因此修改runbroker.sh中的内存配置,-Xms:启动内存,默认2g; -Xmx:运行最大内存,默认为2g。根据自己设备内存情况可自行设置,建议这两个参数值大小一致。
(2)修改broker启动内存:
java的默认启动参数中,启动时堆内存的大小为2g,老旧一点的机器上根本没有这么多空闲内存,通过查看mqbroker.sh文件实质上是调用了同级的runbroker.sh,因此修改runbroker.sh中的内存配置,-Xms:启动内存,默认2g; -Xmx:运行最大内存,默认为2g。根据自己设备内存情况可自行设置,建议这两个参数值大小一致。
14、编写启动脚本:
在集群所有节点上都要根据节点角色编写脚本,方便启动集群。
(1)编写nameserver启动脚本:
就是将后台启动nameserver的命令写在一个sh格式脚本中,以后启动方便了就。主要就是命令,然后加上一个日志重定向到指定文件即可。
格式类似如下:忽略命令不对,这个是broker启动命令,换成nameserver启动命令即可。
(2)编写broker启动脚本:
就是将后台启动broker的命令写在一个sh格式脚本中,以后启动方便了就。主要就是命令,然后加上一个日志重定向到指定文件即可。
格式类似如下:
15、启动集群:
启动集群有严格的顺序,先启动集群内所有的nameserver节点,然后再启动所有的broker-master节点,最后启动broker-slave节点。
(1)启动nameserver节点:
在集群中,逐个将nameserver节点上的启动脚本进行运行,启动nameserver服务。
(2)启动broker-master节点:
在集群中,逐个将broker-master节点上的启动脚本进行运行,启动broker-master服务。
(3)启动broker-slave节点:
在集群中,逐个将broker-slave节点上的启动脚本进行运行,启动broker-slave服务。
16、查看集群节点状态:
在集群中任意一个服务器上,执行以下命令查看该集群上所启动的各实例信息:
mqadmin clusterList --namesrvAddr=10.16.13.90:9876
注意:namesrvAddr只写该节点的nameserver地址即可。
17、Rocketmq-console控制台连接集群:
(1)修改配置文件连接集群:
使用winRar等软件打开rocketmq-console的jar包,然后找到取出application.properties配置文件,修改rocketmq.config.namesrvAddr参数为集群的nameserver地址,多个节点用英文分号分隔。然后将修改好的application.properties配置文件替换到jar中旧文件即可。
(2)命令启动指定集群地址:
不修改jar中原有的配置文件,在启动jar包的命令中将集群的nameserver地址传递进去即可,传递参数方式为在命令中增加如下参数:-Drocketmq.config.namesrvAddr=nameserver集群地址(多个节点用英文分号分隔)
例如:
java -Dserver.port=7080 -Drocketmq.config.namesrvAddr=192.168.1.141:5432;192.168.1.142:5432;192.168.1.143:5432;192.168.1.144:5432 -jar rocketmq-console-ng-1.0.0.jar
(3)查看集群信息:
在启动rocketmq-console控制台后,可以在控制台中查看到刚刚搭建好的rocketmq集群各节点详细信息。
18、关闭集群:
(1)关闭nameserver:
在集群所有节点中的nameserver节点上执行以下操作。
在linux中通过cd进入到rocketmq解压安装目录下的bin中,执行关闭nameserver启动命令:
sh mqshutdown namesrv
(2)关闭broker:
在集群所有节点中的broker节点上执行以下操作。
在linux中通过cd进入到rocketmq解压安装目录下的bin中,执行关闭broker启动命令:
sh mqshutdown broker
19、优雅重启个别broker:
Broker 重启可能会导致正在发往这台机器的的消息发送失败,RocketMQ提供了一种优雅关闭Broker的方法,通过执行以下命令会清除Broker的写权限,过40s后,所有客户端都会更新Broker路由信息,此时再关闭Broker就不会发生发送消息失败的情况,因为所有消息都发往了其他 Broker。
(1)清除broker写权限:
在需要重启的broker节点中,通过cd进入到rocketmq解压安装目录下的bin中执行以下命令:
sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr
注意:上面的brokerName、namesrvAddr为参数,自己需要修改成对应具体的参数才可以执行命令。
(2)关闭broker:
执行完以上参数后,至少要等40s,建议等待1min钟,然后再执行命令关闭该broker节点,就可以完全不会有影响了。通过cd进入到rocketmq解压安装目录下的bin中,执行关闭broker命令:
sh mqshutdown broker