其他分享
首页 > 其他分享> > Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)

Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)

作者:互联网

文章转载自:http://www.mydlq.club/article/96/

系统环境:

一、RocketMQ 简介

RocketMQ是一个纯 Java、分布式、队列模型的开源消息中间件,前身是 MetaQ,是阿里参考 Kafka 特点研发的一个队列模型的消息中间件,后开源给 Apache 基金会成为了 Apache 的顶级开源项目,具有高性能、高可靠、高实时、分布式特点。

二、RocketMQ 需部署的组件

这里介绍下 RocketMQ 相关的组件:

三、RocketMQ 常用部署模式

RocketMQ 常用部署方案有以下几种:

(1)、单机模式

这种模式就如该名单机模式一样,就是部署单个 RocketMQ Broker 来使用,一般使用这种方式在生产中风险较大,一旦 Broker 重启或者宕机时,会导致整个服务不可用,所以常常在学习、开发过程中才会使用这种模式。

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

(2)、多主模式

全部由 Broker Master 节点组成(即可能部署两个或者更多 Broker),生产者发送的数据会分别存入不同的 Broker 中,这样能够避免某个 Broker 一直接收处理数据从而负载过高。

优缺点分析:
优点: 性能高,配置简单,单个 Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10 时,即使机器宕机不可恢复,由于 RAID10 磁盘非常可靠,消息也不会丢(异步刷盘可能会丢失少量消息,同步刷盘能保证消息不丢)。
缺点: 单台服务器宕机期间,不可订阅该服务器上未被消费者消费的消息,只有机器恢复后才可恢复订阅,所以可能会影响消息的实时性。

(3)、双主双从/多主多从模式(异步复制)

一般会部署多个 Broker Master,同时也会为各个 Broker Master 部署一个或者多个 Broker Slave,且 Master 和 Slave 之间采用"异步复制数据"方式进行数据同步(主从同步消息会有延迟,毫秒级),这样在生产者将消息发送到 Broker Master 后不必等待数据同步到 Slave 节点,就返回成功。

优缺点分析:
优点: 性能高,且磁盘损坏也不会丢失大量消息,消息实时性不会受影响,Master 宕机后,消费者仍然可以从 Slave 消费。
缺点: 主备有短暂消息延迟,毫秒级,如果Master宕机,磁盘损坏情况,会丢失少量消息。

(4)、双主双从/多主多从模式(同步双写)

一般会部署多个 Broker Master,同时也会为各个 Broker Master 部署一个或者多个 Broker Slave,且 Master 和 Slave 之间采用"同步复制数据"方式进行数据同步,这样在生产者将消息发送到 Broker Master 后需要等待数据同步到 Slave 节点成功后,才返回成功。

优缺点分析:

优点: 数据与服务都无单点故障,Master 宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
缺点: 性能比异步复制模式略低(大约低10%左右),发送单个消息的 RT 会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

(5)、Dledger 集群模式

RocketMQ-on-DLedger Group 是指一组相同名称的 Broker,至少需要 3 个节点,通过 Raft 自动选举出一个 Leader,其余节点 作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用。当 Master 节点出现问题宕机后也能自动容灾切换,并保证数据一致性。该模式也支持 Broker 水平扩展,即可以部署任意多个 RocketMQ-on-DLedger Group 同时对外提供服务。

优缺点分析:
优点: 多节点(至少三个)组成集群,其中一个为 Leader 节点,其余为 Follower 节点组成高可用,能够自动容灾切换。
缺点: 需要 RocketMQ 4.5 及以后版本才支持。

四、RocketMQ 常见概念介绍

1、异步复制与同步复制
在使用 RocketMQ 中,生产者集群将数据传入到 Broker Master 节点后,Master 节点会将数据同步到 Slave 节点,其有两种同步方式:

2、同步刷盘与异步刷盘
在使用 RocketMQ 中,生产者集群将数据传入到 Broker 后,Broker 会将数据进行持久化操作,其因性能与数据安全性等原因,所以提供两种方式将数据持久化到硬盘,两种刷盘方式分别是:

3、双主双从/多主多从模式

一般会部署多个 Broker Master,同时也会为各个 Broker Master 部署一个或者多个 Broker Slave,不过需要注意的是,当 Broker Master 宕机后,Broker Slave 并不能转换为 Master 节点,这里的 Slave 只会起到数据备份以及 Broker Master 宕机时间内消费者能够继续消费宕机前生产者发送到 Broker Master 的数据。

多主多从模式下的 Broker 之间会进行数据同步,其中同步方式可以是"异步复制",也可以是"同步复制"。这其中也会涉及数据持久化刷盘方式,刷盘方式也是分为"同步刷盘"与"异步刷盘"两种,数据复制与刷盘方式上面都有介绍,这里就不再陈述。这里主要要说的是其不同的"数据复制"与"刷盘方式"对性能的影响。例如,生产者将数据发送到 Broker 后,如果为"同步刷盘"那么只有将数据写入磁盘成功后才能响应成功。如果为"异步刷盘"那么将数据写入内存中即可返回成功。其中"同步刷盘"对性能影响较大。

