?Rabbitmq集群總體架構(gòu)
操作系統(tǒng):window 10
機器Ha-1(keepalived1):192.168.1.1
機器Ha-2(keepalived2):192.168.1.2
機器MQ node1 :192.168.200.1? (內(nèi)存節(jié)點)
機器MQ node2 :192.168.200.2? (內(nèi)存節(jié)點)
機器MQ node3 :192.168.200.3? (磁盤節(jié)點)
4 Rabbitmq集群模式
4.1 普通模式
默認的集群模式芳肌。對于Queue來說,消息實體只存在于其中一個節(jié)點兑障,A非洲、B兩個節(jié)點僅有相同的元數(shù)據(jù),即隊列結(jié)構(gòu)。當消息進入A節(jié)點的Queue中后拐纱,consumer從B節(jié)點拉取時,RabbitMQ會臨時在A地来、B間進行消息傳輸戳玫,把A中的消息實體取出并經(jīng)過B發(fā)送給consumer。所以未斑,consumer應盡量連接每一個節(jié)點咕宿,從中取消息。即對于同一個邏輯隊列蜡秽,要在多個節(jié)點建立物理Queue府阀。否則無論consumer連A或B,出口總在A芽突,會產(chǎn)生瓶頸试浙。該模式存在一個問題就是當A節(jié)點故障后,B節(jié)點無法取到A節(jié)點中還未消費的消息實體寞蚌。如果做了消息持久化田巴,那么得等A節(jié)點恢復,然后才可被消費挟秤;如果沒有持久化的話壹哺,消息會丟失。
4.2 鏡像模式
該模式解決了上述問題艘刚,其實它和普通模式不同之處在于管宵,消息實體會主動在鏡像節(jié)點間同步,而不是在consumer取數(shù)據(jù)時臨時拉取。 該模式帶來的副作用也很明顯箩朴,除了降低系統(tǒng)性能外岗喉,如果鏡像隊列數(shù)量過多,加之大量的消息進入炸庞,集群內(nèi)部的網(wǎng)絡(luò)帶寬將會被這種同步通訊大大消耗掉钱床。所以在對可靠性要求較高的場合中適用。
5 Rabbitmq集群的基本概念
集群中有兩種節(jié)點:
內(nèi)存節(jié)點:只保存狀態(tài)到內(nèi)存(一個例外的情況是:持久的queue的持久內(nèi)容將被保存到disk)
磁盤節(jié)點:保存狀態(tài)到內(nèi)存和磁盤
顧名思義內(nèi)存節(jié)點就是將所有數(shù)據(jù)放在內(nèi)存燕雁,磁盤節(jié)點將數(shù)據(jù)放在磁盤诞丽。不過,如果在投遞消息時拐格,打開了消息的持久化僧免,那即使是內(nèi)存節(jié)點,數(shù)據(jù)還是安全的放在磁盤捏浊。
一個RabbitMQ集群中可以共享user懂衩、vhost、queue金踪、exchange等浊洞,所有的數(shù)據(jù)和狀態(tài)都是必須在所有節(jié)點上復制的,一個例外是那些當前只屬于創(chuàng)建它的節(jié)點的消息隊列胡岔,盡管它們可見且可被所有節(jié)點讀取法希。RabbitMQ節(jié)點可以動態(tài)地加入到集群中,一個節(jié)點它可以加入到集群中靶瘸,也可以從集群環(huán)集群進行一個基本的負載均衡苫亦。
6 Haproxy(反向代理)
Haproxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代理怨咪,支持虛擬主機屋剑,它是免費、快速并且可靠的一種解決方案诗眨。Haproxy特別適用于那些負載特大的web站點唉匾,這些站點通常又需要會保持或七層處理。Haproxy運行在當前的硬件上匠楚,完全可以支持數(shù)以萬計的并發(fā)連接巍膘。并且它的運行模式使得它可以很簡單安全的整合進您當前的架構(gòu)中,同時可以保護你的web服務器不被暴露到網(wǎng)絡(luò)上芋簿。
HAProxy的優(yōu)點:
1峡懈、HAProxy是支持虛擬主機的,可以工作在4益咬、7層(支持多網(wǎng)段);
2、能夠補充Nginx的一些缺點比如Session的保持幽告,Cookie的引導等工作梅鹦;
3、支持url檢測后端的服務器冗锁;
4齐唆、它跟LVS一樣,本身僅僅就只是一款負載均衡軟件冻河;單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度箍邮,在并發(fā)處理上也是優(yōu)于Nginx的;
5叨叙、HAProxy可以對Mysql讀進行負載均衡锭弊,對后端的MySQL節(jié)點進行檢測和負載均衡,不過在后端的MySQL slaves數(shù)量超過10臺時性能不如LVS擂错;
6味滞、HAProxy的算法較多,達到8種钮呀;
HAProxy的缺點:
1. 不支持POP/SMTP協(xié)議
2. 不支持SPDY協(xié)議
3. 不支持HTTP cache功能〗0埃現(xiàn)在不少開源的lb項目,都或多或少具備HTTP cache功能爽醋。
4. 重載配置的功能需要重啟進程蚁署,雖然也是soft restart,但沒有Nginx的reaload更為平滑和友好蚂四。
5. 多進程模式支持不夠好
?7.?Keepalived(熱備份)
7.1 KeepAlived主要有兩個功能:
(1).能夠?qū)ealServer進行健康狀況檢查光戈,支持4層、5層和7層協(xié)議進行健康檢查证杭;
(2).對負載均衡調(diào)度器實現(xiàn)高可用田度,防止Director單點故障。
?7.2 KeepAlived工作過程:
? ? ?keepalived實現(xiàn)故障轉(zhuǎn)移的功能是通過VRRP(virtual router redundancy protocol虛擬路由器冗余協(xié)議)協(xié)議來實現(xiàn)的解愤。 在keepalived正常工作的時候镇饺,主節(jié)點(master)會不斷的發(fā)送心跳信息給備節(jié)點(backup),當備節(jié)點不能在一定時間內(nèi)收到主節(jié)點的心跳信息時送讲,備節(jié)點會認為主節(jié)點宕了奸笤,然后會接管主節(jié)點上的資源,并繼續(xù)向外提供服務保證其可用性哼鬓。當主節(jié)點恢復的時候监右,備節(jié)點會自動讓出資源并再次自動成為備節(jié)點。
10 架構(gòu)部署
10.1安裝環(huá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單機部署
安裝前檢查防火墻是否關(guān)閉异希,安裝rabbitmq需要關(guān)閉防火墻=『小!!
分別在192.168.200.1扣癣,192.168.200.2惰帽,192.168.200.3節(jié)點上安裝rabbitmq server。
安裝步驟:
1.安裝jdk以及配置Java運行環(huán)境
2.安裝erlang軟件父虑,一直默認下一步该酗,安裝完畢后配置erlang環(huán)境變量
3. 安裝rabbitmq,默認下一步
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.運行結(jié)果
?rabbitmq鏡像集群
1.將192.168.200.1上的C:\Users\Administrator\.erlang.cookie中的內(nèi)容分別替換機器192.168.200.2,192.168.200.3上的C:\Windows\System32\config\systemprofile文件(三臺機器必須具有相同的cookie爵嗅,如果不相同的話,無法搭建集群)
2. 在機器192.168.200.1膳殷,192.168.200.2,192.168.200.3上進行重啟
#net stop RabbitMQ && net start RabbitMQ
在機器192.168.200.1操骡,192.168.200.2,192.168.200.3操作:
a): 查看節(jié)點名稱,例如在192.168.200.1機器上:
#rabbitmqctl status
b): 分別在192.168.200.1赚窃,192.168.200.2,192.168.200.3機器上的C:\Users\Administrator\AppData\Roaming\RabbitMQ (AppData默認隱藏册招,需要設(shè)置顯示隱藏文件)下,創(chuàng)建并編輯rabbitmq.config文件勒极,編輯內(nèi)容如下(包括最后的 .):
[{rabbit,[{cluster_nodes, ['rabbit@USER-20190308IA','rabbit@lenovo-PC',…}]}].
c):編輯機器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機器上的C:\Users\Administrator\AppData\Roaming\RabbitMQ 路徑下键痛,創(chuàng)建并編輯rabbitmq-env.con文件,
在機器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
在機器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
在機器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.? 重啟服務
在機器192.168.200.1設(shè)置為內(nèi)存節(jié)點:
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram USER20190307IA
#rabbitmqctl
start_app
在機器192.168.200.2設(shè)置為內(nèi)存節(jié)點:
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram USER20190307IA
#rabbitmqctl
start_app
在機器192.168.200.3,192.168.200.4(默認為磁盤節(jié)點):
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl
start_app
3.Web頁面查看
設(shè)置隊列鏡像
#rabbitmqctl set_policy -p
hrsystem ha-all queue"^" '{"ha-mode":"all"}' //意思表示以ha.開頭的queue都會復制到各個節(jié)點 ["^"匹配所有]
集群重啟的順序是固定的匾七,并且是相反的絮短。如下所述:
?????? 啟動順序:磁盤節(jié)點 => 內(nèi)存節(jié)點
?????? 關(guān)閉順序:內(nèi)存節(jié)點 => 磁盤節(jié)點
10.4 Haproxy負載均衡
1. 在192.168.1.1和192.168.1.2節(jié)點上安裝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
它標識并且定義了后端RabbitMQ的服務丁频。主要含義如下:
(a)“server <name>”部分:定義HAProxy內(nèi)RabbitMQ服務的標識;
(b)“ip1:5672”部分:標識了后端RabbitMQ的服務地址邑贴;
(c)“check inter <value>”部分:表示每隔多少毫秒檢查RabbitMQ服務是否可用席里;
(d)“rise <value>”部分:表示RabbitMQ服務在發(fā)生故障之后,需要多少次健康檢查才能被再次確認可用拢驾;
(e)“fall <value>”部分:表示需要經(jīng)歷多少次失敗的健康檢查之后奖磁,HAProxy才會停止使用此RabbitMQ服務。
3.點擊“run.bat”,啟動服務繁疤,rabbitmq消息web頁面咖为,訪問http://<ip>:5671
haproxy管理頁面秕狰,訪問http://<ip>:1188
10.5 keepalived熱備份(待續(xù))
目前沒有window版開源的雙機熱部署可以替代,先可以參考一下linux下的安裝部署!!!
[if !supportLists]1.????[endif]在主機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é)點為主節(jié)點
priority決定了優(yōu)先級封恰,比如在有多個備用節(jié)點的時候,主節(jié)點故障后優(yōu)先級值大的接管褐啡。
主節(jié)點的配置如下:
global_defs {
??? router_id NodeA
}
vrrp_instance VI_1 {
??? state MASTER??? #設(shè)置為主服務器
??? interface eth0? #監(jiān)測網(wǎng)絡(luò)接口
??? virtual_router_id 51? #主、備必須一樣
??? priority 100?? #(主鳖昌、備機取不同的優(yōu)先級备畦,主機值較大,備份機值較小,值越大優(yōu)先級越高)
??? advert_int 1?? #VRRP Multicast廣播周期秒數(shù)
??? authentication {
?????? ?? auth_type PASS? #VRRP認證方式许昨,主備必須一致
?????? ?? auth_pass 1111?? #(密碼)
??? }
??? virtual_ipaddress {
?????? ??? 192.168.8.100/24? #VRRP HA虛擬地址
??? }???
}
[if !supportLists]2.????[endif]在機器192.168.1.2重復機器192.168.1.1的操作懂盐,主節(jié)點的配置如下:
global_defs {
??? router_id NodeB
}
vrrp_instance VI_1 {
??? state BACKUP??? #設(shè)置為主服務器
??? interface eth0? #監(jiān)測網(wǎng)絡(luò)接口
??? virtual_router_id 51? #主、備必須一樣
?????? ?????? priority 90?? #(主糕档、備機取不同的優(yōu)先級莉恼,主機值較大,備份機值較小,值越大優(yōu)先級越高)
??? advert_int 1?? #VRRP Multicast廣播周期秒數(shù)
??? authentication {
?????? ????????????? auth_type PASS? #VRRP認證方式速那,主備必須一致
????????????? ?????? auth_pass 1111?? #(密碼)
???? }
???? virtual_ipaddress {
?????? ????? 192.168.8.100/24? #VRRP HA虛擬地址
????? }
??}?
啟動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.? ?測試驗證俐银,192.168.8.100是對外提供的統(tǒng)一地址。
通過192.168.8.100:5672就可以訪問rabbitmq服務端仰。