我们在博文:一、RocketMQ入门(单机安装、控制台、SpringBoot整合)大概了解了啥是RocketMQ,以及对它进行单机部署,但是RocketMQ一般都是集群搭建的,很少单机的,所以我们在这一篇博文就从0开始搭建一个集群环境,当然这里也不用去考虑太多的原理性东西先。
一、RocketMQ物理部署结构图
由图可知,RocketMQ 最适合的集群搭建模式就是多主多备的模式,这样子可以保证数据的备份和高可用。
二、RocketMQ部署模式
其实我们在rocketmq安装包的conf目录下可以找到如下文件夹,这也对应了RocketMQ的4中部署模式:
(1)broker.conf : 单Master模式
(2)2m-noslave : 多Master模式
(3)2m-2s-sync : 多Master多Slave模式,同步双写
(4)2m-2s-async : 多Master多Slave模式,异步复制
1、单个Master模式
很显然,这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用。
2、多Master模式
一个集群无Slave,全是Master,例如2个Master或者3个Master。
优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
3、多Master多Slave模式,异步复制
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master宕机后,消费者仍然可以从Slave消费,此过程对应用透明,不需要人工干预。性能同多Master模式几乎一样,推荐使用。
缺点:Master宕机,磁盘损坏情况,会丢失少量消息。
4、多Master多Slave模式,同步双写
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,才向应用返回成功。
优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。
缺点:性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,阿里后续版本应该会支持自动切换功能。
通过比较上述四种环境搭建模式优缺点后,一般在生产环境中都是采用2m-2s-async(多Master多Slave模式,异步复制)的集群模式来部署。
三、部署环境准备
这里准备搭建的是“多Master多Slave模式,异步复制”的模式,需要进行一些环境的准备。可以参考我的开头指明的单机模式那篇博文搭建好“rocketmq console”和“springboot”先。
1、部署明细
我这里是打算部署4个NameServer,2个Master,2个Slave。所以这里需要四台linux.
2、linux准备
可以参考我的博文: VMWare安装CentOS7超全图解来搭建一台linux,搭建好配置好网络连接后就可以用这一台直接克隆(注意是完全克隆),克隆完后需要修改下物理地址以及指定IP,我的那篇文章里应该找得到。然后就准备好了四台linux,我这里是;
192.168.157.6
192.168.157.7
192.168.157.8
192.168.157.9
用户和密码因为是测试我这里就直接指定为root/forever.
3、服务器规划
这里打算每台linux都启动一个NameServer(当然我们也可以任意选择两个来启动即可)。
然后192.168.157.6做Master,192.168.157.7做6的slaver,192.168.157.8做Master,192.168.157.9做8的Slaver.
四、开始部署
到这里,rocketmq安装包也下载了,linux也准备了,开始部署。
1、上传文件解压安装rocketmq
用SecureCRT或者别的远程连接工具将rocketmq的安装包:rocketmq-all-4.6.0-bin-release.zip 上传到192.168.157.6的/usr/local
目录下。执行如下命令进行解压安装。
unzip rocketmq-all-4.6.0-bin-release.zip
mv rocketmq-all-4.6.0-bin-release rocketmq
这里有可能找不到unzip命令,那么我们可以如下安装:
yum install -y unzip zip
2、跟上一篇博文一样,修改所需内存
rocketmq的nameserver和broker默认都需要很大的内存,最少2G的,我们的虚拟机怎么承受得了,启动都启动不了,所以这里需要去改一下:
修改NameServer所需内存
cd bin/
vi runserver.sh
将JAVA_OPT全部改为128m
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
修改broker所需内存
cd bin/
vi runbroker.sh
将JAVA_OPT全部改为128m
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m"
3、创建存储路径
在rocketmq的根路径下创建存储路径
mkdir store
commitLog的存储路径
mkdir store/commitlog
消费队列存储路径
mkdir store/consumequeue
消息索引存储路径
mkdir store/index
4、修改配置文件
进入到rocketmq的conf/2m-2s-async的目录下,也就是官方指定好的多主多备模式的配置文件,我们只需要在每个配置文件下都加入如下内容指定存储位置即可,其他的都用默认,这里也不去详解配置的含义,留待另一篇来讲解。
#nameServer地址,分号分割
namesrvAddr=192.168.157.6:9876;192.168.157.7:9876;192.168.157.8:9876;192.168.157.9:9876
#存储路径
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
官方已经默认有如下配置:我们不需要进行任何修改,这里大概解释下各项配置的含义
#所属集群名字
brokerClusterName=DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样,但是一主一备是相同的
brokerName=broker-a
#0 表示Master, >0 表示Slave
brokerId=0
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE 从节点
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
flushDiskType=ASYNC_FLUSH
当然,还有很多很多配置文件,比如指定端口啊,指定是否自动创建主题啊,等等,这里就不说小先。
注:storeCheckPoint:checkpoint文件的作用是记录commitlog、consumequeue、index文件的刷盘时间点,文件固定长度4k,其中只用了该文件的前24个字节。查看其存储格式
5、同步rocketmq文件夹到各个节点。
到上一步,我们的环境和配置基本上都已经弄好了,只需要同步到各个节点即可。
tar -zcvf rocketmq.tar.gz rocketmq
scp rocketmq.tar.gz root@192.168.157.7:/usr/local/
scp rocketmq.tar.gz root@192.168.157.8:/usr/local/
scp rocketmq.tar.gz root@192.168.157.9:/usr/local/
登录各个节点,进行解压
tar -zxvf rocketmq.tar.gz
6、启动NameServer
我们按照上面的规划是打算启动四台NameServer,所以要在每个节点的rocketmq目录下执行启动NameServer的命令。
nohup sh bin/mqnamesrv &
如果我们只需要两个NameServer,那么我们需要将配置文件中的namesrvAddr去掉两个。
7、启动Broker.
按我们上面的规划,要启动4个Broker,两主两备,分别是:
192.168.157.6 主(Master)
192.168.157.7 备(Slaver)
192.168.157.8 主(Master)
192.168.157.9 备(Slaver)
所以我们的启动指定的配置文件也要注意。
#192.168.157.6
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
192.168.157.7
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &
192.168.157.8
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &
192.168.157.9
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &
启动完后,可以用jps命令检查下进程是否存在。
8、因为我们要用SpringBoot来测试,所以关闭防火墙
systemctl stop firewalld
五、测试集群
在之前,大家参照我的第一篇博文,相信已经搭建好了rocketmq console和springboot的测试程序,这里只需要修改配置文件,将NameServer指定为集群即可。
1、修改rocketmq console的application.properties
rocketmq.config.namesrvAddr=192.168.157.6:9876;192.168.157.7:9876;192.168.157.8:9876;192.168.157.9:9876
2、修改springboot测试的application.yml
rocketmq:
name-server: 192.168.157.6:9876;192.168.157.7:9876;192.168.157.8:9876;192.168.157.9:9876
3、分别启动程序
因为一台电脑启动的程序太多了,我这里有点卡。
4、进入console,建立topic,指定broker-a和broker-b
访问:localhost:8080, 因为我这里是没有配置自动创建topic,所以这里要手动创建。
创建好后就可以用测试程序测试了,我们可以看到有4个NameServer和4个Broker
看日志,也可以看到是连接上了
5、发送消息测试
访问:http://localhost:8088/sendMsg 发送消息,会返回success,也可以看得到日志有消费。我们也可以看控制台哟消息,以及集群的消息消费接收情况。
我们也可以测试把8节点停了,可以看到8节点自动切换为Master了,然后把7节点启动起来,可以看到又切换回去了。
完成,收工先!