前言
最近工作中涉及到了RocketMQ的应用,为方便开发决定本地搭建一套RocketMQ的使用环境。
果然实践是个好东西...
VMware虚拟环境搭建
这个网上有很多教程,只会比我写的详细有条理,这里就不在赘述了。
虚拟机搭建好之后每次重启电脑都无法正常使用,明明前一秒还在愉悦的操练着。
如上图就是不再快乐的现象,如下图就是可以继续快乐的解决方法。
其实是NAT的服务未启动导致的。
计算机右击选择管理
RocketMQ搭建
官网下载
我这里以4.9.5的版本进行的搭建
上传解压
上传到自定义的目录下解压,我的是:/app/rocketmq/rocketmq-all-4.9.5-bin-release 仅做参考
下图是解压后的目录结构
调整运行内存配置
由于感情深厚的电脑性能有限,所有bin/runserver.sh脚本里的内存配置需要调小些:
jdk是1.8的版本所以只改这里就好了。
同样的修改bin/runbroker.sh脚本里的内存配置:
启动服务
RocketMQ有两类服务需要启动,一类是nameService,一类是brokerService。
#启动nameService
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release
nohup bin/mqnamesrv &
#启动brokerService
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release
nohup bin/mqbroker &
#查看启动日志
tail -f nohup.out
成功日志如下:
快速体验
RocketMQ提供了可以快速体验消息收发功能的脚本
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release/bin
#生产者发消息
tools.sh org.apache.rocketmq.example.quickstart.Producer
#消费者消费消息
tools.sh org.apache.rocketmq.example.quickstart.Consumer
RocketMQ Dashboard 搭建
RocketMQ Dashboard 是官方提供的一款可视化管理服务
官网下载
官方只提供了源码,需要自行使用maven进行编译。
修改配置
上传解压
上传至自定义的目录并解压,我的是:/app/rocketmq/rocketmq-dashboard-1.0.0 仅做参考
maven编译
cd /app/rocketmq/rocketmq-dashboard-1.0.0
mvn clean package -Dmaven.test.skip=true
启动服务
编译之后该目录会出现target文件夹,target内有打好的jar包
#执行命令启动dashboard服务
java -jar rocketmq-dashboard-1.0.0.jar
打印这个日志说明成功了,上面显示了端口8800
若浏览器输入地址后提示无法访问此网站,则是由于虚拟机防火墙导致的,简单粗暴就是把防火墙关掉并且开机禁止自启,要么就放开端口(记得重启防火墙不然不生效)。
#检查防火墙是否启用
firewall-cmd --state
#启动防火墙
systemctl start firewalld
#停止防火墙
systemctl stop firewalld
#重启防火墙
systemctl restart firewalld
#开机自启动防火墙
systemctl enable firewalld
#禁止开机自启动防火墙
systemctl disable firewalld
#打开8800端口,添加永久规则
firewall-cmd --zone=public --add-port=8800/tcp --permanent
#关闭8800端口,移除永久规则
firewall-cmd --zone=public --remove-port=8800/tcp --permanent
访问
然后欢迎来到Dashboard
RocketMQ 分布式集群搭建
你知道的我是不会满足于单节点部署的
虚拟机准备
首先对虚拟机进行克隆,这样每台机子的信息,装的插件等等都是一样的,用之前只需要改一下主机名称、静态的ip地址就可以了。
#修改主机名称
hostnamectl set-hostname centos2
#查看主机名称
hostname
#修改静态IP
cd /etc/sysconfig/network-scripts/
vi ifcfg-ens32
集群配置文件
贴心的官方为我们提供了多种集群部署的配置文件模板
2m-noslave:2主无从
2m-2s-sync:2主2从同步
2m-2s-async:2主2从异步
dledger:dledger高可用集群
修改配置
这次按照2m-2s-async部署
主机 | 用途1 | 用途2 |
centos1 | 部署NameServer1 | 部署Dashboard |
centos2 | 部署NameServer2 | 部署BrokerServer-a,BrokerServer-b-s |
centos3 | 部署NameServer3 | 部署BrokerServer-b,BrokerServer-a-s |
第一组broker服务
broker-a.properties
broker-b-s.properties
第二组broker服务
broker-b.properties
broker-a-s.properties
注意:store的路径不能一样,不然同一台机子启动第二个broker服务时会报错,如下:
java.lang.RuntimeException: Lock failed,MQ already started
at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:240)
at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:855)
at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:63)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:57)
这是因为abort是RocketMQ判断服务是否正常关闭的一个标识文件,正常情况下,会在启动时创建,在关闭服务时删除。但如果遇到类似服务器宕机,或者kill -9等非正常关闭服务的情况,这个abort文件不会删除,因此RocketMQ就可以据此判断上一次服务是否正常关闭,非正常则后续就会做一些数据恢复的操作。
启动服务
#第一组服务启动
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release/
nohup bin/mqbroker -c ./conf/2m-2s-async/broker-a.properties &
nohup bin/mqbroker -c ./conf/2m-2s-async/broker-b-s.properties &
#第二组服务启动
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release/
nohup bin/mqbroker -c ./conf/2m-2s-async/broker-b.properties &
nohup bin/mqbroker -c ./conf/2m-2s-async/broker-a-s.properties &
检查集群服务
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release/bin
mqadmin clusterList
Dashboard配置
修改application.properties文件的rocketmq.config.namesrvAddr属性
cd /app/rocketmq/rocketmq-dashboard-1.0.0/src/main/resources
vi application.properties
修改后重新编译即可
若出现下面报错则需要添加环境变量
vi /etc/profile
export NAMESRV_ADDR='localhost:9876'
source /etc/profile
出现下面报错则需要放开对应的端口。
网上很多说broker的配置要添加brokerIP1=xx.xx.xx.xx,咱们是用的本机不是云服务器,所有不用。
需开放的端口
每个服务器需开放七个端口
namesrv:9876
broker主节点:10911、10909、10912
broker从节点:11011、11009、11012
端口规则说明:
namesrv默认端口:9876
broker配置的listenPort 端口:10911
vip通道端口为:listenPort - 2 = 10909
ha通道端口为:listenPort + 1 = 10912
其他命令
查看所有的topic:sh mqadmin topicList -n nameserver地址
查看自定的topic:sh mqadmin topicList -n nameserver地址 | grep YourTopicName
查看消费者信息:sh mqadmin consumerProgress -n nameserver地址
查看消费者信息:sh mqadmin consumerProgress -n nameserver地址 -g yourConsumerGroup
查看Broker状态:sh mqadmin brokerStatus -n nameserver地址 -b brokerIP
Dledger 高可用集群搭建
前面的分布式集群方案虽然通过多个nameserver和多个broker避免了某个nameserver或broker出现异常情况从而导致整个MQ无法正常提供服务的问题,以及slave备份的方式解决了异常情况如磁盘损坏导致数据丢失的问题。但是,依然不完美。
分布式集群方案下,broker的角色已经指定好了,是master就是master,slave就是slave。当某个broker出现异常如宕机时,后续客户端的各种请求,可以发到其他正常的broker上。但是,原本保存在该broker上的消息,就无法正常读取了,需要等到该broker服务重启后,才能重新被消费者处理。
明明slave上就有这些信息,但是碍于身份我们就是用不了,所以我们急需一种解决方案即master出现异常时slave可以转变为新的master继续提供服务,所以Dledger 高可用集群来了。
在Dledger中broker的角色不在指定,由各个broker之间通过Raft协议自行选举出一个leader其他的则作为follower对leader进行备份,同时也为成为leader做好准备,毕竟不想当厨子的裁缝不是好司机。
Raft协议是一种多数同意机制,也就是每次选举需要集群中有超过半数的节点进行确认,才能形成整个集群的共同意志。同时,这也意味着在Dledger中,只要有超过半数的节点能够正常工作,那么整个集群就能正常工作。因此,在部署Dledger时,通常都是部署奇数台服务,这样可以让集群的容错性达到最大。
配置文件
贴心的官方为我们提供了Deldger集群部署的配置文件模板
官方示例了三个配置文件,其可在单机情况下直接部署成一个具有三个broker服务的Dledger集群,这里按照多台主机部署的情景进行一下调整。
修改配置
主机 | 用途1 | 用途2 | 用途3 |
centos1 | 部署NameServer1 | 部署BrokerServer1 | 部署Dashboard |
centos2 | 部署NameServer2 | 部署BrokerServer2 | |
centos3 | 部署NameServer3 | 部署BrokerServer3 |
NameServer和Dashboard没有改动沿用上面的即可。
centos1
cp一份broker.conf,然后修改配置如下:
同理其他主机配置如下:
centos2
centos3
启动服务
#启动nameService服务
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release
nohup bin/mqnamesrv &
#启动broker服务
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release/
nohup bin/mqbroker -c ./conf/dledger/broker.conf &
检查集群服务
cd /app/rocketmq/rocketmq-all-4.9.5-bin-release/bin
mqadmin clusterList
可以看到centos2主机上的broker服务被选举成了master。
咱们验证一下Dledger的选举机制。
停掉centos2主机上的broker服务。
可以看到centos3主机上的broker服务成为了新的master。
至此RocketMQ本地开发环境搭建的过程就告一段落了。
拙作一篇,感谢拨冗翻阅,不妥之处,敬请斧正。