Docker安装RocketMQ(坑有点多)

1 Docker安装RocketMQ

1.1 安装流程

#拉取镜像
docker pull foxiswho/rocketmq:server-4.3.2
docker pull foxiswho/rocketmq:broker-4.3.2
#创建nameserver容器
docker create -p 9876:9876 --name rmqserver \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-e "JAVA_OPTS=-Duser.home=/opt" \
-v /haoke/rmq/rmqserver/logs:/opt/logs \
-v /haoke/rmq/rmqserver/store:/opt/store \
foxiswho/rocketmq:server-4.3.2
#创建broker容器
docker create -p 10911:10911 -p 10909:10909 --name rmqbroker \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /haoke/rmq/rmqbroker/conf/broker.conf:/etc/rocketmq/broker.conf \
-v /haoke/rmq/rmqbroker/logs:/opt/logs \
-v /haoke/rmq/rmqbroker/store:/opt/store \
foxiswho/rocketmq:broker-4.3.2
#启动容器
docker start rmqserver rmqbroker

1.2 测试代码

package cn.itcast.rocketmq.topic;

import org.apache.rocketmq.client.producer.DefaultMQProducer;

public class TopicDemo {

    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("haoke");

        //设置nameserver的地址
        producer.setNamesrvAddr("172.16.55.185:9876");

        // 启动生产者
        producer.start();

        /**
         * 创建topic,参数分别是:broker的名称,topic的名称,queue的数量
         *
         */
        producer.createTopic("broker_haoke_im", "my-topic", 8);

        System.out.println("topic创建成功!");

        producer.shutdown();
    }
}

1.3 运行结果

2 异常

2.1 MQClientException: No route info of this topic, my-topic

异常说明:

在客户端的 Producer 运行起来准备发送消息时抛异常如下 “ No route info of this topic ” 异常产生的原因可能是:

  1. Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic
  2. Broker 没有正确连接到 Name Server
  3. Producer 没有正确连接到 Name Server 

解决办法:


排查1:Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic:可以在 Rocket_HOME/distribution/target/apache-rocketmq 下执行 " sh bin/mqbroker -m " 来查看 broker 的配置参数如下所示,autoCreateTopicEnable=true 证明是没有问题的。

root@localhost apache-rocketmq]# sh ./bin/mqbroker -m
2018-08-12 01\:27\:28 INFO main - namesrvAddr=
2018-08-12 01\:27\:28 INFO main - brokerIP1=192.168.58.129
2018-08-12 01\:27\:28 INFO main - brokerName=localhost.localdomain
2018-08-12 01\:27\:28 INFO main - brokerClusterName=DefaultCluster
2018-08-12 01\:27\:28 INFO main - brokerId=0
2018-08-12 01\:27\:28 INFO main - autoCreateTopicEnable=true
2018-08-12 01\:27\:28 INFO main - autoCreateSubscriptionGroup=true
2018-08-12 01\:27\:28 INFO main - rejectTransactionMessage=false
2018-08-12 01\:27\:28 INFO main - fetchNamesrvAddrByAddressServer=false
2018-08-12 01\:27\:28 INFO main - transactionTimeOut=3000
2018-08-12 01\:27\:28 INFO main - transactionCheckMax=5
2018-08-12 01\:27\:28 INFO main - transactionCheckInterval=60000
2018-08-12 01\:27\:28 INFO main - storePathRootDir=/root/store
2018-08-12 01\:27\:28 INFO main - storePathCommitLog=/root/store/commitlog
2018-08-12 01\:27\:28 INFO main - flushIntervalCommitLog=500
2018-08-12 01\:27\:28 INFO main - commitIntervalCommitLog=200
2018-08-12 01\:27\:28 INFO main - flushCommitLogTimed=false
2018-08-12 01\:27\:28 INFO main - deleteWhen=04
2018-08-12 01\:27\:28 INFO main - fileReservedTime=72
2018-08-12 01\:27\:28 INFO main - maxTransferBytesOnMessageInMemory=262144
2018-08-12 01\:27\:28 INFO main - maxTransferCountOnMessageInMemory=32
2018-08-12 01\:27\:28 INFO main - maxTransferBytesOnMessageInDisk=65536
2018-08-12 01\:27\:28 INFO main - maxTransferCountOnMessageInDisk=8
2018-08-12 01\:27\:28 INFO main - accessMessageInMemoryMaxRatio=40
2018-08-12 01\:27\:28 INFO main - messageIndexEnable=true
2018-08-12 01\:27\:28 INFO main - messageIndexSafe=false
2018-08-12 01\:27\:28 INFO main - haMasterAddress=
2018-08-12 01\:27\:28 INFO main - brokerRole=ASYNC_MASTER
2018-08-12 01\:27\:28 INFO main - flushDiskType=ASYNC_FLUSH
2018-08-12 01\:27\:28 INFO main - cleanFileForciblyEnable=true
2018-08-12 01\:27\:28 INFO main - transientStorePoolEnable=false
[root@localhost apache-rocketmq]# 

