Docker搭建RocketMQ集群踩坑分享

说明:本文适合有一定RocketMQ基础(知道消费者、生产者、路由注册、路由发现等概念)的小伙伴阅读。文章有点长,中间有部分红字还有点啰嗦,并且为个人经验,请谨慎阅读。文章中如有理解错误或不足之处,还请小伙伴们指出,我们相互学习讨论。

本人踩的坑:

  1. 容器做挂载时,宿主机上要挂载的目录没有授权,导致容器向宿主机写日志、数据等被拒绝
  2. 做remotingServer服务的端口映射时,宿主机的端口和容器的端口不一致。(这个真的困扰了我很久)

下面将搭建一个这样的集群:

  • 一共2台Linux,假设分别为Linux①号,Linux②号
  • 2个nameserver(位于①上)
  • 2对主从broker(第1对主从位于①上,第2对主从位于②上)
  • RocketMQ控制台(位于①上)

其实集群怎么搭不重要(你想把所有东西搭在同一台Linux上都可以),主要是我想介绍我踩的两个坑,给大家分享经验和避雷。

1、搭建集群

1.1、拉取镜像

docker pull apache/rocketmq:5.3.0

1.2、🚀安装两个nameserver

凡是要挂载的目录中,如果有容器向宿主机写数据的情况,都需先创建,然后授权。

  1. 创建nameserver1容器:
mkdir -p /app/rocketmq/nameserver1/logs
chmod 777 -R /app/rocketmq/nameserver1/logs
docker run \
--name nameserver1 \
-p 9876:9876 \
-v /app/rocketmq/nameserver1/logs:/home/rocketmq/logs \
-e "MAX_POSSIBLE_HEAP=100000000" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-d \
apache/rocketmq:5.3.0 \
sh mqnamesrv

AI说nameserver容器内的数据目录是/home/rocketmq/store,但是我进入容器内部并未发现有此目录(即使在broker等都已注册的情况下),所以这里先暂不挂载数据目录。

  1. 创建nameserver2容器:
mkdir -p /app/rocketmq/nameserver2/logs
chmod 777 -R /app/rocketmq/nameserver2/logs
docker run \
--name nameserver2 \
-p 9877:9876 \
-v /app/rocketmq/nameserver2/logs:/home/rocketmq/logs \
-e "MAX_POSSIBLE_HEAP=100000000" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-d \
apache/rocketmq:5.3.0 \
sh mqnamesrv

1.3、🚀安装两对主从broker

1.3.1、🍀安装第1对主从

宿主机上,创建要挂载broker.conf配置文件,内容如下(brokerIP记得改成自己的):

# 集群名称
brokerClusterName = hangzhou1

# 主和从的名称需要保持一致
brokerName = broker-a

# 主从标识,0为主,其他大于0的为从,从只允许读,主可以读写
brokerId = 0

# 未消费的持久化消息清理时间点,默认凌晨4点
deleteWhen = 04

# 持久化消息保存周期(单位:小时)
fileReservedTime = 48

# brocker角色,主
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole = ASYNC_MASTER

# 刷盘方式:异步刷盘
flushDiskType = ASYNC_FLUSH

# broker自己的ip。将来服务注册到nameserver的ip就是这个。由于这里只写了一个ip,所以将来主从同步时,也会用这个ip。
brokerIP1 = 192.168.186.100
# 可以配置多个ip,示例:brokerIP1=xxx brokerIP2=xxx。配置了多个ip时,将来nameserver会自动选择用哪个ip进行与客户端通信,用哪个ip进行主从同步。
# 实际开发中通常配置两个ip,一个公网ip,一个内网ip。
# brokerIP2 = 192.168.186.100

# !!!请仔细阅读下面这2行注释!!!
# listenPort属性用于指定哪个端口作为remotingServer服务(这个服务就是用来连接客户端的)组件使用的端口,并且将来服务注册到nameserver的
# 端口号也是这个。这就意味着,你在创建容器时指定的端口映射中,宿主机必须和容器内部的端口一致。
listenPort = 10911

# nameserver的ip+端口。多个地址用分号隔开
namesrvAddr = 192.168.186.100:9876;192.168.186.100:9877

