序言
清風萬裡的季節,周末本該和親人朋友一起消遣這爛漫的花花草草,或是懶洋洋的曬個太陽聽聽風聲鳥鳴。無奈工作使然,理想使然,我回到啦公司,敲起啦鍵盤,撸起啦代碼,程式狗的世界一片黯然,一片黯然,願天下所有努力的程式狗都夢想成真吧!!
回到正題,為什麼搭建rabbitmq叢集?rabbitmq叢集有那些模式?如何搭建Rabbitmq叢集?rabbitmq鏡像高可用政策有那些?
1、首先這款産品本身的優點衆多,大家最看好的便是他的異步化提高系統抗峰值能力,然後便是系統及功能結構解耦,那麼照此兩點來說,他的在整個系統中的作用還是至關重要的,那麼如此重要,當然要考慮他的高可用性,那麼便有啦第一個問題的解答。
2、rabbitmq有3種模式,但叢集模式是2種。詳細如下:
- 單一模式:即單機情況不做叢集,就單獨運作一個rabbitmq而已。
- 普通模式:預設模式,以兩個節點(rabbit01、rabbit02)為例來進行說明。對于Queue來說,消息實體隻存在于其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的中繼資料,即隊列的結構。當消息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行消息傳輸,把A中的消息實體取出并經過B發送給consumer。是以consumer應盡量連接配接每一個節點,從中取消息。即對于同一個邏輯隊列,要在多個節點建立實體Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會産生瓶頸。當rabbit01節點故障後,rabbit02節點無法取到rabbit01節點中還未消費的消息實體。如果做了消息持久化,那麼得等rabbit01節點恢複,然後才可被消費;如果沒有持久化的話,就會産生消息丢失的現象。
- 鏡像模式:把需要的隊列做成鏡像隊列,存在與多個節點屬于RabbitMQ的HA方案。該模式解決了普通模式中的問題,其實質和普通模式不同之處在于,消息實體會主動在鏡像節點間同步,而不是在用戶端取資料時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,叢集内部的網絡帶寬将會被這種同步通訊大大消耗掉。是以在對可靠性要求較高的場合中适用。
準備叢集環境安裝RabbitMQ
我的環境如下:
1、兩台Centos7的機器,hostname分别為:F , G .
2、IP位址分别為:F—172.18.8.229 , G—172.18.8.224。
3、修改hosts檔案如下,下面是G這台機器的hosts檔案内容,F也需要如下配置:
[root@G bin]# cat /etc/hosts
127.0.0.1 G localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 G localhost localhost.localdomain localhost6 localhost6.localdomain6
172.18.8.224 G
172.18.8.229 F
4、保證兩台機器都能夠互相ping通,如下圖:
好啦,環境到此就就能滿足啦,接下來我們把rabbitmq裝在2台機器上。
學習不看官方文檔,那就别學啦,位址如下:http://www.rabbitmq.com/install-rpm.html
安裝rabbitmq依賴erlang環境,是以我們要先安裝erlang環境。
安裝完成之後,下載下傳rabbitmq的rpm包ivh即可。如果實在不會安裝,Linux系統(二)軟體的安裝與解除安裝 裡面有安裝rabbitmq的執行個體,看官笑納,實在不會裝那加入左上方群,或者點選網頁右上方的X吧,一定要相信不是你的錯,是你與rabbitmq緣分不到。
安裝啟動過程中如果出現error,那可參考下面幾個方案試試:
- vim /etc/rabbitmq/enable_plugins :删除檔案中的内容。
- 檢視hosts檔案是否配置完善,互相是否可以ping通
- 檢視相關端口是否被占用,如若占用kill掉
- 如果已經叢集,那麼要檢視所有叢集中的/var/lib/rabbitmq/.erlang.cookie是否一緻。
- 如果不存在上述檔案,echo $HOME ,打開此檔案夾,檢視cookie檔案是否一緻。
- 重新開機電腦,防止緩存資料配置未更新過來。
這裡安裝啟動成功之後,來幾個常用的操作。
[root@G bin]# ./rabbitmq-server -deched --背景啟動服務
[root@G bin]# ./rabbitmqctl start_app --啟動服務
[root@G bin]# ./rabbitmqctl stop_app --關閉服務
[root@G bin]# ./rabbitmq-plugins enable rabbitmq_management --啟動web管理插件
[root@G bin]# ./rabbitmqctl add_user zlh zlh --添加使用者,密碼
[root@G bin]# ./rabbitmqctl set_user_tags zlh administrator --設定zlh為administrator權限
如果你看到如下操作,即表明啟動成功啦,并且web管理頁面的插件也啟動成功,如果下面的6為0,則需要啟動web管理插件
那具體rabbitmqctl 的指令詳細還要看官網文檔:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html
搭建rabbitmq的一般模式叢集
在上述的兩台機器上安裝rabbitmq完成之後,你可以看到你的機器中有如下1個檔案。路徑在$HOME中或者在/var/lib/rabbitmq中,檔案名稱為.erlang.cookie,他是一個隐藏檔案。那麼這檔案存儲的内容是什麼,是做什麼用的呢?
這樣說吧:RabbitMQ的叢集是依賴erlang叢集,而erlang叢集是通過這個cookie進行通信認證的,是以我們做叢集的第一步就是幹cookie。怎麼幹?
1、必須使叢集中也就是F,G這兩台機器的.erlang.cookie檔案中cookie值一緻,且權限為owner隻讀。
機器G中的Cookie:
機器F中的Cookie:
修改檔案權限如下:
[root@F ~]# chmod 600 .erlang.cookie
2、檢視叢集狀态,我的是已經做好的。
[root@F bin]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@F ...
[{nodes,[{disc,[rabbit@G]},{ram,[rabbit@F]}]},
{running_nodes,[rabbit@G,rabbit@F]},
{cluster_name,<<"rabbit@F">>},
{partitions,[]},
{alarms,[{rabbit@G,[]},{rabbit@F,[]}]}]
3、停止目前機器中rabbitmq的服務
[root@F bin]# ./rabbitmqctl stop_app
4、把G中的rabbitmq加入到叢集中來
[root@F bin]# ./rabbitmqctl join_cluster --ram rabbit@G
5、開啟目前機器的rabbitmq服務
[root@F bin]# ./rabbitmqctl start_app
6、打開網頁管理頁面檢視nodes
如此便可以啦,你可以做下測試,驗證下我們序言中說的普通模式的說明,那必須是杠杠對的。
搭建rabbitmq的鏡像高可用模式叢集
寫到這裡,接下來,有朋友要請我吃飯啦,我就速戰速決赴會去啦,即便如此該有的也會都有的。go,go,go。
這一節要參考的文檔是:http://www.rabbitmq.com/ha.html
首先鏡像模式要依賴policy子產品,這個子產品是做什麼用的呢?
policy中文來說是政策,政策的意思,那麼他就是要設定,那些Exchanges或者queue的資料需要複制,同步,如何複制同步?對就是做這些的。
這裡有點内容的,我先上例子慢慢說:
[root@G ~]# ./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
參數意思為:
ha-all:為政策名稱。
^:為比對符,隻有一個^代表比對所有,^zlh為比對名稱為zlh的exchanges或者queue。
ha-mode:為比對類型,他分為3種模式:all-所有(所有的queue),exctly-部分(需配置ha-params參數,此參數為int類型比如3,衆多叢集中的随機3台機器),nodes-指定(需配置ha-params參數,此參數為數組類型比如["3rabbit@F","rabbit@G"]這樣指定為F與G這2台機器。)。
參考示例如下
當然在web管理界面也能配置:
配置完看隊列如下,其中表示ha-haall的說明用我的ha-haall政策啦,屬于鏡像模式,沒有表示的就是普通模式:
總結
接下來是大家最喜歡的總結内容啦,内容有二,如下:
1、希望能關注我其他的文章。
2、部落格裡面有沒有很清楚的說明白,或者你有更好的方式,那麼歡迎加入左上方的2個交流群,我們一起學習探讨。