
內(nèi)建集群

目的
- 一個節(jié)點掛了, 還能繼續(xù)運行
- 增加吞吐量
復(fù)制元數(shù)據(jù):
隊列名稱和屬性(是否持久化自動刪除)
交換器的名稱類型屬性
綁定
弱點
但是, 掛了的那個節(jié)點, 里面的信息就丟臉
因為集群不復(fù)制隊列內(nèi)容和狀態(tài)
為了節(jié)約空間和性能: 網(wǎng)絡(luò)開銷 持久化寫磁盤
磁盤節(jié)點
高可用最好還是持久化
節(jié)點分為2種:
- 磁盤節(jié)點(高可用)
- 內(nèi)存節(jié)點
集群, 至少要有一個磁盤節(jié)點, 就是說 如果單節(jié)點 一定是磁盤節(jié)點
為了高可用, 至少要有2個磁盤節(jié)點
因為, 只有一個磁盤節(jié)點的情況下, 這個節(jié)點崩潰, 任何修改元數(shù)據(jù)的操作(創(chuàng)建隊列交換器)都無法進(jìn)行了
其他
如果節(jié)點1收到了 原來發(fā)給節(jié)點2的信息 會轉(zhuǎn)個節(jié)點2


節(jié)點1會把數(shù)據(jù)給節(jié)點2 還是走老路

鏡像隊列 (高可用隊列)

引入 RabbitMQ 的鏡像隊列機制,將 queue 鏡像到 cluster 中其他的節(jié)點之上。
在該實現(xiàn)下,如果集群中的一個節(jié)點失效了,queue 能自動地切換到鏡像中的另一個節(jié)點以保證服務(wù)的可用性。

在通常的用法中,針對每一個鏡像隊列都包含一個 master 和多個 slave,分別對應(yīng)于不同的節(jié)點。
slave 會準(zhǔn)確地按照 master 執(zhí)行命令的順序進(jìn)行命令執(zhí)行,故 slave 與 master 上維護(hù)的狀態(tài)應(yīng)該是相同的。
除了 publish 外所有動作都只會向 master 發(fā)送,然后由 master將命令執(zhí)行的結(jié)果廣播給 slave 們,故看似從鏡像隊列中的消費操作實際上是在 master 上執(zhí)行的。
代碼設(shè)置

只連集群中的一個節(jié)點: 節(jié)點1
隊列聲明的時候, 加上高級屬性
all的意思是 每個節(jié)點都有這個隊列
只生產(chǎn)3條消息到這個隊列, 不消費
看節(jié)點1: 隊列里面有3條消息

看另外一臺服務(wù)器 節(jié)點2: 隊列里面同樣3條消息

這都因為 隊列聲明了 屬性: x-ha-policy------all
也可以不這么徹底, 只鏡像指定幾臺
不用all 指定鏡像這2臺:

控制臺配置(管理命令完成)
就是添加 policy

一般是這個 代碼的角色一般權(quán)限不高 沒有配置的權(quán)力
因為集群會復(fù)制元數(shù)據(jù), 隨便去哪個節(jié)點配都一樣
例如,對隊列名稱以“queue_”開頭的所有隊列進(jìn)行鏡像,在集群的兩個節(jié)點上完成進(jìn)行,
policy 的設(shè)置 命令為:
rabbitmqctl set_policy ha-queue-two"^queue_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'



鏡像有2個, 自動備份


使用 HAProxy
處理節(jié)點選擇,故障服務(wù)器檢測和負(fù)載分布可以使用 HAProxy
就是加一個中間層
客戶端不再連其中一個節(jié)點,而是連中間層
HAProxy里面配置
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
balance roundrobin
server rabbit01 127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbit02 node2:5672 check inter 5000 rise 2 fall 3
意思是 客戶端連 0.0.0.0:5670就行了
會輪詢訪問下面2個節(jié)點
心跳:
check inter 5000 :5秒一次心跳
rise 2:2次成功變活
fall 3:3次失敗變死