# 延迟消息等级时间。
# 这个设置也影响全局的消费重试机制的间隔时间,消费重试机制走的就是延迟消息,这里设置后,第一次重试是在是失败的10s后(从第三个开始,
# DefaultMQPushConsumerImpl源码中setDelayTimeLevel(3 + msg.getReconsumeTimes()),舍去了前两个),第二次是上次失败的30s
# 后,因为消费重试次数是16次(DefaultMQPushConsumerImpl源码默认是16次),而我们30s后面没有设置了,他后面的13次都会按30s间隔去重试。
messageDelayLevel = 1s 5s 10s 30s

# 在发送消息时,自动创建服务器不存在的topic时,默认创建的队列数,与Master节点保持一致或根据实际需求调整  
defaultTopicQueueNums=4  
  
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateTopicEnable=true
  
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateSubscriptionGroup=true  
  
# commitLog每个文件的大小默认1G,与Master节点保持一致  
mapedFileSizeCommitLog=1073741824  
  
# ConsumeQueue每个文件默认存30W条,根据业务情况调整,与Master节点保持一致  
mapedFileSizeConsumeQueue=300000

# 设置所在机器磁盘占用超95%才报错
diskMaxUsedSpaceRatio = 95

🔖默认情况下,容器内这3个端口的作用:

10911端口:是remotingServer服务(用于客户端与Broker之间的通信)默认使用的监听端口。可通过broker.conf的listenPort属性进行修改。

10912端口:用于主从数据同步默认使用的端口。默认是10912,可通过broker.conf的haListenPort属性修改。

10909端口:是fastRemotingServer使用的监听端口。当vipChannelEnabled开启时,producer和consumer发送的消息会发送到fastRemotingServer进行快速通信。

🔖注意,下面创建容器时的端口映射很坑:

正常情况在端口映射时,容器某个服务的端口为8080,宿主机端口可以指定为任何可用的端口就可暴露容器中的该服务。

但是在创建RocketMQ的broker容器时,有一个服务比较特殊,那就是remotingServer服务用的端口。上方也介绍了,容器内remotingServer使用的端口是可以在broker.conf中通过listenPort属性指定的。假设你指定的是10911,而listenPort属性指定的端口号,会被直接和ip地址拼接为“ip:10911”,然后路由注册到nameserver,客户端做服务发现后,就会找“ip:10911”连接,这就限制我们在创建容器时,宿主机端口也指定为10911才行,否则客户端连不上。

所以,如果你在broker.conf中指定listenPort = 10911,那么创建容器时,端口映射就应该“-p 10911:10911”;而不能将宿主机端口指定成其它的(如:“-p 10811:10911”是不行的)。


这个我觉得很坑,因为它不允许你在暴露容器内的remotingServer服务时可以自由地指定宿主机端口。

创建主节点容器(记得将nameserver的ip和端口改成自己的):

mkdir -p /app/rocketmq/broker-a-master/data
mkdir -p /app/rocketmq/broker-a-master/logs
chmod 777 -R /app/rocketmq/broker-a-master/data
chmod 777 -R /app/rocketmq/broker-a-master/logs
docker run \
--name broker-a-master \
-p 10911:10911 \
-p 10912:10912 \
-p 10909:10909 \
-v /app/rocketmq/broker-a-master/data:/home/rocketmq/store \
-v /app/rocketmq/broker-a-master/logs:/home/rocketmq/logs \
-v /app/rocketmq/broker-a-master/conf/broker.conf:/home/rocketmq/rocketmq-5.3.0/conf/broker.conf \
-e "NAMESRV_ADDR=192.168.186.100:9876;192.168.186.100:9877" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-e "MAX_POSSIBLE_HEAP=200000000" \
-d \
apache/rocketmq:5.3.0 \
sh mqbroker -c /home/rocketmq/rocketmq-5.3.0/conf/broker.conf

端口映射说明:
-p 10911:10911 暴露容器中的remotingServer服务,监听客户端的连接。
-p 10912:10912 暴露容器中的主从同步服务,监听数据同步请求。
-p 10909:10909 暴露容器中的fastRemotingServer服务。

  1. 从节点要挂载的的broker.conf配置文件(brokerIP记得改成自己的):
# 集群名称
brokerClusterName = hangzhou1

# 主和从的名称需要保持一致
brokerName = broker-a

# 主从标识,0为主,其他大于0的为从,从只允许读,主可以读写
brokerId = 1

