?Rabbitmq集群總體架構(gòu)

操作系統(tǒng):window 10
機(jī)器Ha-1(keepalived1):192.168.1.1
機(jī)器Ha-2(keepalived2):192.168.1.2
機(jī)器MQ node1 :192.168.200.1? (內(nèi)存節(jié)點(diǎn))
機(jī)器MQ node2 :192.168.200.2? (內(nèi)存節(jié)點(diǎn))
機(jī)器MQ node3 :192.168.200.3? (磁盤節(jié)點(diǎn))
4 Rabbitmq集群模式
4.1 普通模式
默認(rèn)的集群模式。對于Queue來說,消息實(shí)體只存在于其中一個(gè)節(jié)點(diǎn),A、B兩個(gè)節(jié)點(diǎn)僅有相同的元數(shù)據(jù),即隊(duì)列結(jié)構(gòu)。當(dāng)消息進(jìn)入A節(jié)點(diǎn)的Queue中后,consumer從B節(jié)點(diǎn)拉取時(shí),RabbitMQ會(huì)臨時(shí)在A、B間進(jìn)行消息傳輸,把A中的消息實(shí)體取出并經(jīng)過B發(fā)送給consumer。所以,consumer應(yīng)盡量連接每一個(gè)節(jié)點(diǎn),從中取消息。即對于同一個(gè)邏輯隊(duì)列,要在多個(gè)節(jié)點(diǎn)建立物理Queue。否則無論consumer連A或B,出口總在A,會(huì)產(chǎn)生瓶頸。該模式存在一個(gè)問題就是當(dāng)A節(jié)點(diǎn)故障后,B節(jié)點(diǎn)無法取到A節(jié)點(diǎn)中還未消費(fèi)的消息實(shí)體。如果做了消息持久化,那么得等A節(jié)點(diǎn)恢復(fù),然后才可被消費(fèi);如果沒有持久化的話,消息會(huì)丟失。
4.2 鏡像模式
該模式解決了上述問題,其實(shí)它和普通模式不同之處在于,消息實(shí)體會(huì)主動(dòng)在鏡像節(jié)點(diǎn)間同步,而不是在consumer取數(shù)據(jù)時(shí)臨時(shí)拉取。 該模式帶來的副作用也很明顯,除了降低系統(tǒng)性能外,如果鏡像隊(duì)列數(shù)量過多,加之大量的消息進(jìn)入,集群內(nèi)部的網(wǎng)絡(luò)帶寬將會(huì)被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用。
5 Rabbitmq集群的基本概念
集群中有兩種節(jié)點(diǎn):
內(nèi)存節(jié)點(diǎn):只保存狀態(tài)到內(nèi)存(一個(gè)例外的情況是:持久的queue的持久內(nèi)容將被保存到disk)
磁盤節(jié)點(diǎn):保存狀態(tài)到內(nèi)存和磁盤
顧名思義內(nèi)存節(jié)點(diǎn)就是將所有數(shù)據(jù)放在內(nèi)存,磁盤節(jié)點(diǎn)將數(shù)據(jù)放在磁盤。不過,如果在投遞消息時(shí),打開了消息的持久化,那即使是內(nèi)存節(jié)點(diǎn),數(shù)據(jù)還是安全的放在磁盤。
一個(gè)RabbitMQ集群中可以共享user、vhost、queue、exchange等,所有的數(shù)據(jù)和狀態(tài)都是必須在所有節(jié)點(diǎn)上復(fù)制的,一個(gè)例外是那些當(dāng)前只屬于創(chuàng)建它的節(jié)點(diǎn)的消息隊(duì)列,盡管它們可見且可被所有節(jié)點(diǎn)讀取。RabbitMQ節(jié)點(diǎn)可以動(dòng)態(tài)地加入到集群中,一個(gè)節(jié)點(diǎn)它可以加入到集群中,也可以從集群環(huán)集群進(jìn)行一個(gè)基本的負(fù)載均衡。
6 Haproxy(反向代理)
Haproxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。Haproxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會(huì)保持或七層處理。Haproxy運(yùn)行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬計(jì)的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中,同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
HAProxy的優(yōu)點(diǎn):
1、HAProxy是支持虛擬主機(jī)的,可以工作在4、7層(支持多網(wǎng)段);
2、能夠補(bǔ)充Nginx的一些缺點(diǎn)比如Session的保持,Cookie的引導(dǎo)等工作;
3、支持url檢測后端的服務(wù)器;
4、它跟LVS一樣,本身僅僅就只是一款負(fù)載均衡軟件;單純從效率上來講HAProxy更會(huì)比Nginx有更出色的負(fù)載均衡速度,在并發(fā)處理上也是優(yōu)于Nginx的;
5、HAProxy可以對Mysql讀進(jìn)行負(fù)載均衡,對后端的MySQL節(jié)點(diǎn)進(jìn)行檢測和負(fù)載均衡,不過在后端的MySQL slaves數(shù)量超過10臺(tái)時(shí)性能不如LVS;
6、HAProxy的算法較多,達(dá)到8種;
HAProxy的缺點(diǎn):
1. 不支持POP/SMTP協(xié)議
2. 不支持SPDY協(xié)議
3. 不支持HTTP cache功能。現(xiàn)在不少開源的lb項(xiàng)目,都或多或少具備HTTP cache功能。
4. 重載配置的功能需要重啟進(jìn)程,雖然也是soft restart,但沒有Nginx的reaload更為平滑和友好。
5. 多進(jìn)程模式支持不夠好
?7.?Keepalived(熱備份)
7.1 KeepAlived主要有兩個(gè)功能:
(1).能夠?qū)ealServer進(jìn)行健康狀況檢查,支持4層、5層和7層協(xié)議進(jìn)行健康檢查;
(2).對負(fù)載均衡調(diào)度器實(shí)現(xiàn)高可用,防止Director單點(diǎn)故障。
?7.2 KeepAlived工作過程:
? ? ?keepalived實(shí)現(xiàn)故障轉(zhuǎn)移的功能是通過VRRP(virtual router redundancy protocol虛擬路由器冗余協(xié)議)協(xié)議來實(shí)現(xiàn)的。 在keepalived正常工作的時(shí)候,主節(jié)點(diǎn)(master)會(huì)不斷的發(fā)送心跳信息給備節(jié)點(diǎn)(backup),當(dāng)備節(jié)點(diǎn)不能在一定時(shí)間內(nèi)收到主節(jié)點(diǎn)的心跳信息時(shí),備節(jié)點(diǎn)會(huì)認(rèn)為主節(jié)點(diǎn)宕了,然后會(huì)接管主節(jié)點(diǎn)上的資源,并繼續(xù)向外提供服務(wù)保證其可用性。當(dāng)主節(jié)點(diǎn)恢復(fù)的時(shí)候,備節(jié)點(diǎn)會(huì)自動(dòng)讓出資源并再次自動(dòng)成為備節(jié)點(diǎn)。
10 架構(gòu)部署
10.1安裝環(huán)境
準(zhǔn)備安裝介質(zhì):
jdk1.8
rabbitmq_server-3.7.14
otp_win64_21.3
haproxy-1.7.5.tar
Keepalived 1.2.21(沒有window)
10.2 rabbitmq單機(jī)部署
安裝前檢查防火墻是否關(guān)閉,安裝rabbitmq需要關(guān)閉防火墻?。?!
分別在192.168.200.1,192.168.200.2,192.168.200.3節(jié)點(diǎn)上安裝rabbitmq server。
安裝步驟:
1.安裝jdk以及配置Java運(yùn)行環(huán)境
2.安裝erlang軟件,一直默認(rèn)下一步,安裝完畢后配置erlang環(huán)境變量
3. 安裝rabbitmq,默認(rèn)下一步
4. 安裝完成后,將C:\Users\Administrator\.erlang.cookie文件替換掉C:\Windows\System32\config\systemprofile\.erlang.cookie,即erlang.cookie文件保持一致
5.以管理員角色打開cmd操作框,安裝rabbitmq插件,執(zhí)行命令:
#"C:\Program Files\RabbitMQServer\rabbitmq_server-3.7.14\sbin\rabbitmq-plugins.bat" enable
rabbitmq_management

#cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.14\sbin
#net stop RabbitMQ && net start RabbitMQ

6. 查看用戶:
#rabbitmqctl.bat list_users
7.創(chuàng)建用戶
#rabbitmqctl.bat add_user bocon bocon#EDC
8. 賦予權(quán)限
#rabbitmqctl.bat set_user_tags bocon administrator
9.運(yùn)行結(jié)果

?rabbitmq鏡像集群
1.將192.168.200.1上的C:\Users\Administrator\.erlang.cookie中的內(nèi)容分別替換機(jī)器192.168.200.2,192.168.200.3上的C:\Windows\System32\config\systemprofile文件(三臺(tái)機(jī)器必須具有相同的cookie,如果不相同的話,無法搭建集群)
2. 在機(jī)器192.168.200.1,192.168.200.2,192.168.200.3上進(jìn)行重啟
#net stop RabbitMQ && net start RabbitMQ
在機(jī)器192.168.200.1,192.168.200.2,192.168.200.3操作:
a): 查看節(jié)點(diǎn)名稱,例如在192.168.200.1機(jī)器上:
#rabbitmqctl status

b): 分別在192.168.200.1,192.168.200.2,192.168.200.3機(jī)器上的C:\Users\Administrator\AppData\Roaming\RabbitMQ (AppData默認(rèn)隱藏,需要設(shè)置顯示隱藏文件)下,創(chuàng)建并編輯rabbitmq.config文件,編輯內(nèi)容如下(包括最后的 .):
[{rabbit,[{cluster_nodes, ['rabbit@USER-20190308IA','rabbit@lenovo-PC',…}]}].
c):編輯機(jī)器192.168.200.1,192.168.200.2,192.168.200.3上的hosts文件如下:
192.168.200.1 rabbit@USER-20190308IA
192.168.200.2 rabbit@lenovo-PC
192.168.200.3 rabbit@USER20190307IA
d): 配置環(huán)境變量文件,分別在192.168.200.1,192.168.200.2,192.168.200.3機(jī)器上的C:\Users\Administrator\AppData\Roaming\RabbitMQ 路徑下,創(chuàng)建并編輯rabbitmq-env.con文件,
在機(jī)器192.168.200.1編輯內(nèi)容為:
NODENAME=rabbit@USER-20190308IA
NODE_IP_ADDRESS=192.168.200.1
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
在機(jī)器192.168.200.2編輯內(nèi)容為:
NODENAME= rabbit@lenovo-PC
NODE_IP_ADDRESS=192.168.200.2
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
在機(jī)器192.168.200.3編輯內(nèi)容為:
NODENAME= USER20190307IA
NODE_IP_ADDRESS=192.168.200.3
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log
1.? 重啟服務(wù)
在機(jī)器192.168.200.1設(shè)置為內(nèi)存節(jié)點(diǎn):
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram USER20190307IA
#rabbitmqctl
start_app
在機(jī)器192.168.200.2設(shè)置為內(nèi)存節(jié)點(diǎn):
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram USER20190307IA
#rabbitmqctl
start_app
在機(jī)器192.168.200.3,192.168.200.4(默認(rèn)為磁盤節(jié)點(diǎn)):
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl
start_app
3.Web頁面查看

