在前面,我们介绍了如果快速安装单个RocketMQ。快速安装意味着这只是在测试环境下的小打小闹,我们在单机安装的基础上,尝试安装RocketMQ集群。本次安装为了方便,使用的是已经编译好的二进制包进行安装部署。
1. RocketMQ的集群介绍
RocketMQ集群解决了单机版RocketMQ所存在的单点故障问题,并且还可以对RocketMQ性能进行横向的拓展。
下图是官网上的架构图,可以看到RocketMQ分为四个部分:
- 生产者集群 (只能往broker的master节点写入消息)
- 消费者集群 (能消费broker中的master和slave节点的消息)
- NameServer集群 (没有主备之分)
- Broker集群 (区分master和slave)
其中,根据RocketMQ Broker的集群方式的不同,大概可以分为三种:
- 多Master
- 多Master多Slave异步复制
- 多Master多Slave同步复制
在配置文件所在目录 conf 中,我们可以看到有三个文件夹:2m-noslave、2m-2s-async、2m-2s-sync。这三个目录刚好对应上面提到的三种集群方式,里面包含了官方给的配置示例,我们待会会在这个基础上修改。
同步复制和异步复制的解析:
异步复制和同步复制的区别在于,同步复制只有在master和slave都确认之后才向应用返回成功,而异步复制只需要master确认即可。所以,同步复制的效率比异步复制会低,据说低10%左右。当然,异步复制带来高性能的同时也会有数据丢失的风险。
2. 环境准备
下面我们将要部署双master双slave同步复制的RocketMQ集群,这里需要准备两个虚拟机。
主机 | IP地址 | 角色 | 模式 |
---|---|---|---|
rockermq01 | 192.168.113.11 | nameserver、broker-a-master、broker-b-slave | 主备 |
rockermq02 | 192.168.113.12 | nameserver、broker-a-slave、broker-b-master | 主备 |
3. 启动多个Nameserv和Broker
3.1 下载安装RocketMQ
#下载二进制包
wget http://mirror.bit.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-release.zip
#解压到 /usr/local目录下,并创建软连接
unzip rocketmq-all-4.4.0-bin-release.zip
mv rocketmq-all-4.4.0-bin-release /usr/local/
ln -s /usr/local/rocketmq-all-4.4.0-bin-release /usr/local/rocketmq
就这样,rockermq就安装好了,接下来我们要修改配置文件。
3.2 修改Broker配置文件
由于默认的数据和日志存储的位置是当前用户的家目录,我们还需要修改到 /data/rocketmq目录下:
#新建相关目录
mkdir -p /data/rocketmq/{store-a,store-b}
日志目录的配置文件在 conf的几个xml文件里面:
cd /usr/local/rocketmq/conf
sed -i "s/\${user.home}/\/data\/rocketmq/g" logback_broker.xml
sed -i "s/\${user.home}/\/data\/rocketmq/g" logback_namesrv.xml
sed -i "s/\${user.home}/\/data\/rocketmq/g" logback_tools.xml
最后,我们进入到 2m-2s-sync 目录下,修改里面的broker配置文件:
cd /usr/local/rocketmq/conf/2m-2s-sync/
- 192.168.113.11 机器上Master-Broker的配置文件 broker-a.properties
namesrvAddr=192.168.113.11:9876;192.168.113.12:9876
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerid=O
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
#修改存储路径
storePathRootDir=/data/rocketmq/store-a
storePathCommitLog=/data/rocketmq/store-a
storePathConsumeQueue=/data/rocketmq/store-a
storePathIndex=/data/rocketmq/store-a
storeCheckpoint=/data/rocketmq/store-a
abortFile=/data/rocketmq/store-a
- 192.168.113.11 机器上Slave-Broker的配置文件 broker-b-s.properties
namesrvAddr=192.168.113.11:9876;192.168.113.12:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=11011
#修改存储路径
storePathRootDir=/data/rocketmq/store-b
storePathCommitLog=/data/rocketmq/store-b
storePathConsumeQueue=/data/rocketmq/store-b
storePathIndex=/data/rocketmq/store-b
storeCheckpoint=/data/rocketmq/store-b
abortFile=/data/rocketmq/store-b
- 192.168.113.12 机器上Slave-Broker的配置文件 broker-a-s.properties
namesrvAddr=192.168.113.11:9876;192.168.113.12:9876
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=11011
#修改存储路径
storePathRootDir=/data/rocketmq/store-a
storePathCommitLog=/data/rocketmq/store-a
storePathConsumeQueue=/data/rocketmq/store-a
storePathIndex=/data/rocketmq/store-a
storeCheckpoint=/data/rocketmq/store-a
abortFile=/data/rocketmq/store-a
- 192.168.113.12 机器上Master-Broker的配置文件 broker-b.properties
namesrvAddr=192.168.113.11:9876;192.168.113.12:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
#修改存储路径
storePathRootDir=/data/rocketmq/store-b
storePathCommitLog=/data/rocketmq/store-b
storePathConsumeQueue=/data/rocketmq/store-b
storePathIndex=/data/rocketmq/store-b
storeCheckpoint=/data/rocketmq/store-b
abortFile=/data/rocketmq/store-b
3.3 启动Nameserver和Broker
先启动两台机器的Nameserver
nohup sh bin/mqnamesrv &
然后分别启动4个Broker进程:
#在192.168.113.11上
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties &
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties &
#在192.168.113.12上
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties &
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties &
就这样,RocketMQ双主双从的集群就已经搭建好了,通过rocketmq-console的监控页面,可以看到如下的集群情况:
4. 部分配置参数说明
namesrvAddr=192.168.113.11:9876;192.168.113.12:9876
NamerServer 的地址,可以是多个。brokerClusterName=DefaultCluster
Cluster 的地址,如果集群机器数比较多,可以分成多个Cluster ,每个Cluster 供一个业务群使用。brokerName=broker-a
Broker 的名称, Master 和Slave 通过使用相同的Broker 名称来表明相互关系,以说明某个Slave 是哪个Master 的Slave 。brokerId=0
一个Master Barker 可以有多个Slave, 0 表示Master ,大于0 表示不同Slave 的ID 。deleteWhen=04
与fi leReservedTim巳参数呼应,表明在几点做消息删除动作,默认值04 表示凌晨4 点。fileReservedTime=48
在磁盘上保存消息的时长,单位是小时,自动删除超时的消息。brokerRole=SYNC_MASTER
broker Role 有3 种: SYNC_MASTER 、ASYNC_MASTER 、SLAVE 。关键词SYNC 和ASYNC 表示Master 和Slave 之间同步消息的机制, SYNC 的意思是当Slave 和Master 消息同步完成后,再返回发送成功的状态。flushDiskType=ASYNC_FLUSH
flushDiskType 表示刷盘策略,分为SYNC_FLUSH 和ASYNC_FLUSH 两种,分别代表同步刷盘和异步刷盘。同步刷盘情况下,消息真正写人磁盘后再返回成功状态;异步刷盘情况下,消息写人page_cache 后就返回成功状态。listenPort=11011
Broker 监听的端口号,如果一台机器上启动了多个Broker , 则要设置不同的端口号,避免冲突。
这些配置参数,在Broker 启动的时候生效,如果启动后有更改,要重启Broker 。现在使用云服务或多网卡的机器比较普遍, Broker 自动探测获得的ip地址可能不符合要求,通过brokerIP1 =47 .98.41.234 这样的配置参数,可以设置Broker 机器对外暴露的ip 地址。