咱們知道rabbitmq是一個專業的MQ產品,並且它也是一個嚴格遵照AMQP協議的玩意,可是要想騷,必定須要拿出高可用的東西出來,這不本篇就跟你們說node
一下cluster的概念,rabbitmq是erlang寫的一個成品,因此知道如何構建erlang的node集羣就ok了,他須要一個統一的cookie機制。。。本篇的測試環境以下:web
centos1:192.168.23.147centos
centos2:192.168.23.145cookie
截圖以下:app
一:cookie機制測試
剛纔也說了,要想實現cluster集羣,必須保證各臺機器上的cookie文件內容一致,那問題來了。。。cookie在哪呢?從rabbitmq的官網上能夠找到這麼ui
一句話,以下圖:spa
ok,官網說的很是清楚了,那接下來咱們看一下$HOME變量指向的是哪裏。。。code
[root@rabbitmq1 Desktop]# echo $HOME /root [root@rabbitmq1 Desktop]#
那接下來我就去看看(Centos1 .147)這臺的/root 文件下能否可以找到,以下圖:blog
牛逼了吧,嘿嘿,如今咱們要作的事情,就是把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集羣啦。。。
好了,本篇就說這麼多了,但願對您有幫助~~~