第三章 搭建RocketMQ (Deldger集群)

第三章 搭建RocketMQ (Deldger集群)

第一章 RocketMQ基础知识
第二章 搭建RocketMQ (单机)
第三章 搭建RocketMQ (Deldger集群)



RocketMQ 应用场景

一、RocketMQ4.X多种集群模式

各模式相关配置目录:/rocketmq-4.9.3/conf

  1. 单节点

优点:本地开发测试,配置简单,同步刷盘消息一条都不会丢
缺点:不可靠,如果宕机会导致服务不可用

  1. 主从(异步,同步双写)

指一个Master节点和一个Slave节点
优点:同步双写消息不丢失, 异步复制存在少量丢失 ,主节点宕机,从节点可以对外提供消息的消费,但是不支持写入
缺点:主备有短暂消息延迟,毫秒级,目前不支持自动切换,需要脚本或者其他程序进行检测然后进行停止broker,
重启让从节点成为主节点

  1. 双主(2m-noslave)

指两个或两个以上个Master节点
优点:配置简单,单个Master 宕机或重启维护对应用无影响, 可以靠配置RAID磁盘阵列保证消息可靠,异步刷盘丢失少量消息
缺点: master机器宕机期间,未被消费的消息在机器恢复之前不可消费,实时性会受到影响

  1. 双主双从,多主多从模式(2m-2s-async,异步复制)

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:即使磁盘损坏,消息丢失的非常少,消息实时性不会受影响,Master 宕机后,消费者仍然可以从Slave消费
缺点:主从有短暂消息延迟,毫秒级,如果Master宕机,磁盘损坏情况,会丢失少量消息

  1. 双主双从,多主多从模式(2m-2s-sync,同步双写)

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功。
优点:同步双写方式,主备都写成功,向应用才返回成功,服务可用性与数据可用性都非常高
缺点:性能比异步复制模式略低,主宕机后,备机不能自动切换为主机

  1. DLedger模式(基于raft协议的 commitlog 存储库)

RocketMQ 4.5.0 版本开始,引入 DLedger 模式来解决 Broker 组内自动故障转移(自动选主)的问题,而在 4.8.0 版本中社区也对 RocketMQ DLedger 模式进行了全面升级。
阿里巴巴官方介绍:https://blog.csdn.net/alisystemsoftware/article/details/112308224

二、选择DLedger模式

应用场景
RocketMQ集群部署可以分为两种方式master-slave和dledger,虽然master-slave方式提供了一定的高可用性,但是如果集群中的master节点挂了,这时需要运维人员手动进行重启或者切换操作,即不能自动在集群的剩余节点中选出一个master,dledger解决了这个问题。
另一方面 DLedger 又是一个轻量级的 java library。它对外提供的 API 非常简单,append 和 get。Append 向 DLedger 添加数据,并且添加的数据会对应一个递增的索引,而 get 可以根据索引去获得相应的数据。因此 DLedger 是一个 append only 的日志系统。
DLedger 还可以构建高可用的嵌入式 KV 存储。我们把对一些数据的操作记录到 DLedger 中,然后根据数据量或者实际需求,恢复到hashmap 或者 rocksdb 中,从而构建一致的、高可用的 KV 存储系统,应用到元信息管理等场景。

三、DLedger集群搭建

部署自动容灾切换的 RocketMQ-on-DLedger Group。至少需要 3 个节点,通过 Raft 自动选举出一个 Leader,其余节点 作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用;能自动容灾切换,并保证数据一致;可以水平扩展的,也即可以部署任意多个 RocketMQ-on-DLedger Group 同时对外提供服务。
有两种部署方式:新集群部署、旧集群升级。我们选择新集群部署。
7. 准备环境
三台机器:106、107、108,搭建一主两从
8. 配置参数(/rocketmq-4.9.3/conf/dledger目录下)
2.1 106服务器上:
创建106-broker-n0.conf、107-broker-n1.conf,内容分别为:

#106-broker-n0.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode00
#brokerip
brokerIP1=10.60.32.106
#监听端口
listenPort=10911
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node00
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlog
#broker检测队列中的消息等待时间(默认是200毫秒,自行配置)
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode00
#dLeger集群下的节点配置
dLegerPeers=n0-10.60.32.106:20911;n1-10.60.32.107:20911;n2-10.60.32.108:20911
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n0
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
#107-broker-n1.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode01
#brokerip
brokerIP1=10.60.32.106
#监听端口
listenPort=10921
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node01
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node01/commitlog
#broker检测队列中的消息等待时间(默认是200毫秒,自行配置)
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode01
#dLeger集群下的节点配置
dLegerPeers=n3-10.60.32.107:20921;n4-10.60.32.106:20921;n5-10.60.32.108:20921
##must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n4
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4