# 未消费的持久化消息清理时间点,默认凌晨4点
deleteWhen = 04

# 持久化消息保存周期(单位:小时)
fileReservedTime = 48

# brocker角色,从
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole = SLAVE

# 刷盘方式:异步刷盘
flushDiskType = ASYNC_FLUSH

# broker自己的ip。将来服务注册到nameserver的ip就是这个。由于这里只写了一个ip,所以将来主从同步时,也会用这个ip。
brokerIP1 = 192.168.186.100
# 可以配置多个ip,示例:brokerIP1=xxx brokerIP2=xxx。配置了多个ip时,将来nameserver会自动选择用哪个ip进行与客户端通信,用哪个ip进行主从同步。
# 实际开发中通常配置两个ip,一个公网ip,一个内网ip。
# brokerIP2 = 192.168.186.100

# !!!请仔细阅读下面这2行注释!!!
# listenPort属性用于指定哪个端口作为remotingServer服务(这个服务就是用来连接客户端的)组件使用的端口,并且将来服务注册到nameserver的
# 端口号也是这个。这就意味着,你在创建容器时指定的端口映射中,宿主机必须和容器内部的端口一致。
listenPort = 10811

# nameserver的ip+端口。多个地址用分号隔开
namesrvAddr = 192.168.186.100:9876;192.168.186.100:9877

# 延迟消息等级时间。
# 这个设置也影响全局的消费重试机制的间隔时间,消费重试机制走的就是延迟消息,这里设置后,第一次重试是在是失败的10s后(从第三个开始,
# DefaultMQPushConsumerImpl源码中setDelayTimeLevel(3 + msg.getReconsumeTimes()),舍去了前两个),第二次是上次失败的30s
# 后,因为消费重试次数是16次(DefaultMQPushConsumerImpl源码默认是16次),而我们30s后面没有设置了,他后面的13次都会按30s间隔去重试。
messageDelayLevel = 1s 5s 10s 30s

# 在发送消息时,自动创建服务器不存在的topic时,默认创建的队列数,与Master节点保持一致或根据实际需求调整  
defaultTopicQueueNums=4  
  
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateTopicEnable=true
  
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateSubscriptionGroup=true  
  
# commitLog每个文件的大小默认1G,与Master节点保持一致  
mapedFileSizeCommitLog=1073741824  
  
# ConsumeQueue每个文件默认存30W条,根据业务情况调整,与Master节点保持一致  
mapedFileSizeConsumeQueue=300000

# 设置所在机器磁盘占用超95%才报错
diskMaxUsedSpaceRatio = 95

创建从节点容器(记得将nameserver的ip和端口改成自己的):

mkdir -p /app/rocketmq/broker-a-slave/data
mkdir -p /app/rocketmq/broker-a-slave/logs
chmod 777 -R /app/rocketmq/broker-a-slave/data
chmod 777 -R /app/rocketmq/broker-a-slave/logs
docker run \
--name broker-a-slave \
-p 10811:10811 \
-p 10812:10912 \
-p 10809:10909 \
-v /app/rocketmq/broker-a-slave/data:/home/rocketmq/store \
-v /app/rocketmq/broker-a-slave/logs:/home/rocketmq/logs \
-v /app/rocketmq/broker-a-slave/conf/broker.conf:/home/rocketmq/rocketmq-5.3.0/conf/broker.conf \
-e "NAMESRV_ADDR=192.168.186.100:9876;192.168.186.100:9877" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-e "MAX_POSSIBLE_HEAP=200000000" \
-d \
apache/rocketmq:5.3.0 \
sh mqbroker -c /home/rocketmq/rocketmq-5.3.0/conf/broker.conf

1.3.2、🍀安装第2对主从

现在到第2台Linux上操作

  1. 主节点的broker.conf配置文件(brokerIP记得改成自己的):
# 集群名称
brokerClusterName = hangzhou1

# 主和从的名称需要保持一致
brokerName = broker-b

# 主从标识,0为主,其他大于0的为从,从只允许读,主可以读写
brokerId = 0

# 未消费的持久化消息清理时间点,默认凌晨4点
deleteWhen = 04

# 持久化消息保存周期(单位:小时)
fileReservedTime = 48

# brocker角色,主
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole = ASYNC_MASTER