使用多主多从模式部署 RocketMQ 的 Broker,一般我们大部分都会选择"同步复制","异步刷盘"方式的组合进行部署,当然,如果对数据安全性要求不是很高,可以选择"异步复制"与"异步刷盘"方式来部署 Broker。

4、Broker 常用配置参数简介

参数名 默认值 描述
listenPort 10911 监听端口
namesrvAddr Namesrv 地址
brokerIP1 用于网络接口的 InetAddress 指定 Broker 的 IP 地址,向 Namesrv 注册时候会注册此地址
brokerName Broker 名称
brokerClusterName 指定 Broker 归属的集群的名称
brokerId 0 Broker ID, 0 表示 Master,大于 0 表示 Slave
storePathCommitLog $HOME/store/commitlog/ commitlog 的文件存储路径
storePathConsumerQueue $HOME/store/consumequeue/ comsumer queue 的文件存储路径
mapedFileSizeCommitLog 1024 * 1024 * 1024(1G) commitlog 映射文件大小
deleteWhen 04 磁盘文件空间充足情况下,默认每天什么时候执行删除过期文件,默认 04 表示凌晨 4 点
fileReserverdTime 72 设置 commitlog 日志保留时间
brokerRole ASYNC_MASTER broker角色,分为 ASYNC_MASTER SYNC_MASTER, SLAVE
flushDiskType ASYNC_FLUSH 刷盘方式,默认为 ASYNC_FLUSH(异步刷盘),可选值SYNC_FLUSH(同步刷盘)

五、部署 RcoketMQ 双主双从模式(同步双写)

部署服务器安排

服务器 部署的应用 物理资源 存储目录
192.168.2.21 Namesrv Server、Broker、Console 4C && 8G /usr/local/rocketmq
192.168.2.22 Namesrv Server、Broker 4C && 8G /usr/local/rocketmq
192.168.2.23 Namesrv Server、Broker 4C && 8G /usr/local/rocketmq

部署的内容如下图所示:

1、创建存储数据的目录
分别在 192.168.2.21、192.168.2.22 服务器上执行下面命令创建目录:

## 创建 Broker-Master 持久化目录
$ mkdir -p /usr/local/rocketmq/broker-master/conf && \
  mkdir -p /usr/local/rocketmq/broker-master/logs && \
  mkdir -p /usr/local/rocketmq/broker-master/store 

## 创建 Broker-Slave 持久化目录
$ mkdir -p /usr/local/rocketmq/broker-slave/conf && \
  mkdir -p /usr/local/rocketmq/broker-slave/logs && \
  mkdir -p /usr/local/rocketmq/broker-slave/store 

## 创建 NameServer 持久化目录
$ mkdir -p /usr/local/rocketmq/server/logs

2、创建 Broker 配置文件

在各个服务器上分别创建如下文件:

第一台服务器创建 master-a 配置:

$ cat > /usr/local/rocketmq/broker-master/conf/broker.conf << EOF

listenPort=10911
brokerIP1=192.168.2.21
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerRole=SYNC_MASTER
brokerId=0
deleteWhen=04
fileReservedTime=48
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876
EOF

第一台服务器创建 slave-b 配置:

$ cat > /usr/local/rocketmq/broker-slave/conf/broker.conf << EOF

listenPort=11911
brokerIP1=192.168.2.21
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerRole=SLAVE
brokerId=1
deleteWhen=04
fileReservedTime=48
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876
EOF

第二台服务器创建 master-b 配置:

$ cat > /usr/local/rocketmq/broker-master/conf/broker.conf << EOF

listenPort=10911
brokerIP1=192.168.2.22
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerRole=SYNC_MASTER
brokerId=0
deleteWhen=04
fileReservedTime=48
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876
EOF

第二台服务器创建 slave-a 配置:

$ cat > /usr/local/rocketmq/broker-slave/conf/broker.conf << EOF

listenPort=11911
brokerIP1=192.168.2.22
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerRole=SLAVE
brokerId=1
deleteWhen=04
fileReservedTime=48
flushDiskType=ASYNC_FLUSH
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876
EOF

3、下载相关镜像

在两台服务器上,分别创建拉取对应的镜像:

两台服务器分别拉取 RocketMQ 镜像:

## 下载 RocketMQ 镜像
$ docker pull foxiswho/rocketmq:4.7.0

第一台服务器拉取 RocketMQ Console 镜像:

## 下载 RocketMQ 控制台
$ docker pull apacherocketmq/rocketmq-console:2.0.0

4、查看镜像设置的用户与组的配置
任意一台服务器上查看镜像 rocketmq 的组成,分析其中用户与组的信息:

$ docker history foxiswho/rocketmq:4.7.0

