RocketMQ 裸机部署 Docker部署

RocketMQ

官方文档:https://rocketmq.apache.org/docs/%E4%BB%8B%E7%BB%8D/02quickstart

裸机部署-单机

机器规划

1台机器:

机器A:192.168.200.137

环境

RocketMQ运行环境需要:

JDK 1.8+

Maven 3.2.x(当下载的源码包时需要执行mvn构建使用,如果下载的二进制包则不需要)

安装jdk

tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/

# 配置环境变量
cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/local/jdk1.8.0_341
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

# 生效
source /etc/profile

# 查看版本
[root@localhost ~]# java -version
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)

安装rocketmq

# 安装基础工具
yum install -y vim wget unzip

# 下载
wget https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip --no-check-certificate
unzip rocketmq-all-4.9.4-bin-release.zip
cd rocketmq-all-4.9.4-bin-release/

# 启动 Name Server:启动后监听9876端口
> nohup sh bin/mqnamesrv &
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

# 启动 Broker
# 注意修改JVM参数,默认配置为8g较高,机器内存低于8g可能报错。
# 启动后监听 10909、10911、10912端口
> nohup sh bin/mqbroker -n localhost:9876 &
> tail -f ~/logs/rocketmqlogs/broker.log 
The broker[localhost.localdomain, 192.168.200.137:10911] boot success...

Start Broker 错误:

# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
解决:
vim bin/runbroker.sh
将JVM参数   JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
改为        JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g"
# Send & Receive Messages
> export NAMESRV_ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...

> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
# 停止 broker
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK

# 停止 Nameserver
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK

安装rocketmq-console

官方文档:https://rocketmq.apache.org/docs/%E9%83%A8%E7%BD%B2%E4%B8%8E%E8%BF%90%E7%BB%B4/17Dashboard

需要依赖docker运行,请先安装docker环境。

# 拉取镜像
docker pull apacherocketmq/rocketmq-dashboard:latest

# 启动容器
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

# 访问地址
http://192.168.200.137:8080/

裸机部署-集群

官方文档:https://github.com/apache/rocketmq/blob/master/docs/cn/operation.md

这里主要介绍3种集群部署方式:

  • 多Master无Slave模式
  • 多Master多slave模式-异步复制
  • 多Master多slave模式-同步双写

多Master无Slave模式

一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:

  • 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
  • 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。

机器规划

NameServer需要先于Broker启动,在生产环境中,为了保证高可用,建议一般规模的集群启动3个NameServer

3台机器:

机器A:192.168.200.137 (Nameserver, mqbroker-a, console)

机器B:192.168.200.138 (Nameserver, mqbroker-b)

机器C:192.168.200.139 (Nameserver)

安装基础环境

3台机器都按照基础工具、jdk、docker。

# 安装基础工具
yum install -y vim wget unzip

# 关闭firewalld
systemctl disable firewalld --now
# 安装jdk
tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/

# 配置环境变量
cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/local/jdk1.8.0_341
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

# 生效
source /etc/profile
# 安装docker
sh auto_install_docker.sh

下载rocketmq

# 下载rocketmq
wget https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip --no-check-certificate
unzip rocketmq-all-4.9.4-bin-release.zip
cd rocketmq-all-4.9.4-bin-release/

启动Nameserver

# 3台机器分别启动nameserver
cd rocketmq-all-4.9.4-bin-release/bin/
nohup ./mqnamesrv &

# 验证Name Server 是否启动成功
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

# 此时3台Nameserver的地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

启动Broker集群

注意:

  • 请关闭防火墙或开放9876端口;

  • 本地小内存环境请先修改 runbroker.sh 里的JVM参数将内存改小点。

# 在机器A、机器B设置ROCKETMQ_HOME环境变量
echo 'export ROCKETMQ_HOME=/root/rocketmq-all-4.9.4-bin-release' >> /etc/profile
source /etc/profile

### 在机器A,启动第一个Master
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup ./mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties &

### 在机器B,启动第二个Master
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup ./mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties &

多个NameServer的集群,Broker启动命令中-n后面的地址列表用分号隔开即可,例如:

-n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876"

安装console

# 在机器A上安装rocketmq-console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

机器规划

NameServer需要先于Broker启动,在生产环境中,为了保证高可用,建议一般规模的集群启动3个NameServer

4台机器:

机器A:192.168.200.137 (Nameserver, mqbroker-a, console)

机器B:192.168.200.138 (Nameserver, mqbroker-b)

