那麼對於Rabbitmq是單點應用來講,若是rabbitmq整個消息mq都會攤掉,全部在mq的消息高可用部分,就顯得尤其重要了,那麼在mq中提供了四種集羣架構方案:html
一、主備模式 (Warren)
二、鏡像模式 (Mirror)
三、遠程模式 (Shovel)
四、多活模式 (Federation)
java
在咱們開發中最直接的模式就是主備模式:主要實現RabbitMQ的高可用集羣,通常在併發和數據量不高的狀況下,這種模型很是的好用且簡單,主備模式也稱爲Warren模式node
也就是一主一備,對於集羣來講至少有兩臺服務器,那麼這兩臺服務器一臺在工做,一臺在閒置,注意,這個的主備和咱們以前的主從是不同的,主從的話是一臺做爲主服務器,一臺做爲從服務器,雖然這兩臺是數據同步,主負責讀寫,而從只負責只讀,而主備是一臺工做一臺閒着,若是一臺服務器宕機了,那麼備服務器切換過來,可能的話,這種對於負載均衡的話一臺只忙着幹活,一臺只閒着,這種的生產中用的也不多,這種會形成咱們資源的一個浪費。linux
鏡像模式:集羣模式很是經典的就是Mirror鏡像模式,保證100%數據不丟失,在實際工做中也是用的最多的,並且實現集羣也很是簡單,通常互聯網大廠都會構建這種鏡像集羣模式,原理主要是在主備的基礎上進行了擴展,集羣中全部的節點設備都是同步的,每個隊列,交換機裏面的配置信息和咱們的數據都是同步的,對於這些鏡像在底層同時進行工做,前面的話採用一個負載均衡器,採用nginx或者haproxy也好,進行負載均衡。nginx
遠程模式:遠程模式能夠實現雙活的一種模式,簡稱Shovel模式,所謂Shovel就是咱們能夠把消息進行不一樣數據中心的複製工做,咱們能夠跨地域的讓兩個MQ集羣互聯,好比說一個集羣,咱們都會放在一個機房裏面,那麼若是北京的機房出現了一些事故停電,或者天然災害,那麼這個集羣都會宕機了,那麼在咱們對數據要求極高的大型應用咱們須要設置多活或者雙活的模式,也就是要搭建多個數據中心,或者多套集羣,那麼這些集羣能夠一個會放在上海,一個放在北京,還有應放在廣州,三個集羣數據都是同步的,中間有任何一個集羣出現了問題,立刻靈活的切換,那麼這三個集羣都是能夠訪問的話,咱們可能會按照距離,或者訪問速度來進行優先選擇哪組集羣,或者數據中心進行訪問,全部多活模式,在銀行開發的時候通常也叫作容災的機制,至少構建兩套集羣放在不一樣的地域,一個有問題了,立馬進行切換,不至於整個系統宕機,這就是多活模式,在多活模式中MQ也提供了相應的實現方式,早期使用的Shovel模式,這個模式是mq自帶的一種模式,主要就是能夠把消息在不一樣的數據中心進行負載分發,主要就是能夠實現跨地域的讓兩個mq集羣進行互聯。
那麼這個shovel模式須要統一的版本,網絡達到一個什麼樣的水平,配置的話也是有些複雜,這種的話目前已經淘汰了,在真正的數據複製的狀況下,會使用多活模式。git
多活模式:這種模式也是實現異地數據複製的主流模式,這種模式是依賴rabbimq的fedrtation插件的模式
自己不是mq自帶的東西,是在mq上進行了擴展,而這種擴展是實現的可靠的AMQP的數據通訊,所以配置起來也比較容易,至關於配置簡單化以後的shovel算法
配置
mq和erlang版本
RabbitMQ使用Erlang開發
Erlang(['ə:læŋ])是一種通用的面向併發的編程語言, Erlang是一個結構化,動態類型編程語言,內建並行計算支持。
使用Erlang來編寫分佈式應用要簡單的多,Erlang運行時環境是一個虛擬機,有點像Java虛擬機,這樣代碼一經編譯,一樣能夠隨處運行。
下載地址:https://www.rabbitmq.com/download.html
直接下載最新的rabbitmq到本地編程
rabbitmq還須要依賴erlang的運行環境
https://www.erlang-solutions.com/resources/download.html
選擇centos,找到22.2.5最新的版本下載到本地vim
[root@m2 mq-soft]# ls esl-erlang_22.2.8-1~centos~7_amd64.rpm rabbitmq-server-3.8.3-1.el7.noarch.rpm
關閉防火牆:centos
#systemctl stop firewalld #systemctl disable firewalld
關閉selinux:
#sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 #setenforce 0 # 臨時
2檯安裝好Rabbitmq的Centos環境,啓動的時候使用後臺啓動
後臺啓動mq命令:rabbitmq-server -detached
這裏我是提早部署好的MQ,若是想知道怎麼部署MQ能夠看上一篇文章
修改hostnamectl set-hostname m1/m2
加入主機列表 vim /etc/hosts
[root@localhost ~]# more /etc/hosts 192.168.30.27 m1 192.168.30.29 m2
mq對主機名很是的敏感,即便使用hostnamectl set-hostname m1主機名以後不重啓的話也是形成集羣的不通訊的問題
reboot重啓
2、複製.erlang.cookie
.erlang.cookie是erlang分佈式的token文件,集羣內全部設備要
持有相同的.erlang.cookie文件才容許彼此通訊。
也就是至關於你有學生證它也有學生證,大家就是學生,那麼就能夠一塊兒上學,也就是一個token文件
找到這個.cookie結尾的文件,裏面看到的是一個字符串,也就是兩個主機須要持有相同的erlang的cookie文件才能進行彼此通訊
[root@m1 ~]# find / -name *.cookie /var/lib/rabbitmq/.erlang.cookie [root@m1 ~]# more /var/lib/rabbitmq/.erlang.cookie ZCSNJQYQPNPPLIYWOVBJ
進行拷貝,將cookie文件拷貝過去
m1 # scp /var/lib/rabbitmq/.erlang.cookie root@192.168.30.24:/var/lib/rabbitmq/ root@192.168.30.24's password:
在兩臺電腦上執行chmod進行受權,400對擁有者才能讀取
m1 chmod 400 /var/lib/rabbitmq/.erlang.cookie m2 chmod 400 /var/lib/rabbitmq/.erlang.cookie
3、配置鏡像集羣
在m2服務器上執行下面的命令將與m1服務器進行復制
– rabbitmqctl stop_app 暫停服務
– rabbitmqctl join_cluster rabbit@m1 加入到m1的集羣
– rabbitmqctl start_app 啓動服務
– rabbitmqctl cluster_status 驗證集羣結果
終止與啓動應用
rabbitmqctl start_app 啓動應用
rabbitmqctl stop_app 終止應用
在mq2上操做
[root@m2 ~]# rabbitmqctl stop_app Stopping rabbit application on node rabbit@m2 ... [root@m2 ~]# rabbitmqctl join_cluster rabbit@m1 Clustering node rabbit@m2 with rabbit@m1 [root@m2 ~]# rabbitmqctl start_app Starting node rabbit@m2 ... [root@m2 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@m2 ... Basics Cluster name: rabbit@m1 Disk Nodes rabbit@m1 rabbit@m2 Running Nodes rabbit@m1 rabbit@m2 Versions rabbit@m1: RabbitMQ 3.8.3 on Erlang 22.2.8 rabbit@m2: RabbitMQ 3.8.3 on Erlang 22.2.8
查看已經註冊進來,通常生產中的話,要不就是禁用這個guest用戶,要不就是跟它修改一個比較複雜的密碼
建立test查看m2也會同步進來
通常在程序中咱們須要鏈接一個IP地址,那麼這個地方就須要這麼一個負載均衡去實現,這裏咱們使用HAproxy去實現
4、鏡像模式遇到的問題
當配好兩個mq的時候,對於客戶端也就是java當咱們去鏈接的時候就須要一個統一的入口來進行系統或者消息直接的調用,也就是須要鏈接哪臺服務器進行數據的處理,若是是這種狀況的話,當m1掛的話,咱們就須要手動的去修改Java客戶端的地址了,另外還有有一個問題就是m1猛幹活,m2閒着沒事作,而對咱們的資源利用也是不合理的,那麼負載均衡器就應運而生了。
而當有haproxy的時候它會將這個請求進行具體的轉發到m1或者m2上進行分工,好比安裝簡單的算法輪詢模式,將任務進行均攤,這樣資源就會被合理的利用了,對於Java客戶端直接能夠配置proxy的地址了,而haproxy能夠經過心跳的感知哪些服務器是能夠發送消息的,好比遇到m2的機器宕機了,它就會自動的將咱們的服務退出,來使用其餘的節點也進行提供服務
HAProxy 代理服務器
HAProxy 是一款提供高可用性、負載均衡以及基於TCP(第四層)
和HTTP(第七層)應用的代理軟件,支持虛擬主機,它是免費、
快速而且可靠的一種解決方案。
RabbitMQ集羣鏡像模式中,HAProxy用於作Tcp,提供節點負載
均衡(LB-LoadBalance)與故障發現。
安裝haproxyyum -y install haproxy
配置文件的地址
[root@haproxy ~]# find / -name haproxy.cfg /etc/haproxy/haproxy.cfg
編譯配置文件
#--------------------------------------------------------------------- #common defaults that all the 'listen' and 'backend' sections will #use if not designated in their block #--------------------------------------------------------------------- 下面的不要了,而後配置如下內容 #對MQ集羣進行監聽
對MQ的集羣的監聽HAproxy配置地址我放在了倉庫中,有須要的須要將公鑰發給我
git clone git@gitee.com:zhaocheng172/rabbitmq-haproxy.git
生效配置文件[root@haproxy ~]# haproxy -f /etc/haproxy/haproxy.cfg
鏈接haproxy訪問地址是上面設置的鏈接密碼rabbitmq,這裏在配置文件中去登陸的密碼,和url地址
登陸進來能夠看到咱們的MQ進行監控到了,若是使用JAVA發送系統調用的消息以後那麼就會進行消息的提供與消費。