RabbitMQ分布式集群架構

2021-07-11 03:01:58 字數 4914 閱讀 2478

設計集群的目的

1 集群配置方式

rabbitmq可以通過三種方法來部署分布式集群系統,分別是:cluster,federation,shovel

federation:應用於廣域網,允許單台伺服器上的交換機或佇列接收發布到另一台伺服器上交換機或佇列的訊息,可以是單獨機器或集群。federation佇列類似於單向點對點連線,訊息會在聯盟佇列之間**任意次,直到被消費者接受。通常使用federation來連線internet上的中間伺服器,用作訂閱分發訊息或工作佇列。

shovel:連線方式與federation的連線方式類似,但它工作在更低層次。可以應用於廣域網。

2 節點型別

問題說明:rabbitmq要求在集群中至少有乙個磁碟節點,所有其他節點可以是記憶體節點,當節點加入或者離開集群時,必須要將該變更通知到至少乙個磁碟節點。如果集群中唯一的乙個磁碟節點崩潰的話,集群仍然可以保持執行,但是無法進行其他操作(增刪改查),直到節點恢復。

解決方案:設定兩個磁碟節點,至少有乙個是可用的,可以儲存元資料的更改。

3 erlang cookie

erlang cookie是保證不同節點可以相互通訊的金鑰,要保證集群中的不同節點相互通訊必須共享相同的erlang cookie。具體的目錄存放在/var/lib/rabbitmq/.erlang.cookie。

說明:這就要從rabbitmqctl命令的工作原理說起,rabbitmq底層是通過erlang架構來實現的,所以rabbitmqctl會啟動erlang節點,並基於erlang節點來使用erlang系統連線rabbitmq節點,在連線過程中需要正確的erlang cookie和節點名稱,erlang節點通過交換erlang cookie以獲得認證。

4 映象佇列

功能和原理

rabbitmq的cluster集群模式一般分為兩種,普通模式和映象模式。

實現機制

映象佇列實現了rabbitmq的高可用性(ha),具體的實現策略如下所示:

ha-mode

ha-params

功能all

空映象佇列將會在整個集群中複製。當乙個新的節點加入後,也會在這 個節點上覆制乙份。

exactly

count

映象佇列將會在集群上覆制count份。如果集群數量少於count時候,佇列會複製到所有節點上。如果大於count集群,有乙個節點crash後,新進入節點也不會做新的映象。

nodes

node name

例項列舉:

queue_args("x-ha-policy":"all") //定義字典來設定額外的佇列宣告引數

channel.queue_declare(queue

="hello-queue",argument=queue_args)

如果需要設定特定的節點(以rabbit@localhost為例),再新增乙個引數

queue_args

("x-ha-policy":"nodes",

"x-ha-policy-params":["rabbit@localhost"])

channel.queue_declare

(queue="hello-queue",argument=queue_args)

可以通過命令列檢視那個主節點進行了同步

1 單機多節點部署

在啟動rabbitmq節點之後,伺服器預設的節點名稱是rabbit和監聽埠5672,如果想在同一臺機器上啟動多個節點,那麼其他的節點就會因為節點名稱和埠與預設的衝突而導致啟動失敗,可以通過設定環境變數來實現,具體方法如下:

rabbitmqctl stop //先停止執行節點,再進行集群部署

rabbitmq_node_port=

5672 rabbitmq_nodename=rabbit //設定環境變數指定埠和節點名稱

rabbitmq-server

-detached

//後台啟動節點

rabbitmq_node_port=

5673 rabbitmq_nodename=rabbit_01 //設定環境變數指定埠和節點名稱

rabbitmq-server

-detached

//後台啟動節點

或者通過新增/etc/rabbitmq/rabbitmq-env.conf檔案來進行設定:

node_port=5672

nodename=rabbit

node_port=5673

nodename=rabbit_01

rabbitmqctl -n rabbit_01@localhost join_cluster rabbit@localhost

//將rabbit_01新增到集群節點rabbit中去

rabbitmqctl cluster_status //檢視集群節點的狀態

//可以看到如下資訊,說明節點新增成功,表明都是磁碟型別的節點

cluster status of node rabbit@localhost ...

}, ,

, ,]}]

2 多機多節點部署

不同於單機多節點的情況,在多機環境,如果要在cluster集群內部署多個節點,需要注意兩個方面:

環境介紹

rabbitmq節點

ip位址

工作模式

作業系統

rabbitmqcluster

186.16.195.24

disk

centos 7.0 - 64位

rabbitmqcluster01

186.16.195.25

disk

centos 7.0 - 64位

rabbitmqcluster02

186.16.195.26

disk

centos 7.0 - 64位

cluster部署過程

186.16.195.24 rabbitmqcluster

186.16.195.25 rabbitmqcluster01

186.16.195.26 rabbitmqcluster02

[root@rabbitmqcluster01]# scp /var/lib/rabbitmq/.erlang.cookie 186.16

.195

.25:/var/lib/rabbitmq

[root@rabbitmqcluster02]# scp /var/lib/rabbitmq/.erlang.cookie 186.16

.195

.26:/var/lib/rabbitmq

rabbitmqctl stop

rabbitmq-server -detached

[root@rabbitmqcluster]#rabbitmqctl cluster_status

[root@rabbitmqcluster01]#rabbitmqctl cluster_status

[root@rabbitmqcluster02]#rabbitmqctl cluster_status

[root@rabbitmqcluster01]#rabbitmqctl join_cluster rabbit@rabbitmqcluster

[root@rabbitmqcluster]#rabbitmqctl cluster_status
前言:從目前來看,基於rabbitmq的分布式通訊框架主要包括兩部分內容,一是要確保可用性和效能,另乙個就是編寫當節點發生故障時知道如何重連到集群的應用程式。負載均衡就是解決處理節點的選擇問題。

選擇開源的haproxy為rabbitmq集群做負載均衡器,在centos 7.0中安裝haproxy。

rpm -ivh 

.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm//

yum -y install haproxy
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg

.bak

vim /etc/haproxy/haproxy.cfg

listen rabbitmq_local_cluster 127.0.0.1:5670

//前段ip,供product和consumer來進行選擇,由於5672埠已經預設使用,這裡選擇5670埠

mode tcp //負載均衡選項

balance roundrobin //輪詢演算法將負載發給後台伺服器

server rabbit 127.0.0.1:5672

check inter 5000 rise 2 fall 3

//負載均衡中的集群節點配置,這裡選擇的rabbit節點

RabbitMQ分布式集群架構

通過增加更多的節點來擴充套件訊息通訊的吞吐量 federation 應用於廣域網,允許單台伺服器上的交換機或佇列接收發布到另一台伺服器上交換機或佇列的訊息,可以是單獨機器或集群。federation佇列類似於單向點對點連線,訊息會在聯盟佇列之間 任意次,直到被消費者接受。通常使用federation...

分布式集群架構

策略優點 缺點格式 uuid 實現簡單不占用頻寬 無序 不可讀 查詢慢 32位db自增 無 遞迴 db單點故障 擴充套件有瓶頸 snowflake 不占用頻寬 低位趨勢遞增 依賴伺服器時間 18位redis 無單點故障 效能優於db遞增 占用頻寬 redis集群需要維護 12位關係型資料庫都實現資料...

Neo4j分布式集群架構

從下圖可見,neo4j集群由兩個不同的角色core servers和read replicas組成,這兩個角色是任何生產部署中的基礎,但彼此之間的管理規模不同,並且在管理整個集群的容錯性和可伸縮性方面承擔著不同的角色。核心伺服器的主要責任是保護資料。核心伺服器通過使用raft協議複製所有事務來做到這...