机器C:192.168.200.139 (Nameserver, broker-a-s)

机器D:192.168.200.140 (broker-b-s)

安装基础环境

4台机器都按照基础工具、jdk、docker。

# 安装基础工具
yum install -y vim wget unzip

# 关闭firewalld
systemctl disable firewalld --now
# 安装jdk
tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/

# 配置环境变量
cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/local/jdk1.8.0_341
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

# 生效
source /etc/profile
# 安装docker
sh auto_install_docker.sh

下载rocketmq

# 下载rocketmq
wget https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip --no-check-certificate
unzip rocketmq-all-4.9.4-bin-release.zip
cd rocketmq-all-4.9.4-bin-release/

启动Nameserver

# 3台机器分别启动nameserver
cd rocketmq-all-4.9.4-bin-release/bin/
nohup ./mqnamesrv &

# 验证Name Server 是否启动成功
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

# 此时3台Nameserver的地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

启动Broker集群

# 在机器A,B,C,D上设置ROCKETMQ_HOME环境变量
echo 'export ROCKETMQ_HOME=/root/rocketmq-all-4.9.4-bin-release' >> /etc/profile
source /etc/profile

### 在机器A,启动第一个Master
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &

### 在机器B,启动第二个Master
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &

### 在机器C,启动第一个Slave
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &

### 在机器D,启动第二个Slave
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &

安装console

# 在机器A上安装rocketmq-console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

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

机器规划

NameServer需要先于Broker启动,在生产环境中,为了保证高可用,建议一般规模的集群启动3个NameServer

4台机器:

机器A:192.168.200.137 (Nameserver, mqbroker-a, console)

机器B:192.168.200.138 (Nameserver, mqbroker-b)

机器C:192.168.200.139 (Nameserver, broker-a-s)

机器D:192.168.200.140 (broker-b-s)

安装基础环境

4台机器都按照基础工具、jdk、docker。

# 安装基础工具
yum install -y vim wget unzip

# 关闭firewalld
systemctl disable firewalld --now
# 安装jdk
tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/

# 配置环境变量
cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/local/jdk1.8.0_341
export PATH=\$PATH:\$JAVA_HOME/bin
EOF

# 生效
source /etc/profile
# 安装docker
sh auto_install_docker.sh

下载rocketmq

# 下载rocketmq
wget https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip --no-check-certificate
unzip rocketmq-all-4.9.4-bin-release.zip
cd rocketmq-all-4.9.4-bin-release/

启动Nameserver

# 3台机器分别启动nameserver
cd rocketmq-all-4.9.4-bin-release/bin/
nohup ./mqnamesrv &

# 验证Name Server 是否启动成功
tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

# 此时3台Nameserver的地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

启动Broker集群

# 在机器A,B,C,D上设置ROCKETMQ_HOME环境变量
echo 'export ROCKETMQ_HOME=/root/rocketmq-all-4.9.4-bin-release' >> /etc/profile
source /etc/profile

### 在机器A,启动第一个Master
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &

### 在机器B,启动第二个Master
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &

### 在机器C,启动第一个Slave
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &

### 在机器D,启动第二个Slave
cd /root/rocketmq-all-4.9.4-bin-release/bin/
nohup sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &

以上Broker与Slave配对是通过指定相同的BrokerName参数来配对,Master的BrokerId必须是0,Slave的BrokerId必须是大于0的数。另外一个Master下面可以挂载多个Slave,同一Master下的多个Slave通过指定不同的BrokerId来区分。$ROCKETMQ_HOME指的RocketMQ安装目录,需要用户自己设置此环境变量。

安装console

# 在机器A上安装rocketmq-console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

Docker版本单机部署

RocketMQ并没有提供Docker版本的部署方式,如果需要部署到Dockers,需要自己做镜像。

制作镜像

Dockerfile

FROM ubuntu:20.04

ADD jdk-8u341-linux-x64.tar.gz /usr/local
ADD rocketmq-all-4.9.4-bin-release.zip /

RUN apt-get update && apt-get install unzip
RUN cd / && unzip rocketmq-all-4.9.4-bin-release.zip && rm -f rocketmq-all-4.9.4-bin-release.zip

ENV JAVA_HOME=/usr/local/jdk1.8.0_341
ENV ROCKETMQ_HOME=/rocketmq-all-4.9.4-bin-release
ENV PATH=$PATH:$JAVA_HOME/bin:$ROCKETMQ_HOME