2.2 107服务器上:
创建107-broker-n0.conf、106-broker-n1.conf,内容分别为:

##107-broker-n0.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode01
#brokerip
brokerIP1=10.60.32.107
#监听端口
listenPort=10921
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node01
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node01/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode01
#dLeger集群下的节点配置
dLegerPeers=n3-10.60.32.107:20921;n4-10.60.32.106:20921;n5-10.60.32.108:20921
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n3
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
##106-broker-n1.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode00
#brokerip
brokerIP1=10.60.32.107
#监听端口
listenPort=10911
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node00
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode00
#dLeger集群下的节点配置
dLegerPeers=n0-10.60.32.106:20911;n1-10.60.32.107:20911;n2-10.60.32.108:20911
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n1
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
2.3 108服务器上:

创建106-broker-n2.conf、107-broker-n2.conf,内容分别为:

##106-broker-n2.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode00
#brokerip
brokerIP1=10.60.32.108
#监听端口
listenPort=10911
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node00
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode00
#dLeger集群下的节点配置
dLegerPeers=n0-10.60.32.106:20911;n1-10.60.32.107:20911;n2-10.60.32.108:20911
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n2
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
##107-broker-n2.conf
#集群名称
brokerClusterName = RaftCluster
#broker集群名称
brokerName=RaftNode01
#brokerip
brokerIP1=10.60.32.108
#监听端口
listenPort=10921
#namesrv地址列表
namesrvAddr=10.60.32.106:9876;10.60.32.107:9876
#数据存储根路径
storePathRootDir=/usr/local/rocketmq/rmqstore/node01
#commitlog数据存储根路径
storePathCommitLog=/usr/local/rocketmq/rmqstore/node01/commitlog
#检测等待时间
#waitTimeMillsInSendQueue=200
#是否启用DLeger集群模式
enableDLegerCommitLog=true
#与brokerName保持一致就好
dLegerGroup=RaftNode01
#dLeger集群下的节点配置
dLegerPeers=n3-10.60.32.107:20921;n4-10.60.32.106:20921;n5-10.60.32.108:20921
## must be unique
#当前节点在dLeger集群下的标识
dLegerSelfId=n5
#服务端处理消息发送线程池数量
sendMessageThreadPoolNums=4
  1. 启动
    3.1 启动namesrv,分别在106、107两台服务器上
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqnamesrv > /usr/local/rocketmq/logs/mqnamesrv.log 2>&1 &

3.2 启动broker,分别在106、107、108三台服务器上
106服务器

nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/106-broker-n0.conf > /usr/local/rocketmq/logs/106-broker-n0.log 2>&1 &
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/107-broker-n1.conf > /usr/local/rocketmq/logs/107-broker-n1.log 2>&1 &

107服务器

nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/106-broker-n1.conf > /usr/local/rocketmq/logs/106-broker-n1.log 2>&1 &
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/107-broker-n0.conf > /usr/local/rocketmq/logs/107-broker-n0.log 2>&1 &

108服务器

nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/106-broker-n2.conf > /usr/local/rocketmq/logs/106-broker-n2.log 2>&1 &
nohup sh /usr/local/rocketmq/rocketmq-4.9.3/bin/mqbroker -c /usr/local/rocketmq/rocketmq-4.9.3/conf/dledger/107-broker-n2.conf > /usr/local/rocketmq/logs/107-broker-n2.log 2>&1 &

四、安装console

