以下部分内容来源借鉴于儒猿技术窝 以及RocketMQ官方文档
目前要做到的是实现RocketMQ的高可用,总体的部署架构如下
也就是说,NameServer会部署3个节点,来保证所有的broker能够注册到NameServer上面,哪怕之后又一个NameServer挂掉了,生产者或者消费者也能够找到一个NameServer从而路由到所有的Broker
每个Master部署2个对应的Slave Broker,在保证消息的正常存储之后,一旦Master Broker挂掉之后,能够基于Dledger能够将2个Slave Broker中选举出来一个切换为主节点,进而保证消息的高可用。
所以目前先以上面的图来进行部署,在部署之后也要保证有一个对应的RocketMQ的可视化界面,至于如何保证RocketMQ的在高并发场景下如何部署和搭建,可以后续再进行补充。
准备一台4G+内存的虚拟机或者linux服务器
官网要求:
- 64bit OS, Linux/Unix/Mac is recommended;(Windows user see guide below)
- 64bit JDK 1.8+;
- Maven 3.2.x;
- Git;
- 4g+ free disk for Broker server
所以,按照上述内容进行准备一台Linux机器
官网:https://rocketmq.apache.org/docs/quick-start/
git clone https://github.com/openmessaging/openmessaging-storage-dledger.git
cd openmessaging-storage-dledger
mvn clean install -DskipTests
ps:如果感觉mav下载依赖比较慢
mvn -X 命令可以查看到maven的setting.xml位置
后续配置成阿里的maven仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
下载rocketmq源码
git clone https://github.com/apache/rocketmq.git
cd rocketmq
git checkout -b store_with_dledger origin/store_with_dledger
mvn -Prelease-all -DskipTests clean install -U
cd distribution/target/apache-rocketmq
在这个目录中,需要编辑三个文件,一个是bin/runserver.sh,一个是bin/runbroker.sh,另外一个是bin/tools.sh
在里面找到如下三行,然后将第二行和第三行都删了,同时将第一行的值修改为你自己的JDK的主目录
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
接着执行下面的命令进行快速RocketMQ集群启动:
sh bin/dledger/fast-try.sh start
ps:由于我这边机器本身的是一个4G的虚拟机,我这边手动调整了JVM分配的堆内存大小,以及新生代的大小。在其中遇到一个错误就是我在修改那3个sh文件的时候JAVA_HOME我为了偷懒直接JAVA_HOME=$JAVA_HOME导致了地址错误,最后启动时候一直报错。
使用下面命令查看rocketMQ运行情况
sh bin/mqadmin clusterList -n 127.0.0.1:9876
我们发现30921端口的Broker的BID是0,说明他是Master
此时我们可以用命令(lsof -i:30921)找出来占用30921端口的进程PID,接着就用kill -9的命令给他杀了,比如我这里占用30921端口的进程PID是4344,那么就执行命令:kill -9 4344
接着等待个10s,再次执行命令查看集群状态:
sh bin/mqadmin clusterList -n 127.0.0.1:9876
此时就会发现作为Leader的BID为0的节点,变成另外一个Broker了,这就是说Slave切换为Master了。
开启NameServer
配置每个broker注册到的NameServer
配置RocketMQ可视化工具
git clone https://github.com/apache/rocketmq-externals.git
然后进入rocketmq-console的目录:
cd rocketmq-externals/rocketmq-console
执行以下命令对rocketmq-cosole进行打包,把他做成一个jar包:
mvn package -DskipTests
然后进入target目录下,可以看到一个jar包,接着执行下面的命令启动工作台:
java -jar rocketmq-console-ng-2.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr=127.0.0.1:9876
关闭防火墙:systemctl stop firewalld(我是Centos7.9 其他版本需要自己查如何关闭防火墙)
这里务必要在启动的时候设置好NameServer的地址,如果有多个地址可以用分号隔开,接着就会看到工作台启动了,然后就通过浏览器访问那台机器的8080端口就可以了,就可以看工作台界面。
代码参考官网:
https://rocketmq.apache.org/docs/simple-example/
实际代码地址(02springboot-rocketmq):
https://gitee.com/xiejueshenshang/java-learn-history.git
eureka截图
代码运行后效果:
番外:
上面部署的其实没有完全达到我想要的结果,主要是没有做到master broker 和salve broker分机器部署,我虽然用了两个虚拟机操作,但是可能是我系统配置不够的原因,开了两个虚拟机后其中一个运行一段时间莫名其妙的宕掉了 ,所以集群配置的话参考了一个博客,主要是修改了
然后指定了同一个brokername来证明是同一个broker的主从,后续启动的时候需要调整,需要按照配置文件进行启动(但是我看了下好像博文没有做到,主备切换)