文章出處

  我們知道rabbitmq是一個專業的MQ產品,而且它也是一個嚴格遵守AMQP協議的玩意,但是要想騷,一定需要拿出高可用的東西出來,這不本篇就跟大家說

一下cluster的概念,rabbitmq是erlang寫的一個成品,所以知道如何構建erlang的node集群就ok了,他需要一個統一的cookie機制。。。本篇的測試環境如下:

centos1:192.168.23.147

centos2:192.168.23.145

截圖如下:

 

一:cookie機制

      剛才也說了,要想實現cluster集群,必須保證各臺機器上的cookie文件內容一致,那問題來了。。。cookie在哪呢?從rabbitmq的官網上可以找到這么

一句話,如下圖:

ok,官網說的非常清楚了,那接下來我們看一下$HOME變量指向的是哪里。。。

[root@rabbitmq1 Desktop]# echo $HOME
/root
[root@rabbitmq1 Desktop]# 

 

那接下來我就去看看(Centos1 .147)這臺的/root 文件下可否能夠找到,如下圖:

 

牛逼了吧,嘿嘿,現在我們要做的事情,就是把Centos2的cookie文件內容替換成Centos1的cookie內容。

 

二:使用host映射erlang節點

   現在cookie值是一樣的了,然后需要在/etc/hosts中追加一下host影射,方便erlang節點之間相互發現,接下來就是在2臺centos上追加同樣的host地址:

 

三:rabbitmqctl cluster命令

    好了,準備工作我們都做好了,大家可以重啟一下機器,開啟我們的rabbitmq,這時候會有驚喜發現的。。。

由原來的localhost改成現在的rabbitmq2了,看到了吧~~~ 接下來大家可以把兩臺rabbitmq開啟了。

 

1. 在centos1上使用rabbitmqctl cluster_status看看集群現在的狀況

[root@rabbitmq1 Desktop]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
 {running_nodes,[rabbit@rabbitmq1]},
 {cluster_name,<<"rabbit@rabbitmq1">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq1,[]}]}]
[root@rabbitmq1 Desktop]# 

可以看到,當前的running-nodes中只有一臺,剛好就是本機的erlang節點本身,接下來我們看一下是否能夠連接到rabbit@rabbitmq2上去。。。

 

2. join_cluster命令

    這個命令之前,需要將本機的rabbitmq關閉,然后進行join操作,從下圖中可以看到,我們已經連接到了centos2上的rabbitmq了。。。

[root@rabbitmq1 Desktop]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq1 ...
[root@rabbitmq1 Desktop]#  rabbitmqctl join_cluster rabbit@rabbitmq2
Clustering node rabbit@rabbitmq1 with rabbit@rabbitmq2 ...
[root@rabbitmq1 Desktop]# rabbitmqctl start_app
Starting node rabbit@rabbitmq1 ...
[root@rabbitmq1 Desktop]# 

 

3. 使用webui看一下最后的效果

看到沒有,現在我們的rabbitmq集群已經搭建成功了,如果你有更多的機器,都可以使用這個join命令加入吧,很簡單吧~~~

 

四:mirror queue

    從名字上可以看出,就是鏡像隊列的意思,也就是說queue能在我們多臺機器中同步,設置的方式也能簡單,只需要在webui的policy上面設置即可。。。

這段設置表示當前如果是mytest開頭的隊列都是“鏡像隊列”,當然也可以用代碼來實現,并且實現自動同步的功能,如下:

rabbitmqctl set_policy ha-all "^mytest" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

 

五:使用C#驅動連接

  再好的cluster最后都需要用語言驅動連接,這樣才能真正的落地,我選擇的驅動是官方的,大家可以在nuget上面下載一下:

 

接下來我需要演示向 queue=mytest1隊列中推送數據,亮點在于我在CreateConnection方法中塞入了多個ip地址。。。如下代碼:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ConnectionFactory factory = new ConnectionFactory()
 6             {
 7                 UserName = "datamip",
 8                 Password = "datamip",
 9                 AutomaticRecoveryEnabled = true,
10                 TopologyRecoveryEnabled = true
11             };
12 
13             //第一步:創建connection 
14             var connection = factory.CreateConnection(new string[2] { "192.168.23.147", "192.168.23.145" });
15 
16             //第二步:創建一個channel
17             var channel = connection.CreateModel();
18 
19             var result = channel.QueueDeclare("mytest1", true, false, false, null);
20 
21             for (int i = 0; i < int.MaxValue; i++)
22             {
23                 channel.BasicPublish(string.Empty, "mytest1", null, new byte[10]);
24 
25                 Console.WriteLine("{0} 推送成功", i);
26                 Thread.Sleep(1000);
27             }
28 
29             Console.Read();
30         }
31     }

 

 

最后我們看一下webui,可以清清楚楚的看到消息已經進入了rabbitmq集群啦。。。

好了,本篇就說這么多了,希望對您有幫助~~~

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()