一、鏡像模式
docker pull rabbitmq:3-management
容器間建立連接,不使用--link,推薦使用 network
創建橋接網絡
docker network create rabbitmanet
啟動並創建容器master72、slave73、slave74
docker run -d --name=master72 -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=master72 -e RABBITMQ_ERLANG_COOKIE='YAOZH' -h master72 --net=rabbitmanet rabbitmq:3-management docker run -d --name=slave73 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=slave73 -e RABBITMQ_ERLANG_COOKIE='YAOZH' -h slave73 --net=rabbitmanet rabbitmq:3-management docker run -d --name=slave74 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=slave74 -e RABBITMQ_ERLANG_COOKIE='YAOZH' -h slave74 --net=rabbitmanet rabbitmq:3-management
RABBITMQ_ERLANG_COOKIE:通過Erlang Cookie,相當於共享秘鑰的概念,長度任意,只要所有容器都一致即可。
-h: 設置容器hostname名稱
–net: 設置所屬網絡
訪問:IP:15672
遇到問題,阿里雲服務器需要創建安全組才能訪問
默認賬戶密碼:guest
基礎了解:https://blog.csdn.net/lobber1987/article/details/79045494
新增用戶密碼(可以跳過):
在添加用戶時,我們選擇了Tags,Tags也就是用戶角色,它有如下五種:
超級管理員(administrator):可登陸管理控制台(啟用management plugin的情況下),可查看所有的信息,並且可以對用戶,策略(policy)進行操作。
監控者(monitoring):可登陸管理控制台(啟用management plugin的情況下),同時可以查看rabbitmq節點的相關信息(進程數,內存使用情況,磁盤使用情況等)。
策略制定者(policymaker):可登陸管理控制台(啟用management plugin的情況下), 同時可以對policy進行管理。但無法查看節點的相關信息。
普通管理者(management):僅可登陸管理控制台(啟用management plugin的情況下),無法看到節點信息,也無法對策略進行管理。
其他:無法登陸管理控制台,通常就是普通的生產者和消費者。
通過命令的方式
-
# 設置用戶為administrator角色
-
rabbitmqctl set_user_tags username administrator
添加用戶
docker exec -it myrabbit1 bash
rabbitmqctl list_users
rabbitmqctl add_user username passwd
rabbitmqctl set_user_tags newadmin administrator
rabbitmqctl set_permissions -p / newadmin "." "." ".*" (這個沒有執行,也能登陸,等遇到問題在說)
刪除用戶
rabbitmqctl delete_user username
修改用戶密碼
rabbitmqctl change_password username newpasswd
查看用戶列表
rabbitmqctl list_users
salve加入集群操作(注意做這個步驟的時候:需要配置/etc/hosts必須相互能夠尋地到 我們已通過-h指定hostname)
分別進入slave73、slave73容器(docker exec -it 容器id /bin/bash),執行一下:
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram master72@master72
//(--ram:內存存儲方式,默認磁盤存儲 master72磁盤存儲,用於數據存儲和交換)
rabbitmqctl start_app
ex:
[root@iZuf6f9ue9eyhx2y1892nhZ ~]# docker exec -it 5ba894a93d6a /bin/bash
root@slave74:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node slave74@slave74 ...
root@slave74:/# rabbitmqctl join_cluster --ram master72@master72
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node slave74@slave74 with master72@master72
root@slave74:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node slave74@slave74 ...
訪問任意一個節點:

//其他基本操作 // 在另外其他節點上操作要移除的集群節點 rabbitmqctl forget_cluster_node master73@master73
//集群名稱(默認為第一個node名稱)修改(任意節點): rabbitmqctl set_cluster_name rabbitmq_cluster1
//查看集群狀態(任意節點) rabbitmqctl cluster_status
配置鏡像隊列:
//設置鏡像隊列策略(在任意一個節點上執行) rabbitmqctl set_policy ha-all "^node." '{"ha-mode":"all"}'