設(shè)置隊(duì)列鏡像
#rabbitmqctl set_policy -p
hrsystem ha-all queue"^" '{"ha-mode":"all"}' //意思表示以ha.開頭的queue都會(huì)復(fù)制到各個(gè)節(jié)點(diǎn) ["^"匹配所有]

集群重啟的順序是固定的,并且是相反的。如下所述:
?????? 啟動(dòng)順序:磁盤節(jié)點(diǎn) => 內(nèi)存節(jié)點(diǎn)
?????? 關(guān)閉順序:內(nèi)存節(jié)點(diǎn) => 磁盤節(jié)點(diǎn)
10.4 Haproxy負(fù)載均衡
1. 在192.168.1.1和192.168.1.2節(jié)點(diǎn)上安裝haproxy,解壓內(nèi)容:

2. 修改haproxy目錄下的haproxy配置文件,追加以下內(nèi)容:
#rabbitmq集群web頁面
listenrabbitmq_admin
??? bind 0.0.0.0:8004
??? server node1 192.168.1.177:15672
??? server node2 192.168.1.188:15672
#監(jiān)聽消息發(fā)送端口
listen win_17
??????? bind 0.0.0.0:5671
??????? mode???tcp
??????? #balance source
??????? server rabbit1 192.168.1.177:5672weight 1 check inter 5000 check rise 2 fall 2
??????? server rabbit2 192.168.1.188:5672weight 1 check inter 5000 check rise 2 fall 2
#haproxy監(jiān)控頁面
listen monitor
??? bind 0.0.0.0:1188
??? mode http?????????????????
??? stats refresh 30s
??? option httplog
???????? stats enable
???????? stats uri /
???????? stats refresh 5s
它標(biāo)識(shí)并且定義了后端RabbitMQ的服務(wù)。主要含義如下:
(a)“server <name>”部分:定義HAProxy內(nèi)RabbitMQ服務(wù)的標(biāo)識(shí);
(b)“ip1:5672”部分:標(biāo)識(shí)了后端RabbitMQ的服務(wù)地址;
(c)“check inter <value>”部分:表示每隔多少毫秒檢查RabbitMQ服務(wù)是否可用;
(d)“rise <value>”部分:表示RabbitMQ服務(wù)在發(fā)生故障之后,需要多少次健康檢查才能被再次確認(rèn)可用;
(e)“fall <value>”部分:表示需要經(jīng)歷多少次失敗的健康檢查之后,HAProxy才會(huì)停止使用此RabbitMQ服務(wù)。
3.點(diǎn)擊“run.bat”,啟動(dòng)服務(wù),rabbitmq消息web頁面,訪問http://<ip>:5671

