rabbitmq 集群安裝
1、安裝模式
分為三種:單主機模式、普通集群模式、鏡像集群模式。
單主機模式:rabbitmq運行在一臺主機上,生產環境不建議使用該模式,性能有限。如果該臺主機down機,整個服務將不可用。
普通集群模式:對於queue來說,消息實體只存在於一個節點上,集群中其他節點僅有相同的元數據,即隊列結構。經過B發送給consumer。所以consumer盡量連接每一個節點,從中去消息,即對於同一個邏輯隊列,要在多個節點建立queue。否則consumer如果只連接一個節點區消息會造成該節點的性能瓶頸。
該模式存在當其中一個節點故障後,其他節點無法獲取到故障節點中還未消費的消息,如果做了消息持久化,必須等待A節點恢復,然後才可以被消費。
鏡像集群模式:該模式會把隊列結構和消息都存在於多個節點,屬於rabbitmq的HA方案。缺點:降低系統性能。
RabbitMQ的集群節點包括內存節點、磁盤節點。顧名思義內存節點就是將所有數據放在內存,磁盤節點將數據放在磁盤。如果在投遞消息時,打開了消息的持久化,那麽即使是內存節點,數據還是會放在磁盤。原則上一個集群至少有一個磁盤節點。在實際使用中會發現所謂的磁盤節點是只用來存儲集群的配置信息,也就是說如果集群中沒有磁盤節點,當所有節點關機後集群的配置信息就會丟失。在進行性能測試時兩個模式的節點訂閱發布消息的性能沒有太大差距。
2、多節點流量分發
RabbitMQ集群模式是沒有中心節點的,並且在連接集群的時候實際上Consumer是連接其中某一臺節點,連接方法和單主機模式一致。
通過負載均衡設備來實現流量分發。可以使用F5硬件負載均衡,如果沒有F5的硬件負載均衡設備也可以使用LVS、haproxy等服務,當Consumer連接集群時實際是先經過負載均衡。首先將集群中所以節點的IP放在一個數組中,app在連接RabbitMQ的時候會從數組中隨機選擇一個IP來連接,然後把連接的節點的IP緩存到服務器,如果連接超時則重新隨機選擇其他節點來連接。通過這種方式來實現app流量的分發。
3、普通集群部署
3.1、部署環境
操作系統:CentOS Linux release 7.5.1804 (Core) 節點1:192.168.40.102 節點2:192.168.40.105
3.2、修改主機名配置
vim /etc/hosts 添加內容如下: 192.168.40.102 node-192-168-40-102 192.168.40.105 node-192-168-40-105
3.3、同步節點cookie
rabbitmq依賴於erlang集群工作,所以必須先構建erlang的集群環境。cookie的存放目錄為:/var/lib/rabbitmq/.erlang.cookie,權限為400.必須保證所有節點一致。
關於cookie同步以及解析,可參考鏈接:https://www.cnblogs.com/crysmile/p/9471456.html
此處以192.168.40.102作為基準節點,以此節點的cookie為標準進行同步。在192.168.40.102上執行如下命令:
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.40/105:/var/lib/rabbitmq/.erlang.cookie scp /root/.erlang.cookie root@192.168.40/105:/root/
所有節點修改cookie文件權限,命令如下:
chmod -R 400 /var/lib/rabbitmq/.erlang.cookie chmod -R 400 /root/.erlang.cookie
3.4、啟動服務同時將節點加入集群
首先啟動192.168.40.102上rabbitmq服務,然後將192.168.40.105節點加入192.168.40.102作為集群運行。
在192.168.40.102上執行如下命令:
rabbitmq-server -detached
在192.168.40.105上執行如下命令:
rabbitmq-server -detached #以後臺模式運行 rabbitmqctl stop_app #僅停止rabbitmq應用 rabbitmqctl join_cluster --ram rabbit@node-192-168-40-105 #此處192.168.40.105以ram(內存)運行模式加入集群 rabbitmqctl start_app #啟動rabbitmq應用
在任意一臺上查看集群狀態:
rabbitmqctl cluster_status
磁盤節點,join_cluster 命令去掉--ram參數即可。 在RabbitMQ集群裏,必須至少有一個磁盤節點存在(磁盤節點用來存儲集群狀態)。
4、鏡像集群
4.1. 鏡像復制模式解析,如下表所示:
ha-mode | ha-params | result |
all | (absent)不需要參數 | 信息映射到所有節點,新節點加入集群也會被映射 |
exactly | count,需要給出節點個數 | 集群中節點個數.如果配置參數超過了集群總節點數 默認是all(集群中所有節點). |
nodes | node names,需要給出節點名稱 | 指定信息映射到哪些節點 |
4.2. 鏡像模式命令配置
語法:set_policy 策略名稱 匹配隊列名的正則表達式 被復制的方式(上面的ha-mode和參數)
4.3. 鏡像模式舉例
ha-mode=all:
所有名字ha開頭的隊列都復制到所有的集群主機,策略名稱為:ha-all.: rabbitmqctl set_policy ha-all "^ha\." ‘{"ha-mode":"all"}‘
ha-mode=exactly:
所有名字 two.開頭的隊列隨機復制到任意一臺集群主機,數量為2,策略名稱為ha-two.: rabbitmqctl set_policy ha-two "^two\." ‘{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}‘
ha-mode=nodes:
所有nodes開頭的隊列都復制到node2和node3.策略名稱:ha-nodes. rabbitmqctl set_policy ha-nodes "^nodes\." ‘{"ha-mode":"nodes","ha-params":["rabbit@node2", "rabbit@node3"]}‘
4.4. 通過rabbitmq後臺配置鏡像模式
5、集群移除節點
5.1. 在要脫離集群節點上執行
假設此處要脫離集群的節點名稱為node1.需要在node1上執行。
rabbitmqctl stop_app
rabbitmqctl reset
#reset執行完成,該節點已經從集群中移除。
rabbitmqctl start_app
5.2. 在集群中其他節點上執行
假設此處要脫離集群的節點名稱為node1.需要在非node1的其他節點上執行。
rabbitmqctl forget_cluster_node rabbit@node1
6、使用haproxy作為四層代理rabbitmq
haproxy反向代理rabbitmq並開啟監控配置如下: listen stats mode http bind *:1090 stats enable stats hide-version stats uri /hadmin stats auth admin:admin stats admin if TRUE listen test_rabbitmq_cluster 0.0.0.0:5672 mode tcp balance roundrobin option tcpka timeout client 99999m timeout server 99999m server kvm-dev-mq-redis-192-168-40-102 192.168.40.102:5672 check maxconn 65535 inter 2000 rise 2 fall 3 server kvm-dev-mq-redis-192-168-40-105 192.168.40.105:5672 check maxconn 65535 inter 2000 rise 2 fall 3
rabbitmq 集群安裝