五、遇到问题

  1. 106服务器启动broker时,报端口被占用。 – 监听端口和节点端口不能为同一端口 异常
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要搭建RocketMQ集群,可以使用Docker容器化技术来实现。以下是搭建RocketMQ集群的步骤: 1. 安装Docker和Docker Compose 2. 创建一个Docker Compose文件,定义RocketMQ集群的配置和服务 3. 在Docker Compose文件中定义三个服务:NameServer、Broker和Console 4. 配置NameServer服务,指定NameServer的端口和集群名称 5. 配置Broker服务,指定Broker的端口、NameServer地址和集群名称 6. 配置Console服务,指定Console的端口和NameServer地址 7. 启动Docker Compose,创建RocketMQ集群 8. 使用RocketMQ Console管理和监控集群 以上是搭建RocketMQ集群的基本步骤,具体的实现细节可以参考RocketMQ官方文档和Docker官方文档。 ### 回答2: RocketMQ是一个 Apache 开源的分布式消息传递系统,在分布式应用中广泛应用。它具有高可用性、高并发性、高性能、可扩展性等优点。Docker 是一种容器化技术,它可以将应用程序及其依赖项打包成一个 Docker 容器,从而使应用程序在运行时具有一致的环境。这就为 RocketMQ 集群搭建提供了很大的便利。这里我们就以 Docker 为基础,来讲解如何搭建 RocketMQ 集群。 第一步,创建 Dockerfile 我们首先需要创建 Dockerfile,该文件用于指导 Docker 构建 RocketMQ 集群。以下是 Dockerfile 内容: FROM java:8-jre ENV ROCKETMQ_VERSION=4.3.2 ENV ROCKETMQ_HOME=/opt/rocketmq-${ROCKETMQ_VERSION} ADD rocketmq-all-${ROCKETMQ_VERSION}-bin-release.tar.gz /opt RUN ln -s ${ROCKETMQ_HOME}/bin/mqnamesrv /usr/local/bin && ln -s ${ROCKETMQ_HOME}/bin/mqbroker /usr/local/bin CMD cd ${ROCKETMQ_HOME}/bin && nohup sh mqnamesrv & CMD cd ${ROCKETMQ_HOME}/bin && sleep 5 && sh mqbroker -n namesrv:9876 autoCreateTopicEnable=true 第二步,构建 Docker image 我们使用以下命令构建 Docker image: $ docker build -t rocketmq:4.3.2 . 第三步,运行容器 接下来在一台机器上启动该镜像的多个容器,每个容器都要有一个不同的名字和 IP 地址,这样它们之间才能通信。RocketMQ 集群需要两个组件:NameServer 和 Broker。 启动 NameServer 容器: $ docker run --name rmqnamesrv -p 9876:9876 -d rocketmq:4.3.2 sh mqnamesrv 启动 Broker 容器: $ docker run --name rmqbroker -p 10911:10911 -p 10909:10909 \ -e "NAMESRV_ADDR=192.168.1.100:9876;192.168.1.101:9876" \ -e "JAVA_OPTS=-Duser.home=/opt" \ --link rmqnamesrv:namesrv \ -d rocketmq:4.3.2 -e "NAMESRV_ADDR" 用于指定 NameServer 的地址,并以分号分隔;-e "JAVA_OPTS" 用于指定 JAVA_HOME 路径。 第四步,测试 RocketMQ 集群 我们可以使用以下命令测试该 RocketMQ 集群是否正常: $ docker exec -it rmqbroker sh mqadmin clusterList -n namesrv:9876 输出如下: Cluster Name: DefaultCluster Cluster Status: OK 至此,我们成功搭建RocketMQ 集群RocketMQ 集群搭建十分简单,只需按照上述步骤操作即可。对于生产环境,需要更加细致地考虑配置和优化。 ### 回答3: RocketMQ是一款开源的分布式消息中间件,它使用广泛且可靠,尤其是应用在高并发场景下。而Docker则是现在非常火热的容器化技术,它可以轻松的实现RocketMQ集群部署。下面,我们将介绍如何使用Docker搭建RocketMQ集群。 首先要做的是创建一个Docker容器并安装RocketMQ,容器可以复制多个并形成集群。在这个过程中,我们可以使用开源的RocketMQ容器来作为我们的基础镜像。我们可以使用docker pull指令从docker hub拉取RocketMQ官方镜像,然后运行docker run命令将容器启动起来。启动容器时,需要指定一些参数以方便配置RocketMQ。例如: docker run -d --name rmqnamesrv --restart=always -p 9876:9876 -v /mnt/docker/namesrv/logs:/root/logs -e "MAX_POSSIBLE_HEAP=100000000" -e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m" rocketmqinc/rocketmq:4.3.2 sh mqnamesrv 该命令意味着我们正在创建一个名为rmqnamesrv的容器,并将容器的5672端口映射到宿主机的5672端口,还为容器设置了一个存储卷用于存储RocketMQ的日志,以及设置了Java运行参数等。 类似于namesrv容器,我们还可以使用该命令创建broker容器,以实现RocketMQ集群,我们可以在同一台主机上启动多个容器,也可以在多台主机上启动多个容器,并连接它们的端口,从而实现分布式部署模式。 接下来,我们需要进行配置操作,通过修改配置文件来允许程序在集群环境中工作。例如修改broker的配置文件broker.conf,配置完后需要将该文件映射到相关容器中,以使配置生效。 最后,我们需要将Docker配置成依据我们指定的规则,在多个容器之间启动和停止,从而使整个集群能够随时运行和维护。这意味着我们需要创建脚本和服务来管理容器的启动和停止,并处理容器之间的通信,以此表现Docker的自动化管理。这可以通过Docker Compose来实现,该工具使我们能够启动和停止多个容器,并将它们组织成服务。 总之,通过使用Docker来搭建RocketMQ集群,使得我们不必关心繁琐的安装和配置过程,它简化了部署,增强了系统的可维护性和可扩展性。当然,要加强对Docker和RocketMQ的学习,熟悉更多命令和配置以适应不同场景下的构建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yawpei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值