首先先安裝rabbitmq,然後在繼續往下看
文章標題:《rabbitmq單機安裝小記》
文章地址:http://www.bbtang.info/591.html
還需要修改host檔案 1 127.0.0.1 rabbitmq1 localhost.localdomain localhost4 localhost4.localdomain4 2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 3 192.168.1.254 rabbitmq1 4 192.168.1.22 rabbitmq2
每台機子除了自己的127.0.0.1的host不同外,下邊的都相同.
PS:我們使用rabbitmq1做主服務,rabbitmq2做節點服務
同時自己的機器的主機名稱務必要給成和你的這個是一樣的,不然機器重啟後,不是這個主機名稱,加入到叢集中會出現問題的.
可以通過修改vim /etc/sysconfig/network中的HOSTNAME選項來修改,同時hostname rabbitmq1 也是可以臨時修改的.
注意要在安裝完成的時候啟動rabbitmq哦~ 1 ./rabbitmq-server start
說明
Rabbitmq的叢集是依附於erlang的叢集來工作的,所以必須先構建起erlang的叢集景象。Erlang的叢集中各節點是經由過程一個magic cookie來實現的,這個cookie存放在 $home/.erlang.cookie 中(像我的root使用者安裝的就是放在我的root/.erlang.cookie中),檔案是400的許可權。所以必須包管各節點cookie對峙一致,不然節點之間就無法通訊。 複製cookie內容
開啟檔案然後需要先把其中的一台伺服器的.erlang.cookie中的內容複寫到別的機器上,最好是複製內容,因為檔案許可權不對的話會出現問題,在最後退出儲存的時候使用wq!用!來進行強制儲存即可. 普通叢集
對於Queue來說,訊息實體只存在於其中一個節點,A、B兩個節點僅有相同的中繼資料,即隊列結構。
當訊息進入A節點的Queue中後,consumer從B節點拉取時,RabbitMQ會臨時在A、B間進行訊息傳輸,把A中的訊息實體取出並經過B發送給consumer。
所以consumer應盡量串連每一個節點,從中取訊息。即對於同一個邏輯隊列,要在多個節點建立物理Queue。否則無論consumer連A或B,出口總在A,會產生瓶頸。
該模式存在一個問題就是當A節點故障後,B節點無法取到A節點中還未消費的訊息實體。
如果做了訊息持久化,那麼得等A節點恢複,然後才可被消費;如果沒有持久化的話,然後就沒有然後了……
叢集配置
主服務配置指令碼 1 ./rabbitmqctl stop_app 2 ./rabbitmqctl reset 3 ./rabbitmqctl start_app
這個是用來在rabbitmq1上執行的,這個也可以不執行,直接在節點伺服器執行下邊的指令碼,不過得保證這個rabbitmq服務是正常啟動的.
節點服務配置指令碼 1 ./rabbitmqctl stop_app 2 ./rabbitmqctl reset 3 ./rabbitmqctl join_cluster --ram rabbit@rabbitmq1 4 ./rabbitmqctl start_app
和主服務配置指令碼的唯一區別是多了第三行的內容,其中–ram指的是作為記憶體節點,要是想做為磁碟節點的話,就不用加–ram這個參數了,把第3行寫成這樣就好了 1 ./rabbitmqctl join_cluster --ram rabbit@rabbitmq1
PS:只要在節點列表裡包含了本身,它就成為一個磁碟節點。在RabbitMQ叢集裡,必須至少有一個磁碟節點存在。
現在先執行主節點上的指令碼,等待執行完成之後再執行服務節點的指令碼,順序不要錯了哦~
執行完之後分別在每台機器上查看節點狀態 1 ./rabbitmqctl cluster_status
你會分別看到如下的內容
rabbitmq1查看的叢集狀態結果 1 [root@rabbitmq1 sbin]# ./rabbitmqctl cluster_status 2 Cluster status of node rabbit@rabbitmq1 ... 3 [{nodes,[{disc,[rabbit@rabbitmq1]},{ram,[rabbit@rabbitmq2]}]}, 4 {running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq1]}, 5 {partitions,[]}] 6 ...done.
rabbitmq2查看的叢集狀態結果 1 [root@rabbitmq2 sbin]# ./rabbitmqctl cluster_status 2 Cluster status of node rabbit@rabbitmq2 ... 3 [{nodes,[{disc,[rabbit@rabbitmq1]},{ram,[rabbit@rabbitmq2]}]}, 4 {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2]}, 5 {partitions,[]}] 6 ...done.
兩台機器的內容幾乎是一樣的,這樣的話你的叢集就建立成功了.
普通的叢集模式已經建立完成了.
鏡像隊列
上述配置的RabbitMQ預設叢集模式,但並不包管隊列的高可用性,儘管互換機、綁定這些可以複製到叢集裡的任何一個節點,然則隊列內容不會複製,固然該模式解決一項目組節點壓力,但隊列節點宕機直接導致該隊列無法應用,只能守候重啟,所以要想在隊列節點宕機或故障也能正常應用,就要複製隊列內容到叢集裡的每個節點,須要建立鏡像隊列。
鏡像隊列是基於普通的叢集模式的,所以你還是得先配置普通叢集,然後才能設定鏡像隊列.
我是通過網頁的管理端來設定的鏡像隊列,也可以通過命令,官方有例子. http://www.rabbitmq.com/ha.html 開啟之後翻到最下邊有兩個例子,可以參考看看,這裡只說其中的網頁設定的 1 >1.點擊admin菜單-->右側的Policies選項-->左側最下下邊的Add / update a policy 2 3 >2.按照圖中的內容根據自己的需求填寫 4 5 >3.點擊Add policy添加策略
此時你就會來你的兩台rabbitmq伺服器的網頁管理端amind菜單下看見剛才建立的隊列了.
下面我們來添加一個queues隊列來看看效果,這裡只是測試結果,其它的先不填寫
注意紅框中的 x-ha-policy = all 這個,網上說沒有這個不會進行複製,但是我測試的時候好像可以複製的,至少queues隊列是可以的,先添上吧.
在這裡邊添加的時候你是可以指定Node選項也就是把這個queues放在哪個node節點上,不過做鏡像的時候就沒有必要了,呵呵
添加完成後你會看到這個效果
簡要說明一下
aa這個是剛才添加的 Arguments 參數指定了 x-ha-policy = all
ab這個是沒有指定Arguments參數的,這個可以看出差距的
ba和bb是為了做示範效果對比的,這兩個是沒有符合約步策略的,所以Node後邊沒有+1的標識,你把滑鼠放在+1的標識上就能看到他在另一台機器上也有一個.
Q:你說要是我重啟rabbitmq2的話會出現什麼效果….
A:aa和ab的+1標識消失,啟動後重新恢複.
Q:要是重啟rabbitmq1的話出現什麼效果….
A:在rabbitmq2上aa和ab的+1標識消失且Node選項中的rabbit@rabbitmq1變成rabbit@rabbitmq2,同時ba和bb消失,重啟後依舊消失,哈哈,因為這兩個沒做鏡像哦~
這裡的鏡像隊列的叢集介紹就到這裡,要想做到高可用,需要HA軟體的配合哦~ 這裡先不做贅述,下篇文章再說吧….
報錯處理
要是錯誤資訊中提示有主節點衝突的話,可以進入到一下目錄修改相應的檔案 1 cd /usr/local/rabbitmq_server-3.1.3/var/lib/rabbitmq/mnesia 2 vim rabbit\@rabbitmq2/cluster_nodes.config
或者直接將這個目錄裡的檔案全都刪除,這個是叢集的設定檔和持久化的資料存放區位置,能改則改實在是迫不得已再刪除