# 刷盘方式:异步刷盘
flushDiskType = ASYNC_FLUSH

# broker自己的ip。将来服务注册到nameserver的ip就是这个。由于这里只写了一个ip,所以将来主从同步时,也会用这个ip。
brokerIP1 = 192.168.186.101
# 可以配置多个ip,示例:brokerIP1=xxx brokerIP2=xxx。配置了多个ip时,将来nameserver会自动选择用哪个ip进行与客户端通信,用哪个ip进行主从同步。
# 实际开发中通常配置两个ip,一个公网ip,一个内网ip。
# brokerIP2 = 192.168.186.100

# !!!请仔细阅读下面这2行注释!!!
# listenPort属性用于指定哪个端口作为remotingServer服务(这个服务就是用来连接客户端的)组件使用的端口,并且将来服务注册到nameserver的
# 端口号也是这个。这就意味着,你在创建容器时指定的端口映射中,宿主机必须和容器内部的端口一致。
listenPort = 10711

# nameserver的ip+端口。多个地址用分号隔开
namesrvAddr = 192.168.186.100:9876;192.168.186.100:9877

# 延迟消息等级时间。
# 这个设置也影响全局的消费重试机制的间隔时间,消费重试机制走的就是延迟消息,这里设置后,第一次重试是在是失败的10s后(从第三个开始,
# DefaultMQPushConsumerImpl源码中setDelayTimeLevel(3 + msg.getReconsumeTimes()),舍去了前两个),第二次是上次失败的30s
# 后,因为消费重试次数是16次(DefaultMQPushConsumerImpl源码默认是16次),而我们30s后面没有设置了,他后面的13次都会按30s间隔去重试。
messageDelayLevel = 1s 5s 10s 30s

# 在发送消息时,自动创建服务器不存在的topic时,默认创建的队列数,与Master节点保持一致或根据实际需求调整  
defaultTopicQueueNums=4  
  
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateTopicEnable=true
  
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateSubscriptionGroup=true  
  
# commitLog每个文件的大小默认1G,与Master节点保持一致  
mapedFileSizeCommitLog=1073741824  
  
# ConsumeQueue每个文件默认存30W条,根据业务情况调整,与Master节点保持一致  
mapedFileSizeConsumeQueue=300000

# 设置所在机器磁盘占用超95%才报错
diskMaxUsedSpaceRatio = 95

创建主节点容器(记得将nameserver的ip和端口改成自己的):

mkdir -p /app/rocketmq/broker-b-master/data
mkdir -p /app/rocketmq/broker-b-master/logs
chmod 777 -R /app/rocketmq/broker-b-master/data
chmod 777 -R /app/rocketmq/broker-b-master/logs
docker run \
--name broker-b-master \
-p 10711:10711 \
-p 10712:10912 \
-p 10709:10909 \
-v /app/rocketmq/broker-b-master/data:/home/rocketmq/store \
-v /app/rocketmq/broker-b-master/logs:/home/rocketmq/logs \
-v /app/rocketmq/broker-b-master/conf/broker.conf:/home/rocketmq/rocketmq-5.3.0/conf/broker.conf \
-e "NAMESRV_ADDR=192.168.186.100:9876;192.168.186.100:9877" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-e "MAX_POSSIBLE_HEAP=200000000" \
-d \
apache/rocketmq:5.3.0 \
sh mqbroker -c /home/rocketmq/rocketmq-5.3.0/conf/broker.conf
  1. 从节点的broker.conf配置文件(brokerIP记得改成自己的):
# 集群名称
brokerClusterName = hangzhou1

# 主和从的名称需要保持一致
brokerName = broker-b

# 主从标识,0为主,其他大于0的为从,从只允许读,主可以读写
brokerId = 1

# 未消费的持久化消息清理时间点,默认凌晨4点
deleteWhen = 04

# 持久化消息保存周期(单位:小时)
fileReservedTime = 48

# brocker角色,从
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole = SLAVE

# 刷盘方式:异步刷盘
flushDiskType = ASYNC_FLUSH

# broker自己的ip。将来服务注册到nameserver的ip就是这个。由于这里只写了一个ip,所以将来主从同步时,也会用这个ip。
brokerIP1 = 192.168.186.101
# 可以配置多个ip,示例:brokerIP1=xxx brokerIP2=xxx。配置了多个ip时,将来nameserver会自动选择用哪个ip进行与客户端通信,用哪个ip进行主从同步。
# 实际开发中通常配置两个ip,一个公网ip,一个内网ip。
# brokerIP2 = 192.168.186.100