IMAGE               CREATED             CREATED BY                                      SIZE 
1cf46e8f03d0        7 months ago        /bin/sh -c #(nop) WORKDIR /home/rocketmq/roc…   0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  USER rocketmq                0B                  
<missing>           7 months ago        |5 gid=3000 group=rocketmq uid=3000 user=roc…   1.92kB              
<missing>           7 months ago        |5 gid=3000 group=rocketmq uid=3000 user=roc…   0B                  
<missing>           7 months ago        |5 gid=3000 group=rocketmq uid=3000 user=roc…   11.3kB              
<missing>           7 months ago        /bin/sh -c #(nop)  EXPOSE 10909 10911 10912     0B                  
<missing>           7 months ago        |5 gid=3000 group=rocketmq uid=3000 user=roc…   10.1kB              
<missing>           7 months ago        /bin/sh -c #(nop)  EXPOSE 9876                  0B                  
<missing>           7 months ago        |5 gid=3000 group=rocketmq uid=3000 user=roc…   15.1MB              
<missing>           7 months ago        /bin/sh -c #(nop) COPY dir:bdc4a8518539da6ce…   11.4kB              
<missing>           7 months ago        |5 gid=3000 group=rocketmq uid=3000 user=roc…   15.1MB              
<missing>           7 months ago        /bin/sh -c #(nop) WORKDIR /home/rocketmq/roc…   0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  ENV ROCKETMQ_HOME=/home/r…   0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  ENV ROCKETMQ_VERSION=4.7.0   0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  ARG version=4.7.0            0B                  
<missing>           7 months ago        |4 gid=3000 group=rocketmq uid=3000 user=roc…   1.07MB              
<missing>           7 months ago        /bin/sh -c #(nop)  ARG gid=3000                 0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  ARG uid=3000                 0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  ARG group=rocketmq           0B                  
<missing>           7 months ago        /bin/sh -c #(nop)  ARG user=rocketmq            0B                  
<missing>           7 months ago        /bin/sh -c yum install -y java-1.8.0-openjdk…   264MB               
<missing>           11 months ago       /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           11 months ago       /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           11 months ago       /bin/sh -c #(nop) ADD file:45a381049c52b5664…   203MB

可以观察到:

5、更改目录归属组与用户与容器的配置一致
两台服务器上分别创建组与用户:

## 创建组
$ groupadd rocketmq

## 增加用户并加入组
$ useradd -g rocketmq rocketmq

## 设置用户密码
$ passwd rocketmq

## 更改组的 gid
$ groupmod -g 3000 rocketmq

## 更改用户的 uid
$ usermod -u 3000 rocketmq

## 查看是否更改成功
$ id rocketmq

两台服务器上分别更改上面创建的目录的权限为上面创建的组与用户:

$ chown -R rocketmq:rocketmq /usr/local/rocketmq

6、安装 RocketMQ NameServer

两台服务器上分别部署 NameServer:

$ docker run -d --name rmqnamesr --net host \
--restart=always \
-v /usr/local/rocketmq/server/logs:/home/rocketmq/logs \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-p 9876:9876 \
foxiswho/rocketmq:4.7.0 \
sh mqnamesrv

7、安装 RocketMQ Broker

分别在两台服务器上执行下面命令,操作 Docker 启动 Broker Master 与 Broker Slave 节点:

slave 的配置已经配置在 RocketMQ 配置文件中

服务器一部署 Broker master-a,服务器二部署 Broker master-b 的 Docker 命令:

$ docker run -d --name rmqbroker-master \
--restart=always \
--net host \
-v /usr/local/rocketmq/broker-master/logs:/home/rocketmq/logs \
-v /usr/local/rocketmq/broker-master/store:/home/rocketmq/store \
-v /usr/local/rocketmq/broker-master/conf:/home/rocketmq/conf \
-p 10909:10909 -p 10911:10911 -p 10912:10912  \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
foxiswho/rocketmq:4.7.0 \
sh mqbroker -c /home/rocketmq/conf/broker.conf

服务器一部署 Broker slave-b,服务器二部署 Broker slave-a 的 Docker 命令:

$ docker run -d --name rmqbroker-slave \
--restart=always \
--net host \
-v /usr/local/rocketmq/broker-slave/logs:/home/rocketmq/logs \
-v /usr/local/rocketmq/broker-slave/store:/home/rocketmq/store \
-v /usr/local/rocketmq/broker-slave/conf:/home/rocketmq/conf \
-p 11909:11909 -p 11911:11911 -p 11912:11912  \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
foxiswho/rocketmq:4.7.0 \
sh mqbroker -c /home/rocketmq/conf/broker.conf

8、部署控制台

服务器一部署 RocketMQ 控制台:

$ docker run -d --name rmqconsole \
--restart=always \
-p 8080:8080 \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.2.21:9876;192.168.2.22:9876 \
-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
apacherocketmq/rocketmq-console:2.0.0

9、访问控制台
输入 http://192.168.2.21:8080 访问在服务器一部署的 RocketMQ 控制台:

然后我们可以通过该控制台进行发送消息来验证 RocketMQ 是否正常,这里就交由大家自行验证了,文档到此结束。

标签:Slave,Broker,双主双,Master,RocketMQ,v4.7,Docker,rocketmq,刷盘
来源: https://www.cnblogs.com/sanduzxcvbnm/p/16112310.html