#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节点是如下样子:

主机名成为了docker的主机名
于是server2执行 ‘docker exec rabbit rabbitmqctl join_cluster –ram test@server1 ’ 时报错了:

后来终于找到问题,加上 ‘–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, ))