# !!!请仔细阅读下面这2行注释!!!
# listenPort属性用于指定哪个端口作为remotingServer服务(这个服务就是用来连接客户端的)组件使用的端口,并且将来服务注册到nameserver的
# 端口号也是这个。这就意味着,你在创建容器时指定的端口映射中,宿主机必须和容器内部的端口一致。
listenPort = 10611

# nameserver的ip+端口。多个地址用分号隔开
namesrvAddr = 192.168.186.100:9876;192.168.186.100:9877

# 延迟消息等级时间。
# 这个设置也影响全局的消费重试机制的间隔时间,消费重试机制走的就是延迟消息,这里设置后,第一次重试是在是失败的10s后(从第三个开始,
# DefaultMQPushConsumerImpl源码中setDelayTimeLevel(3 + msg.getReconsumeTimes()),舍去了前两个),第二次是上次失败的30s
# 后,因为消费重试次数是16次(DefaultMQPushConsumerImpl源码默认是16次),而我们30s后面没有设置了,他后面的13次都会按30s间隔去重试。
messageDelayLevel = 1s 5s 10s 30s

# 在发送消息时,自动创建服务器不存在的topic时,默认创建的队列数,与Master节点保持一致或根据实际需求调整  
defaultTopicQueueNums=4  
  
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateTopicEnable=true
  
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭,与Master节点保持一致  
autoCreateSubscriptionGroup=true  
  
# commitLog每个文件的大小默认1G,与Master节点保持一致  
mapedFileSizeCommitLog=1073741824  
  
# ConsumeQueue每个文件默认存30W条,根据业务情况调整,与Master节点保持一致  
mapedFileSizeConsumeQueue=300000

# 设置所在机器磁盘占用超95%才报错
diskMaxUsedSpaceRatio = 95

创建从节点容器(记得将nameserver的ip和端口改成自己的):

mkdir -p /app/rocketmq/broker-b-slave/data
mkdir -p /app/rocketmq/broker-b-slave/logs
chmod 777 -R /app/rocketmq/broker-b-slave/data
chmod 777 -R /app/rocketmq/broker-b-slave/logs
docker run \
--name broker-b-slave \
-p 10611:10611 \
-p 10612:10912 \
-p 10609:10909 \
-v /app/rocketmq/broker-b-slave/data:/home/rocketmq/store \
-v /app/rocketmq/broker-b-slave/logs:/home/rocketmq/logs \
-v /app/rocketmq/broker-b-slave/conf/broker.conf:/home/rocketmq/rocketmq-5.3.0/conf/broker.conf \
-e "NAMESRV_ADDR=192.168.186.100:9876;192.168.186.100:9877" \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m" \
-e "MAX_POSSIBLE_HEAP=200000000" \
-d \
apache/rocketmq:5.3.0 \
sh mqbroker -c /home/rocketmq/rocketmq-5.3.0/conf/broker.conf

2、安装控制台工具

现在到第1台Linux上操作

rocket本身没有提供可视化管理工具,只提供了个mqadmin(命令行)。所以我们安装第三方的可视化管理工具。工具的官方地址:

https://github.com/apache/rocketmq-externals/tree/rocketmq-console-1.0.0/rocketmq-console

拉取镜像:

docker pull styletang/rocketmq-console-ng

创建容器(记得将nameserver的ip和端口改成自己的):

docker run \
--name rocket-console \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.186.100:9876;192.168.186.100:9877 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 9880:8080 \
-d styletang/rocketmq-console-ng

ip+端口访问控制台,nameserver信息如下图:

在这里插入图片描述


broker信息如下图:

在这里插入图片描述


至此,搭建完毕。

### 回答1: 要搭建RocketMQ集群,可以使用Docker容器化技术来实现。以下是搭建RocketMQ集群的步骤: 1. 安装DockerDocker 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集群,使得我们不必关心繁琐的安装和配置过程,它简化了部署,增强了系统的可维护性和可扩展性。当然,要加强对DockerRocketMQ的学习,熟悉更多命令和配置以适应不同场景下的构建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值