docker搭建rabbitMQ的一次淌坑记

#0x01 简单介绍搭建步骤

两台机器:server1 server2
都安装docker,每台server上用docker启动一个rabbimq的容器

在server1执行:

docker run -itd --name rabbit \
    --net host \  # 使用宿主机的网络
    -p 4369:4369 \
    -p 5671:5671 \
    -p 5672:5672 \
    -p 25672:25672 \
    -p 15672:15672 \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=admin \
    -e RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.2 \ # 占用物理内存的百分比
    -e RABBITMQ_NODENAME=test \
    -e RABBITMQ_ERLANG_COOKIE='********' \ # 可以理解成做Erlang分布式的同步密钥之类的吧
    rabbitmq:3-management

在server2执行:

docker run -itd --name rabbit \
    --net host \  # 使用宿主机的网络
    -p 4369:4369 \
    -p 5671:5671 \
    -p 5672:5672 \
    -p 25672:25672 \
    -p 15672:15672 \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=admin \
    -e RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.2 \ # 占用物理内存的百分比
    -e RABBITMQ_NODENAME=test \
    -e RABBITMQ_ERLANG_COOKIE='********' \ # 可以理解成做Erlang分布式的同步密钥之类的吧
    rabbitmq:3-management

docker exec rabbit rabbitmqctl stop_app
docker exec rabbit rabbitmqctl reset
docker exec rabbit rabbitmqctl join_cluster --ram test@server1
docker exec rabbit rabbitmqctl start_app

注意:

Server指定如下命令中,

docker exec rabbit rabbitmqctl join_cluster --ram test@server1

其中 ‘test@server1’ 的test是Server1中指定的RABBITMQ_NODENAME, @后的server1是server1的主机名

server2必须要通过主机名‘server1’找的到server1才能正常组成集群。

#0x02 集群无法加入的一个小坑

我最初在两台上执行的创建容器命令是:

docker run -itd --name rabbit \
     -p 4369:4369 \
    -p 5671:5671 \
    -p 5672:5672 \
    -p 25672:25672 \
    -p 15672:15672 \
    -e RABBITMQ_DEFAULT_USER=admin \
    -e RABBITMQ_DEFAULT_PASS=admin \
    -e RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.2 \ 
    -e RABBITMQ_NODENAME=test \
    -e RABBITMQ_ERLANG_COOKIE='********' \ 
    rabbitmq:3-management

里面缺少了

--net host

导致docker默认使用了自己的网络于创建的在server1节点是如下样子:

avatar

主机名成为了docker的主机名

于是server2执行 ‘docker exec rabbit rabbitmqctl join_cluster –ram test@server1 ’ 时报错了:

avatar

后来终于找到问题,加上 ‘–net host’ 后重新创建了容器, 一切正常了

容器正常显示节点名:

test@server1

server2加入server1的节点也正常了

最关键的是,这坑淌了一下午。。。。浪费时间

#0x03 关于消息持久化的一个小坑

在网上查询”RabbitMQ“持久化,基本所有的文章都会写出,设置Durable=True即可,但是我设置之后依然不生效。

后来通过查询文档得知,Durable设置只是指定Exchange或Queue是否具有持久化能力,但一个消息是否真的需要持久化,最后还得由生产者指定。生产者代码中需加入properties=pika.BasicProperties(delivery_mode=2, )才能实现该条message的持久化

channel.basic_publish(exchange='test', routing_key='', body=json.dumps(body),
                  properties=pika.BasicProperties(delivery_mode=2, ))



版权声明:本文为原创,欢迎转载,转载请注明出处,勿用于商业用途!