RabbitMQ——异宿主docker搭建RabbitMQ镜像集群
网上扒的一张图。 我这里没有keepalived这一层。
成功的命令 用--net host模式 与宿主共享网段 --hostname 分别用 rmq1 rmq2 rmq3
在三台机器 192.168.1.20 192.168.1.21 192.168.1.22
以rmq1为磁盘节点,rmq2、rmq3为内存节点,加入集群
rabbitmqctl reset:从管理数据库中移除所有数据,例如配置过的用户和虚拟宿主, 删除所有持久化的消息(这个命令要在rabbitmqctl stop_app之后使用)
--ram 表示设置为内存节点,忽略此参数默认为磁盘节点
最后设置镜像策略。完成。
docker run -d --name rmqnode \ --net host \ --hostname rmq3 \ --add-host="rmq1":192.168.1.20 \ --add-host="rmq2":192.168.1.21 \ --add-host="rmq3":192.168.1.22 \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=Fire001 \ -e RABBITMQ_ERLANG_COOKIE='blaze_rmq_cookie' \ -e RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.8 \ -m 500M --memory-swap 500M \ rabbitmq:3.8.16-management
以下为相关辅助命令
docker exec -it rmqnode rabbitmqctl stop_app docker exec -it rmqnode rabbitmqctl reset docker exec -it rmqnode rabbitmqctl start_app
rmq2 rmq3 以--ram形式加入集群 在stop_app reset之后执行 docker exec -it rmqnode rabbitmqctl join_cluster --ram rabbit@rmq1
若要以disc方式加入,命令为
docker exec -it rmqnode rabbitmqctl join_cluster --disc rabbit@rmq1
注意, 最后面的rabbit@rmq1是已在集群中的disc节点,
执行rabbitmqctl命令的是当前待加入的新节点,且执行时进在,新节点在执行stop_app 和 reset之后、start_app之前。
移了一个节点命令(移除rabbit@rmq2, 其中rabbit@rmq1为集群中的disc节点):
docker exec -it rmqnode rabbitmqctl -n rabbit@rmq1 forget_cluster_node rabbit@rmq2
查看、设置镜像策略 docker exec -it rmqnode rabbitmqctl list_policies docker exec -it rmqnode rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' docker exec -it rmqnode cat /etc/hosts docker exec -it rmqnode cat ~/.erlang.cookie docker logs rmqnode docker stop rmqnode docker rm rmqnode docker ps -a
效果
查看 --net host 模式启动时, rabbit的端口占用情况
netstat -tpln | grep bean
netstat -tpln | grep beam
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 28092/beam.smp
tcp 0 0 0.0.0.0:15692 0.0.0.0:* LISTEN 28092/beam.smp
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 28092/beam.smp
tcp6 0 0 :::5672 :::* LISTEN 28092/beam.smp
netstat -tpln | grep 4369
netstat -tpln | grep 4369
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 70749/epmd
tcp6 0 0 :::4369 :::* LISTEN 70749/epmd
镜像集群已成,下面部署HAProxy
yum list | grep haproxy
yum install -y haproxy.x86_64
haproxy -f /etc/haproxy/haproxy.cfg
service haproxy start
service haproxy status
检查配置文件
haproxy -f /etc/haproxy/haproxy.cfg -p /root/data/soft/haproxy/haproxy.pid -c
haproxy -f /etc/haproxy/haproxy.cfg -p /root/data/soft/haproxy/haproxy.pid -c
Configuration file is valid
在/etc/haproxy/haproxy.cfg中加入以下配置,HAProxy监控、rabbitmq服务负载均衡、rabbitmq控制台负载均衡。
#haproxy monitor listen monitor bind 0.0.0.0:7100 mode http option httplog stats enable maxconn 10 stats uri /stats stats refresh 5s stats realm haproxy #认证时的realm,作为提示用的 stats auth admin:Fire001 #认证用户名和密码 stats hide-version #隐藏HAProxy版本号 stats admin if TRUE #管理界面只有认证通过后才能在ui上进行管理 #rabbitmq cluster listen rabbitmq_cluster bind 0.0.0.0:7107 #配置TCP模式 mode tcp #简单的轮询 balance roundrobin #RabbitMQ集群节点配置 server rabbitmq_node1 192.168.1.20:5672 check inter 5000 rise 2 fall 3 weight 1 server rabbitmq_node2 192.168.1.21:5672 check inter 5000 rise 2 fall 3 weight 1 server rabbitmq_node3 192.168.1.22:5672 check inter 5000 rise 2 fall 3 weight 1 #rabbitmq console listen rabbitm1_console bind 0.0.0.0:17107 mode http balance roundrobin server rabbitmq_console1 192.168.1.20:15672 server rabbitmq_console2 192.168.1.21:15672 server rabbitmq_console3 192.168.1.22:15672
service haproxy start && service haproxy status
总是启不来的问题,解决办法,
删除
/run/haproxy.pid后,再执行 service haproxy start
运行时内存修改,0.8 * 500M = 400M
docker exec -it rmqnode rabbitmqctl set_vm_memory_high_watermark 0.8
运行时修改最低磁盘警戒线
docker exec -it rmqnode rabbitmqctl set_disk_free_limit 1G
docker exec -it rmqnode rabbitmqctl set_disk_free_limit 1G
Setting disk free limit on rabbit@rmq1 to 1G bytes ...
端口映射方式部署
docker run -d --name rmqnode \
-p 7107:5672 \
-p 17107:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
-e RABBITMQ_ERLANG_COOKIE='blaze_rmq_cookie' \
-e RABBITMQ_VM_MEMORY_HIGH_WATERMARK=0.8 \
-m 500M --memory-swap 500M \
rabbitmq:3.8.16-management
设置参数
tcp_listeners 设置rabbitmq的监听端口,默认为 5672
disk_free_limit 磁盘低水位线,若磁盘容量低于指定值则停止接收数据,默认值为{mem_relative, 1.0}, 即与内存相关联1:1,也可定制为多少byte.
vm_memeory_high_watemark, 设置内存低水位线,若低于该水位线,则开启流控机制,默认值为0.4,即内存总量的40%
hipe_compile将部分rabbitmq代码用High Performance Erlang compiler编译,可提升性能,该参数是实验性,若出现erlang vm segfaults,应关掉
force_fine_statistics,该参数属于rabbitmq_mamagement,若为true这进行精细化统计,但会影响性能
集群节点模式:Disk为磁盘模式存储/Ram为内存模式存储
//修改端口
RABBITMQ_NODE_PORT=5672