WORKDIR /rocketmq-all-4.9.4-bin-release/bin
[root@localhost ~]# cd rocketmq
[root@localhost rocketmq]# ll
total 176892
-rw-r--r--. 1 root root       419 Sep  7 01:34 Dockerfile
-rw-r--r--. 1 root root 148162542 Sep  6 23:32 jdk-8u341-linux-x64.tar.gz
-rw-r--r--. 1 root root  32967749 Jun 24 16:29 rocketmq-all-4.9.4-bin-release.zip

# 构建镜像:
docker build -t alexchenxie/rocketmq:4.9.4 .

# 登录
docker login

# 推送
docker push alexchenxie/rocketmq:4.9.4

单机

# mqnamesrv
docker run -d --name mqnamesrv -p 9876:9876 alexchenxie/rocketmq:4.9.4 sh mqnamesrv

# mqbroker
docker run -d --name mqbroker \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n 192.168.200.137:9876

# console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

多Master无Slave模式

3台机器:

机器A:192.168.200.137 (Nameserver, mqbroker-a, console)

机器B:192.168.200.138 (Nameserver, mqbroker-b )

机器C:192.168.200.139 (Nameserver)

# 分别在机器A、B、C上启动Nameserver(不可通过-p 9877:9876的方式在同一台主机上运行,有坑)
docker run -d --name mqnamesrv -p 9876:9876 alexchenxie/rocketmq:4.9.4 sh mqnamesrv
# 得到此时的3台Nameserver地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

# 机器A启动console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

# 机器A启动mqbroker-a
docker run -d --name mqbroker-a \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-noslave/broker-a.properties

# 机器B启动mqbroker-b
docker run -d --name mqbroker-b \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-noslave/broker-b.properties

多Master多Slave模式-异步复制

4台机器:

机器A:192.168.200.137 (Nameserver, mqbroker-a, console)

机器B:192.168.200.138 (Nameserver, mqbroker-b)

机器C:192.168.200.139 (Nameserver, mqbroker-a-s)

机器D:192.168.200.140 (mqbroker-b-s)

############# 以下忽略 #############
# 准备配置文件(忽略)
# 在每个配置文件后面添加一条 brokerIP1=192.168.200.137 (IP为服务所在的服务器IP)
# Tips: broker-a, broker-b 务必保持2台独立的机器运行
#       broker-a-s, broker-b-s 也最好2台独立机器运行,也可以放到通过一台机器,但需要修改所监听的端口
# tree /data/alex-mq-conf/
/data/alex-mq-conf/
├── 2m-2s-async
│   ├── broker-a.properties
│   ├── broker-a-s.properties
│   ├── broker-b.properties
│   └── broker-b-s.properties
############# 以上忽略 #############

# 分别在机器A、B、C上启动Nameserver(不可通过-p 9877:9876的方式在同一台主机上运行,有坑)
docker run -d --name mqnamesrv -p 9876:9876 alexchenxie/rocketmq:4.9.4 sh mqnamesrv
# 得到此时的3台Nameserver地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

# 机器A启动 console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

# 机器A启动 mqbroker-a
docker run -d --name mqbroker-a \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-async/broker-a.properties

# 机器B启动 mqbroker-b
docker run -d --name mqbroker-b \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-async/broker-b.properties

# 机器C启动 mqbroker-a-s
docker run -d --name mqbroker-a-s \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-async/broker-a-s.properties

# 机器D启动 mqbroker-b-s
docker run -d --name mqbroker-b-s \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-async/broker-b-s.properties

多Master多Slave模式-同步双写

4台机器:

机器A:192.168.200.137 (Nameserver, mqbroker-a, console)

机器B:192.168.200.138 (Nameserver, mqbroker-b)

机器C:192.168.200.139 (Nameserver, mqbroker-a-s)

机器D:192.168.200.140 (mqbroker-b-s)

# 分别在机器A、B、C上启动Nameserver(不可通过-p 9877:9876的方式在同一台主机上运行,有坑)
docker run -d --name mqnamesrv -p 9876:9876 alexchenxie/rocketmq:4.9.4 sh mqnamesrv
# 得到此时的3台Nameserver地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

# 机器A启动 console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

# 机器A启动 mqbroker-a
docker run -d --name mqbroker-a \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-sync/broker-a.properties

# 机器B启动 mqbroker-b
docker run -d --name mqbroker-b \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-sync/broker-b.properties

