声明:这是我在大学毕业后进入第一家互联网工作学习的内容
阿里云企业级RocketMQ费用较高,不如自建MQ,这个任务又交给我了,由于我正好认识一个RocketMQ社区的大佬,参与MQ的改良,找大佬取了下经。
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力
选用理由:
主题 Tpoic:第一级消息类型,书的标题
标签 Tags:第二级消息类型,书的目录,可以基于 Tag 做消息过滤
例如:
生产组:用于消息的发送。
消费组:用于消息的订阅处理。
生产组和消费组,方便扩缩机器,增减处理能力,集群组的名字,用于标记用途中的一 员。每次只会随机的发给每个集群中的一员。
推荐的几种 Broker 集群部署方式,这里的 Slave 不可写,但可读,类似于 Mysql 主备方式。
这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用。
一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master
启动方式:
每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用异步复制方式,主备有短 暂消息延迟,毫秒级。
启动方式:
每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用同步双写方式,主备都写 成功,向应用返回成功。
启动方式:
以上 Broker 与 Slave 配对是通过指定相同的 brokerName 参数来配对,Master 的 BrokerId 必须是 0,Slave 的 BrokerId 必须是大与 0 的数。另外一个 Master 下面可以挂 载多个 Slave,同一 Master 下的多个 Slave 通过指定不同的 BrokerId 来区分。
MQ每种部署方式都有优缺点,不过我们生产环境的业务是需要全程无人干预,不考虑性能情况,希望MQ高可用,做好监控报警规则即可。
综上我选择 多 Master 多 Slave 模式,异步复制模式
部署环境双主双从异步复制,由于生产环境机器只配备了2台高性能主机,16c 32g,我准备做一个伪集群。
IP | 角色 |
---|---|
172.31.26.22 | nameServer1,broker-a,broker-b-slave |
172.31.26.23 | nameServer2,broker-b,broker-a-slave |
需求 | 版本 |
---|---|
操作系统 | centos7.6 |
JDK | 1.8 |
RocketMQ版本 | rocketmq-all-4.3.2-bin-release.zip |
RocketMQ控制台 | rocketmq-console-ng-1.0.0.jar |
RocketMQ目录 | /opt |
RocketMQ日志 | /opt/rocketmq-all-4.3.2-bin-release/logs/ |
时间同步 | ntpdate ntp1.aliyun.com |
MQ安装包及控制台链接如下:
链接:https://pan.baidu.com/s/1QOv2deLsczD4QYXxQc1Juw
提取码:jui6
将rocketmq-all-4.3.2-bin-release.zip、rocketmq-console-ng-1.0.0.jar放到任意一台服务器上,配置完成然后分发到其他服务器上即可。
[root@VM-26-22 ~]# cd /opt/
[root@VM-26-22 ~]# unzip rocketmq-all-4.3.2-bin-release.zip
[root@VM-26-22 ~]# cd /opt/rocketmq-all-4.3.2-bin-release/bin
[root@VM-26-22 bin]# tree
.
├── cachedog.sh
├── cleancache.sh
├── cleancache.v1.sh
├── mqadmin
├── mqadmin.cmd
├── mqadmin.xml
├── mqbroker
├── mqbroker.cmd
├── mqbroker.numanode0
├── mqbroker.numanode1
├── mqbroker.numanode2
├── mqbroker.numanode3
├── mqbroker.xml
├── mqnamesrv
├── mqnamesrv.cmd
├── mqnamesrv.xml
├── mqshutdown
├── mqshutdown.cmd
├── os.sh
├── play.cmd
├── play.sh
├── README.md
├── runbroker.cmd
├── runbroker.sh
├── runserver.cmd
├── runserver.sh
├── setcache.sh
├── startfsrv.sh
├── tools.cmd
└── tools.sh
找到 runserver.sh 和broker.sh
查看系统参数
由于我不太懂jvm调优,但是大佬说32g的机器运行1个namesrv和2个borker就可以用官方自带的配置,不过以后我对这个参数调优会研究一下,先这么装吧。
vim runserver.sh
-server -Xms4g -Xmx4g -Xmn2g
vim runbroker.sh
-server -Xms8g -Xmx8g -Xmn4g
一共有4个配置文件,现在我们一次性配置好,由于有一些默认配置,不需要修改的我就没有列上,如果对消息队列自动开启topic及调整消息大小等有要求可以自行百度添加这些参数。
下面的配置的IP根据实际IP替换即可
注意:本配置默认不自动创建topic,需要手动添加
[root@VM-26-22 ~]# cd /opt/rocketmq-all-4.3.2-bin-release/conf/2m-2s-async
[root@VM-26-22 2m-2s-async]# tree
.
├── broker-a.properties
├── broker-a-s.properties
├── broker-b.properties
└── broker-b-s.properties
主节点broker配置
vim broker-a.properties
brokerClusterName=DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
brokerIP1=172.31.26.22
#nameServer 地址,分号分割
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=24
#存储路径
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-a
#Broker的角色
brokerRole=Master
#刷盘方式 ASYNC_FLUSH 异步刷盘 SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
vim broker-b.properties
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerIP1=172.31.26.23
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876
brokerId=0
deleteWhen=04
fileReservedTime=24
brokerRole=Master
flushDiskType=ASYNC_FLUSH
listenPort=10911
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-b
从节点broker配置
vim broker-a-s.properties
brokerClusterName=DefaultCluster
brokerIP1=172.31.26.23
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=24
brokerRole = SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10921
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-a
vim broker-b-s.properties
brokerClusterName=DefaultCluster
brokerIP1=172.31.26.22
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=24
brokerRole = SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10921
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-b
[root@VM-26-22 ~]#cd /opt/rocketmq-all-4.3.2-bin-release/
修改完成后将mq所有文件夹拷到每一台服务器上
[root@VM-26-22 ~]#scp -r /opt/rocketmq-all-4.3.2-bin-release [email protected]:/opt/
启动方式参考上面所说的,由于部署方式是伪集群,所以将机器C、D的从节点放到B、A机器上运行。
先进入2台服务器分别启动NameServer
cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqnamesrv >/dev/null 2>&1 &
在机器172.31.26.22 执行
cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-a.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-a.log 2>&1 &
在机器172.31.26.23 执行
cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-b.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-b.log 2>&1 &
在机器172.31.26.23 执行
cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-a-s.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-a.log 2>&1 &
在机器172.31.26.22 执行
cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-b-s.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-b.log 2>&1 &
在机器172.31.26.22 找到rocketmq-console-ng-1.0.0.jar的目录 执行
nohup java -jar rocketmq-console-ng-1.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr='172.31.26.22:9876;172.31.26.23:9876' >/dev/null 2>&1 &
安装完成打开 http://172.31.26.22:8080 即可看到MQ控制台
至此生产环境MQ搭建完成,本篇还有参数调优的方面没有介绍,而且部署方式也是伪集群,不是真正的高可用,如果有资源的话最好每台机器都部署一个broker,最后附上大佬博客,在此感谢。
http://wuwenliang.net/
跟我学RocketMQ
Apache-RocketMQ
Github-RocketMQ
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。