haproxy管理頁面,訪問http://<ip>:1188

10.5 keepalived熱備份(待續(xù))
目前沒有window版開源的雙機(jī)熱部署可以替代,先可以參考一下linux下的安裝部署!!!
[if !supportLists]1.????[endif]在主機(jī)192.168.1.1上步驟如下:
下載keepalived-1.1.15.tar.gz,然后解壓安裝
#tarzxvf keepalived-1.1.15.tar.gz
#cdkeepalived-1.1.15
#./configure
#make
#makeinstall
2,配置keepalived
配置中的state MASTER決定了節(jié)點(diǎn)為主節(jié)點(diǎn)
priority決定了優(yōu)先級(jí),比如在有多個(gè)備用節(jié)點(diǎn)的時(shí)候,主節(jié)點(diǎn)故障后優(yōu)先級(jí)值大的接管。
主節(jié)點(diǎn)的配置如下:
global_defs {
??? router_id NodeA
}
vrrp_instance VI_1 {
??? state MASTER??? #設(shè)置為主服務(wù)器
??? interface eth0? #監(jiān)測網(wǎng)絡(luò)接口
??? virtual_router_id 51? #主、備必須一樣
??? priority 100?? #(主、備機(jī)取不同的優(yōu)先級(jí),主機(jī)值較大,備份機(jī)值較小,值越大優(yōu)先級(jí)越高)
??? advert_int 1?? #VRRP Multicast廣播周期秒數(shù)
??? authentication {
?????? ?? auth_type PASS? #VRRP認(rèn)證方式,主備必須一致
?????? ?? auth_pass 1111?? #(密碼)
??? }
??? virtual_ipaddress {
?????? ??? 192.168.8.100/24? #VRRP HA虛擬地址
??? }???
}
[if !supportLists]2.????[endif]在機(jī)器192.168.1.2重復(fù)機(jī)器192.168.1.1的操作,主節(jié)點(diǎn)的配置如下:
global_defs {
??? router_id NodeB
}
vrrp_instance VI_1 {
??? state BACKUP??? #設(shè)置為主服務(wù)器
??? interface eth0? #監(jiān)測網(wǎng)絡(luò)接口
??? virtual_router_id 51? #主、備必須一樣
?????? ?????? priority 90?? #(主、備機(jī)取不同的優(yōu)先級(jí),主機(jī)值較大,備份機(jī)值較小,值越大優(yōu)先級(jí)越高)
??? advert_int 1?? #VRRP Multicast廣播周期秒數(shù)
??? authentication {
?????? ????????????? auth_type PASS? #VRRP認(rèn)證方式,主備必須一致
????????????? ?????? auth_pass 1111?? #(密碼)
???? }
???? virtual_ipaddress {
?????? ????? 192.168.8.100/24? #VRRP HA虛擬地址
????? }
??}?
啟動(dòng)keepalived:
#keepalived -D -f /usr/local/etc/keepalived/keepalived.conf
查看log消息:
#tail -f /var/log/messages
5.? ? 通過ip a 命令可以看到192.168.8.100/24綁定到了eth0上

6.? ?測試驗(yàn)證,192.168.8.100是對外提供的統(tǒng)一地址。
通過192.168.8.100:5672就可以訪問rabbitmq服務(wù)。