前言
上节我们对RocketMQ(以下简称RMQ)有了一些基本的认识,大致知道了,什么是RMQ以及他能做什么,今天我们来讲讲如何搭建RMQ,与其说搭建RMQ不如说是搭建RMQ集群,为什么这么说呢?看完这篇文章自然就懂了。

RMQ几个重要角色?
NameServer:名称服务,这是RMQ的一个重点,他是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步,这里可以充当ZK协调集群的作用;
Broker:Broker消息中转角色,主要负责消息的存储转发,Broker分为Master和Slave,一个Master对应多个Slave,但是一个Slave只能对应一个Master,Master和Slave之间通过指定相同的BrokerName和不同的BrokerId来确定主从关系,id为0的就是Master,非0就是Slave,Master也可以部署多个,每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic到NameServer上;
Topic:主题频道,用于生产者和消费者进行消息交流的媒介,生产者将消息发送到指定Topic上,消费者订阅该Topic(生产环境下一般都是消费者先订阅,生产者后生产),RMQ以推的形式主动将消息推给消费者消费;

RMQ的集群模式?
RMQ的集群模式主要有3种:单Master模式,多Master模式,多Master多Slave模式。
单Master模式:顾名思义,只有一台MQ服务器,即一台Broker,这种模式风险比较大,一旦broker宕机或者重启就会导致整个MQ服务不可用;
多Master模式:一个无Slave的MQ集群,集群中只有Master,这样即使其中一台Broker宕机,不会影响整个MQ服务,MQ服务还是可用的,但是宕机的这台Broker上的消息就无法被消费了,当这台Broker重启之后,会重新加入集群消费会被消费掉,所以这种模式可能会存在消息不实时消费的情况,但是消息是不会丢失的;
多Master多Slave模式:一个既有Master又有Slave的集群模式,这种模式能保证消息的实时消费,当Master宕机时,消息还可以从该Master对应的Slave上进行消费,所以这里存在一个问题,就是Master和Slave消息数据的同步问题,主要有2种同步方案可选,一种是同步双写(生产者将消息发送给MQ时,同时向Master和Slave发送,当2台broker同时返回成功才认为消息发送成功),另一种是异步复制(生产者将消息发送到Master上,然后Slave异步去复制Master的消息,这种会存在少量消息丢失)

RMQ集群搭建?
今天我们主要将多Master集群的搭建,单Master没什么好讲的,相当于启动一个Broker就可以了,我们看看多Master,我就以2个Master为例:
环境准备:2台Master
第一步:添加Host信息,主要为了NameServer而设置,为你的机器IP指定nameserver名称

指定完之后,重启网卡: service network restart
每台机器之间ping一下nameserver看看是否能连通:
ping rocketmq-nameserver1、ping rocketmq-nameserver2 ...
第二步:每台机器上都需要安装RMQ,上传压缩包,可以直接官网下载最新版(最新版最低要求JDK8)
下载链接:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/
直接解压,安装;
第三步:创建存储路径
主要是下面这3个文件夹,这3个文件主要就是用来存储MQ上的消息的,相当于持久化存储文件,但是为什么会是三个文件夹呢?后面讲解MQ存储时我会详细讲解,这里暂且先不介绍

第四步:修改Broker配置,进入RMQ下的conf目录下我们会看到下面这几个文件

很明显2m-noslave就是我们需要的配置,进入这个目录下:默认就会有2个broker-a和b配置文件,如果你有N个Master就配置N个broker,我们可以在一台机器上把这些Broker先配置好,然后复制到其他机器上,每个机器启动对应一个broker就可以了

OK,那么我们就来配置broker吧:
# brokerClusterName这里一定要相同,这是集群的名字,配置一样,才能在一个集群中
brokerClusterName=rocketmq-cluster
# 这个是broker的名字,每个配置文件写自己的名字
brokerName=broker-a
# 这个是broker的ID,0代表Master,0代表Slave
brokerId=0
# 这个就是我们之前配置的nameserver,这里你需要哪几个机器作为Master就配置几个机器的nameserver服务吧
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876

配置文件我们其实就配置完了,还有就是启动文件的配置,在bin目录下有2个启动文件:

里面有这一段,根据自己机器的内存大小自己合理分配内存
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
第五步:启动nameserver
分别启动多台机器上的nameserver,上面我们讲过nameserver充当zk的角色,自然而然就很好理解为什么先启动nameserver了
在bin目录下有个

启动命令:nohup sh mqnamesrv & 后台启动
可以通过查看nameserver启动日志

第六步:启动每台机器的Broker
在bin目录下,我们可以看到下面这个

启动命令:分别启动对应broker
#第一台机器
nohup sh mqbroker -c /usr/local/rocketmq-4.2.0/conf/2m-noslave/broker-b.properties &
# 第二台机器
nohup sh mqbroker -c /usr/local/rocketmq-4.2.0/conf/2m-noslave/broker-a.properties &
OK,到此为止,其实RMQ多Master集群就搭建起来了,接下来我们还需要做的就是RMQ的控制台
下载链接:https://github.com/apache/rocketmq-externals

下载下来之后,我们需要修改配置文件:配置你的两台Master机器IP+RMQ端口号,注意下面那个VIP配置要改为false

然后我们使用maven命令打个包:
mvn clean package -Dmaven.test.skip=true

这个控制台是用spring-boot开发的,所以我们只需要打个jar,扔到服务器上直接java -jar启动即可。



启动之后打开浏览器,输入访问路径:

我们的nameserver列表:

OK,RMQ的集群就介绍到这了
原文始发于微信公众号(Justin的后端书架):