个人随笔
目录
二、RocketMQ入门(集群模式搭建与测试)
2020-02-13 23:55:08

我们在博文:一、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个NameServer2个Master2个Slave。所以这里需要四台linux.

2、linux准备

可以参考我的博文: VMWare安装CentOS7超全图解来搭建一台linux,搭建好配置好网络连接后就可以用这一台直接克隆(注意是完全克隆),克隆完后需要修改下物理地址以及指定IP,我的那篇文章里应该找得到。然后就准备好了四台linux,我这里是;

  1. 192.168.157.6
  2. 192.168.157.7
  3. 192.168.157.8
  4. 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目录下。执行如下命令进行解压安装。

  1. unzip rocketmq-all-4.6.0-bin-release.zip
  2. mv rocketmq-all-4.6.0-bin-release rocketmq

这里有可能找不到unzip命令,那么我们可以如下安装:

  1. yum install -y unzip zip

2、跟上一篇博文一样,修改所需内存

rocketmq的nameserver和broker默认都需要很大的内存,最少2G的,我们的虚拟机怎么承受得了,启动都启动不了,所以这里需要去改一下:

修改NameServer所需内存

  1. cd bin/
  2. vi runserver.sh

将JAVA_OPT全部改为128m

  1. JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"

修改broker所需内存

  1. cd bin/
  2. vi runbroker.sh

将JAVA_OPT全部改为128m

  1. JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m"

3、创建存储路径

在rocketmq的根路径下创建存储路径
  1. mkdir store
commitLog的存储路径
  1. mkdir store/commitlog
消费队列存储路径
  1. mkdir store/consumequeue
消息索引存储路径

mkdir store/index

4、修改配置文件

进入到rocketmq的conf/2m-2s-async的目录下,也就是官方指定好的多主多备模式的配置文件,我们只需要在每个配置文件下都加入如下内容指定存储位置即可,其他的都用默认,这里也不去详解配置的含义,留待另一篇来讲解。

  1. #nameServer地址,分号分割
  2. namesrvAddr=192.168.157.6:9876;192.168.157.7:9876;192.168.157.8:9876;192.168.157.9:9876
  3. #存储路径
  4. storePathRootDir=/usr/local/rocketmq/store
  5. #commitLog存储路径
  6. storePathCommitLog=/usr/local/rocketmq/store/commitlog
  7. #消费队列存储路径
  8. storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
  9. #消息索引存储路径
  10. storePathIndex=/usr/local/rocketmq/store/index
  11. #checkpoint 文件存储路径
  12. storeCheckPoint=/usr/local/rocketmq/store/checkpoint
  13. #abort 文件存储路径
  14. abortFile=/usr/local/rocketmq/store/abort

官方已经默认有如下配置:我们不需要进行任何修改,这里大概解释下各项配置的含义

  1. #所属集群名字
  2. brokerClusterName=DefaultCluster
  3. #broker名字,注意此处不同的配置文件填写的不一样,但是一主一备是相同的
  4. brokerName=broker-a
  5. #0 表示Master, >0 表示Slave
  6. brokerId=0
  7. #删除文件时间点,默认凌晨4点
  8. deleteWhen=04
  9. #文件保留时间,默认48小时
  10. fileReservedTime=48
  11. #Broker 的角色
  12. #- ASYNC_MASTER 异步复制Master
  13. #- SYNC_MASTER 同步双写Master
  14. #- SLAVE 从节点
  15. brokerRole=ASYNC_MASTER
  16. #刷盘方式
  17. #- ASYNC_FLUSH 异步刷盘
  18. #- SYNC_FLUSH 同步刷盘
  19. flushDiskType=ASYNC_FLUSH
  20. flushDiskType=ASYNC_FLUSH

当然,还有很多很多配置文件,比如指定端口啊,指定是否自动创建主题啊,等等,这里就不说小先。

注:storeCheckPoint:checkpoint文件的作用是记录commitlog、consumequeue、index文件的刷盘时间点,文件固定长度4k,其中只用了该文件的前24个字节。查看其存储格式

5、同步rocketmq文件夹到各个节点。

到上一步,我们的环境和配置基本上都已经弄好了,只需要同步到各个节点即可。

  1. tar -zcvf rocketmq.tar.gz rocketmq
  2. scp rocketmq.tar.gz root@192.168.157.7:/usr/local/
  3. scp rocketmq.tar.gz root@192.168.157.8:/usr/local/
  4. scp rocketmq.tar.gz root@192.168.157.9:/usr/local/

登录各个节点,进行解压

  1. tar -zxvf rocketmq.tar.gz

6、启动NameServer

我们按照上面的规划是打算启动四台NameServer,所以要在每个节点的rocketmq目录下执行启动NameServer的命令。

  1. 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)

所以我们的启动指定的配置文件也要注意。

  1. #192.168.157.6
  2. nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
  3. 192.168.157.7
  4. nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &
  5. 192.168.157.8
  6. nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &
  7. 192.168.157.9
  8. nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &

启动完后,可以用jps命令检查下进程是否存在。

8、因为我们要用SpringBoot来测试,所以关闭防火墙

  1. systemctl stop firewalld

五、测试集群

在之前,大家参照我的第一篇博文,相信已经搭建好了rocketmq console和springboot的测试程序,这里只需要修改配置文件,将NameServer指定为集群即可。

1、修改rocketmq console的application.properties

  1. 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

  1. rocketmq:
  2. 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节点启动起来,可以看到又切换回去了。

完成,收工先!

 966

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2