系列文章目录
消息队列RocketMQ入门实践(一)
消息队列RocketMQ入门实践(二)
消息队列RocketMQ入门实践–关键特性(三)
消息队列RocketMQ入门实践–关键特性(四)
消息队列RocketMQ入门实践–消息存储(五)
消息队列RocketMQ入门实践–消息重试策略(六)
前言
嗨,大家好。我是希留
前面我们搭建了一个单机的RocketMQ服务,但一般生产上使用都是搭建的集群服务。所以今天这篇文章就记录一下我是怎么搭建一个双主双从的集群的。
一、集群模式
在RocketMQ中,集群的部署模式是比较多的,有以下几种:
-
单个Master
∘ \circ ∘ 这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用。 -
多Master模式
∘ \circ ∘ 一个集群无Slave,全是Master,例如2个Master或者3个Master
∘ \circ ∘ 单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不 可订阅,消息实时性会受到影响。 -
多Master多Slave模式,异步复制
∘ \circ ∘ 每个Master配置一个Slave,有多对Master-Slave,采用异步复制方式,主备有短暂消息延迟,毫秒级。
∘ \circ ∘ 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master宕机后,消费者仍然可以从Slave消费,此过程对应用透明,不需要人工干预。性能同多Master模式几乎一样。
∘ \circ ∘ 缺点:Master宕机,磁盘损坏情况,会丢失少量消息。 -
多Master多Slave模式,同步双写
每个Master配置一个Slave,有多对Master-Slave,采用同步双写方式,主备都写成功,向应用返回成功。
∘ \circ ∘ 优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。
∘ \circ ∘ 缺点:性能比异步复制模式略低,大约低10%左右
二、搭建2m2s异步刷盘集群
由于我只有一台服务器,资源有限,就通过docker来搭建集群。
1. 创建2个master
1.1 创建 nameserver01 容器 (没有拉取镜像直接创建容器时,会自动先拉取镜像)
// docker 创建命令
docker create -p 9876:9876 --name rmqserver01 \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-e "JAVA_OPTS=-Duser.home=/opt" \
-v /rmq/rmqserver/logs:/opt/logs \
-v /rmq/rmqserver/store:/opt/store \
foxiswho/rocketmq:server-4.3.2
如下图所示
1.2 创建nameserver02容器
docker create -p 9877:9876 --name rmqserver02 \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-e "JAVA_OPTS=-Duser.home=/opt" \
-v /rmq/rmqserver02/logs:/opt/logs \
-v /rmq/rmqserver02/store:/opt/store \
foxiswho/rocketmq:server-4.3.2
出现一串字符串就表示创建完成
2. 创建 broker
2.1 创建第1个master broker
取名 broker01
// docker 命令
docker create --net host --name rmqbroker01 \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /rmq/rmqbroker01/conf/broker.conf:/etc/rocketmq/broker.conf \
-v /rmq/rmqbroker01/logs:/opt/logs \
-v /rmq/rmqbroker01/store:/opt/store \
foxiswho/rocketmq:broker-4.3.2
如下图所示就是创建成功。
创建broker相关目录
修改 broker.conf 配置
#nameServer地址,分号分割
namesrvAddr=42.194.222.32:9876;42.194.222.32:9877
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=xiliu-Cluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker01
#brokerid,0就表示是Master,>0的都是表示 Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
brokerIp1=42.194.222.32
brokerIp2=42.194.222.32
#Broker 对外服务的监听端口
listenPort=10911
2.2 创建第2个master broker
取名 broker02
docker create --net host --name rmqbroker02 \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /rmq/rmqbroker02/conf/broker.conf:/etc/rocketmq/broker.conf \
-v /rmq/rmqbroker02/logs:/opt/logs \
-v /rmq/rmqbroker02/store:/opt/store \
foxiswho/rocketmq:broker-4.3.2
修改配置
namesrvAddr=42.194.222.32:9876;42.194.222.32:9877
brokerClusterName=xiliu-Cluster
brokerName=broker02
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
#刷盘方式 异步刷盘
flushDiskType=ASYNC_FLUSH
brokerIp1=42.194.222.32
brokerIp2=42.194.222.32
listenPort=10811
2.3 创建第1个slave broker
slave broker01
docker create --net host --name rmqbroker03 \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /rmq/rmqbroker03/conf/broker.conf:/etc/rocketmq/broker.conf \
-v /rmq/rmqbroker03/logs:/opt/logs \
-v /rmq/rmqbroker03/store:/opt/store \
foxiswho/rocketmq:broker-4.3.2
配置
namesrvAddr=42.194.222.32:9876;42.194.222.32:9877
brokerClusterName=xiliu-Cluster
brokerName=broker01
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
brokerIp1=42.194.222.32
brokerIp2=42.194.222.32
listenPort=10711
2.4 创建第2个slave broker
slave broker02
docker create --net host --name rmqbroker04 \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /rmq/rmqbroker04/conf/broker.conf:/etc/rocketmq/broker.conf \
-v /rmq/rmqbroker04/logs:/opt/logs \
-v /rmq/rmqbroker04/store:/opt/store \
foxiswho/rocketmq:broker-4.3.2
配置
namesrvAddr=42.194.222.32:9876;42.194.222.32:9877
brokerClusterName=xiliu-Cluster
brokerName=broker02
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
brokerIp1=42.194.222.32
brokerIp2=42.194.222.32
listenPort=10611
3. 启动容器
先启动nameserver:docker start rmqserver01 rmqserver02
在启动broker:docker start rmqbroker01 rmqbroker02 rmqbroker03 rmqbroker04
三、验证集群
由于我部署了rocketmq-console管理工具,所以可以直接进入控制台看到相关集群信息。集群搭建完成
总结
以上就是本文的主要内容了。本文主要介绍了RocketMQ双主双从的集群服务搭建,环境搭建起来还是比较容易,主要还是要自己动手去搭建,熟悉一些配置。 感谢大家的阅读,如有疑问之处,欢迎在评论区留言交流~