# 机器C启动 mqbroker-a-s
docker run -d --name mqbroker-a-s \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-sync/broker-a-s.properties

# 机器D启动 mqbroker-b-s
docker run -d --name mqbroker-b-s \
--net host \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c ../conf/2m-2s-sync/broker-b-s.properties

Dledger集群

前言

该文档主要介绍如何部署自动容灾切换的 RocketMQ-on-DLedger Group。

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

准备配置文件

每个 RocketMQ-on-DLedger Group 至少准备三台机器(本文假设为 3)。
编写 3 个配置文件,建议参考 conf/dledger 目录下的配置文件样例。
关键配置介绍:

name 含义 举例
enableDLegerCommitLog 是否启动 DLedger true
dLegerGroup DLedger Raft Group的名字,建议和 brokerName 保持一致 RaftNode00
dLegerPeers DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致 n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
dLegerSelfId 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一 n0
sendMessageThreadPoolNums 发送线程个数,建议配置成 Cpu 核数 16

这里贴出 conf/dledger/broker-n0.conf 的配置举例。

brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=127.0.0.1:9876
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16

1.2 启动 Broker

准备配置文件:

默认在dledger目录下有3个配置文件 broker-n0.conf, broker-n1.conf, broker-n2.conf ,需要将里面的namesrvAddr改为当前正确的地址。

如我这里的Nameserver地址改为:

namesrvAddr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

另外还有 dLegerPeers ,默认是 dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913,如果在同一台机器上同时运行n0, n1, n2 则不用改,也是可以运行的,因为三个文件监听的端口不一样,但这样的高可用无意义;

如果是分别在3台机器上各自运行则需要改为对应机器的IP ,如下:

dLegerPeers=n0-192.168.200.137:40911;n1-192.168.200.138:40912;n2-192.168.200.139:40913

/data/alex-mq-conf/dledger/
├── broker-n0.conf
├── broker-n1.conf
└── broker-n2.conf

如下为 broker-n0.conf ,3个文件都要改。

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

brokerClusterName = RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-192.168.200.137:40911;n1-192.168.200.138:40912;n2-192.168.200.139:40913
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16
# 分别在机器A、B、C上启动Nameserver(不可通过-p 9877:9876的方式在同一台主机上运行,有坑)
docker run -d --name mqnamesrv -p 9876:9876 alexchenxie/rocketmq:4.9.4 sh mqnamesrv
# 得到此时的3台Nameserver地址为:192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876

# 机器A启动 console
docker run -d --name rocketmq-dashboard \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" \
-p 8080:8080 \
-t apacherocketmq/rocketmq-dashboard:latest

##### 在机器A,B,C上分别启动broker-n0,broker-n1,broker-n2组成一组 DLedger Group
# 机器A上启动 broker-n0
docker run -d --name mqbroker-n0 \
--net host \
-v /data/alex-mq-conf:/data/conf \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c /data/conf/dledger/broker-n0.conf

# 机器B上启动 broker-n1
docker run -d --name mqbroker-n1 \
--net host \
-v /data/alex-mq-conf:/data/conf \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c /data/conf/dledger/broker-n1.conf

# 机器C上启动 broker-n2
docker run -d --name mqbroker-n2 \
--net host \
-v /data/alex-mq-conf:/data/conf \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c /data/conf/dledger/broker-n2.conf

##### 照例在机器D, E, F上分别启动broker-n0,broker-n1,broker-n2组成一组 DLedger Group
# 注意:需要修改配置文件中 brokerName和dLegerGroup 为 RaftNode01
# 机器D上启动 broker-n0
docker run -d --name mqbroker-n0 \
--net host \
-v /data/alex-mq-conf:/data/conf \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c /data/conf/dledger/broker-n0.conf

# 机器E上启动 broker-n1
docker run -d --name mqbroker-n1 \
--net host \
-v /data/alex-mq-conf:/data/conf \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c /data/conf/dledger/broker-n1.conf

# 机器F上启动 broker-n2
docker run -d --name mqbroker-n2 \
--net host \
-v /data/alex-mq-conf:/data/conf \
-e JAVA_OPT_EXT="-server -Xms256m -Xmx256m" \
alexchenxie/rocketmq:4.9.4 \
sh mqbroker -n "192.168.200.137:9876;192.168.200.138:9876;192.168.200.139:9876" -c /data/conf/dledger/broker-n2.conf

版权声明:
作者:admin
链接:https://www.chenxie.net/archives/2698.html
来源:蜀小陈
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录