其他問題
如出現改過期警告:RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
有些特殊的情況,比如已經運行了一段時間的幾個單個物理機,我們在之前沒有設置過相同的Erlang Cookie值,現在我們要把單個的物理機部署成集群,實現我們需要同步Erlang的Cookie值。
1.為什么要配置相同的erlang cookie?
因為RabbitMQ是用Erlang實現的,Erlang Cookie相當於不同節點之間相互通訊的秘鑰,Erlang節點通過交換Erlang Cookie獲得認證。
2.Erlang Cookie的位置
要想知道Erlang Cookie位置,首先要取得RabbitMQ啟動日志里面的home dir路徑,作為根路徑。使用:“docker logs 容器名稱”查看,
注意:每個人的erlang cookie位置可能不同,一定要查看自己的home dir路徑。
3.復制Erlang Cookie到其他RabbitMQ節點
獲取到第一個RabbitMQ的Erlang Cookie之后,只需要把這個文件復制到其他RabbitMQ節點即可。
物理機和容器之間復制命令如下:
- 容器復制文件到物理機:docker cp 容器名稱:容器目錄 物理機目錄
- 物理機復制文件到容器:docker cp 物理機目錄 容器名稱:容器目錄
設置Erlang Cookie文件權限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。
二、HaProxy
HaProxy是一款提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理軟件,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HaProxy特別適用於負載特大的web站點,這些站點通常又需要會話保持或七層處理。HaProxy運行在時下的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以簡單安全整合進您當前框架中,同時可以保護你的web服務器不被暴露到網絡上
獲取最新鏡像:
sudo docker pull haproxy
創建容器rabbitmq-haproxy8100掛載的配置文件haproxy.cfg
[root@iZuf6f9ue9eyhx2y1892nhZ 8100]# pwd
/home/haproxy/8100
[root@iZuf6f9ue9eyhx2y1892nhZ 8100]# cat haproxy.cfg
#logging options global log 127.0.0.1 local0 info maxconn 5120 chroot /usr/local/etc/haproxy uid 99 gid 99 daemon quiet nbproc 20 pidfile /var/run/haproxy.pid defaults log global #使用4層代理模式,”mode http”為7層代理模式 mode tcp #if you set mode to tcp,then you nust change tcplog into httplog option tcplog option dontlognull retries 3 option redispatch maxconn 2000 timeout connect 5s #客戶端空閑超時時間為 60秒 則HA 發起重連機制 timeout client 60s #服務器端鏈接超時時間為 15秒 則HA 發起重連機制 timeout server 15s #front-end IP for consumers and producters listen rabbitmq_cluster bind 0.0.0.0:5678 #配置TCP模式 mode tcp #balance url_param userid #balance url_param session_id check_post 64 #balance hdr(User-Agent) #balance hdr(host) #balance hdr(Host) use_domain_only #balance rdp-cookie #balance leastconn #balance source //ip #簡單的輪詢 balance roundrobin #rabbitmq集群節點配置 #inter 每隔五秒對mq集群做健康檢查, 2次正確證明服務器可用,2次失敗證明服務器不可用,並且配置主備機制 server master72 11.111.11.11:5672 check inter 5000 rise 2 fall 2 server slave73 11.111.11.11:5673 check inter 5000 rise 2 fall 2 server slave74 11.111.11.11:5674 check inter 5000 rise 2 fall 2 #配置haproxy web監控,查看統計信息 listen stats bind 0.0.0.0:8101 mode http option httplog stats enable #設置haproxy監控地址為http://localhost:8100/rabbitmq-stats stats uri /rabbitmq-stats stats refresh 5s stats auth admin:admin@1234 listen rabbitmq_admin #監聽8000端口轉發到rabbitmq的客戶端 bind 0.0.0.0:8001 server master72 11.111.11.11:15672 check inter 5000 rise 2 fall 2 server slave73 11.111.11.11:15673 check inter 5000 rise 2 fall 2 server slave74 11.111.11.11:15674 check inter 5000 rise 2 fall 2
-----
運行容器:
docker run --name rabbitmq-haproxy8100 -p 5677:5677 -p 8100:8100 -p 8000:8000 --net=rabbitmanet -v /home/haproxy/8100/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:latest

后記:至於keppalived,后續再說