排查2:Broker 没有正确连接到 Name Server

我们创建配置文件broker.conf,broker.conf配置了Broker、NameServer的地址。

broker.conf文件:

#创建broker配置文件
vim /haoke/rmq/rmqbroker/conf/broker.conf
brokerIP1=172.16.55.185
namesrvAddr=172.16.55.185:9876
brokerName=broker_haoke_im

创建broker容器的时候,读取broker.conf文件:

#创建broker容器
docker create -p 10911:10911 -p 10909:10909 --name rmqbroker \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /haoke/rmq/rmqbroker/conf/broker.conf:/etc/rocketmq/broker.conf \
-v /haoke/rmq/rmqbroker/logs:/opt/logs \
-v /haoke/rmq/rmqbroker/store:/opt/store \
foxiswho/rocketmq:broker-4.3.2

在Broker日志中查看Broker和Name Server的地址,判断Broker是否能正确连接到Name Server。

The broker[broker_haoke_im, 192.168.25.114:10911] boot success. serializeType=JSON and name server is 192.168.25.114:9876

排查3:Producer 没有正确连接到 Name Server 
当时一时糊涂 Linux 上开启了 Broker 端口是 9876,然后自己并没有在防护墙中开启此端口,所以导致客户端 Producer 无论如何也连接不上
如下所示,命令分别含义是:

  1. 查看防护墙开放的端口,此时没有 9876
  2. 设置防火墙开放9876 端口
  3. 重新加载 firewall,修改配置后,必须重新加载才能生效:firewall-cmd --reload 
  4. 再次查看防火墙开放的端口,此时已有 9876
[root@localhost apache-rocketmq]# firewall-cmd --zone=public --list-ports
8090/tcp 80/tcp 8080/tcp
[root@localhost apache-rocketmq]# firewall-cmd --zone=public --add-port=9876/tcp --permanent
success
[root@localhost apache-rocketmq]# firewall-cmd --reload
success
[root@localhost apache-rocketmq]# firewall-cmd --zone=public --list-ports
9876/tcp 8090/tcp 80/tcp 8080/tcp
[root@localhost apache-rocketmq]

2.2 RemotingTooMuchRequestException: sendDefaultImpl call timeout

异常说明:

从 Windows 上连接虚拟机中的 nameServer 时要经过 Linux 系统的防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个 TCP 的会话,关闭后再读写,就有可能导致这个异常。

解决办法:

关闭防火墙:

systemctl stop firewalld

 

Docker是一种容器化平台,可以帮助开发者将应用程序及其依赖项打包成一个独立的容器,以便在不同的环境进行部署和运行。而RocketMQ是一款开源的分布式消息间件,具有高吞吐量、高可用性和可伸缩性的特点。 要在Docker安装RocketMQ,可以按照以下步骤进行操作: 1. 首先,确保你已经安装DockerDocker Compose。你可以在Docker官方网站上找到相应的安装指南。 2. 创建一个新的目录,用于存放RocketMQ的配置文件和数据。 3. 在该目录下创建一个名为`docker-compose.yml`的文件,并将以下内容复制到文件: ```yaml version: '3' services: namesrv: image: rocketmqinc/rocketmq:4.8.0 container_name: rocketmq_namesrv ports: - 9876:9876 volumes: - ./data/namesrv/logs:/root/logs - ./data/namesrv/store:/root/store command: sh mqnamesrv broker: image: rocketmqinc/rocketmq:4.8.0 container_name: rocketmq_broker ports: - 10909:10909 - 10911:10911 environment: - NAMESRV_ADDR=namesrv:9876 volumes: - ./data/broker/logs:/root/logs - ./data/broker/store:/root/store command: sh mqbroker -c /opt/rocketmq-4.8.0/conf/broker.conf console: image: styletang/rocketmq-console-ng container_name: rocketmq_console ports: - 8080:8080 environment: - JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 depends_on: - namesrv ``` 4. 保存并关闭`docker-compose.yml`文件。 5. 在终端进入到该目录,并执行以下命令启动RocketMQ容器: ```bash docker-compose up -d ``` 6. 等待一段时间,RocketMQ容器将会启动并运行。你可以通过访问`http://localhost:8080`来访问RocketMQ的控制台。 至此,你已经成功在Docker安装RocketMQ。你可以使用RocketMQ的客户端工具或者编程语言的RocketMQ SDK来进行消息的发送和接收。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值