搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接
我們知道rabbitmq是一個(gè)專業(yè)的MQ產(chǎn)品,而且它也是一個(gè)嚴(yán)格遵守AMQP協(xié)議的玩意,但是要想騷,一定需要拿出高可用的東西出來,這不本篇就跟大家說
一下cluster的概念,rabbitmq是erlang寫的一個(gè)成品,所以知道如何構(gòu)建erlang的node集群就ok了,他需要一個(gè)統(tǒng)一的cookie機(jī)制。。。本篇的測試環(huán)境如下:
centos1:192.168.23.147
centos2:192.168.23.145
截圖如下:
?
一:cookie機(jī)制
? ? ? 剛才也說了,要想實(shí)現(xiàn)cluster集群,必須保證各臺機(jī)器上的cookie文件內(nèi)容一致,那問題來了。。。cookie在哪呢?從rabbitmq的官網(wǎng)上可以找到這么
一句話,如下圖:
ok,官網(wǎng)說的非常清楚了,那接下來我們看一下$HOME變量指向的是哪里。。。
[root@rabbitmq1 Desktop]# echo $HOME/root [root@rabbitmq1 Desktop]#?
那接下來我就去看看(Centos1 .147)這臺的/root 文件下可否能夠找到,如下圖:
?
牛逼了吧,嘿嘿,現(xiàn)在我們要做的事情,就是把Centos2的cookie文件內(nèi)容替換成Centos1的cookie內(nèi)容。
?
二:使用host映射erlang節(jié)點(diǎn)
? ?現(xiàn)在cookie值是一樣的了,然后需要在/etc/hosts中追加一下host影射,方便erlang節(jié)點(diǎn)之間相互發(fā)現(xiàn),接下來就是在2臺centos上追加同樣的host地址:
?
三:rabbitmqctl cluster命令
? ? 好了,準(zhǔn)備工作我們都做好了,大家可以重啟一下機(jī)器,開啟我們的rabbitmq,這時(shí)候會有驚喜發(fā)現(xiàn)的。。。
由原來的localhost改成現(xiàn)在的rabbitmq2了,看到了吧~~~ 接下來大家可以把兩臺rabbitmq開啟了。
?
1. 在centos1上使用rabbitmqctl cluster_status看看集群現(xiàn)在的狀況
[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]#可以看到,當(dāng)前的running-nodes中只有一臺,剛好就是本機(jī)的erlang節(jié)點(diǎn)本身,接下來我們看一下是否能夠連接到rabbit@rabbitmq2上去。。。
?
2.?join_cluster命令
? ? 這個(gè)命令之前,需要將本機(jī)的rabbitmq關(guān)閉,然后進(jìn)行join操作,從下圖中可以看到,我們已經(jīng)連接到了centos2上的rabbitmq了。。。
[root@rabbitmq1 Desktop]# rabbitmqctl stop_app Stopping node rabbit@rabbitmq1 ... [root@rabbitmq1 Desktop]# ?rabbitmqctl join_cluster rabbit@rabbitmq2Clustering node rabbit@rabbitmq1 with rabbit@rabbitmq2 ...[root@rabbitmq1 Desktop]# rabbitmqctl start_app Starting node rabbit@rabbitmq1 ... [root@rabbitmq1 Desktop]#?
3. 使用webui看一下最后的效果
看到?jīng)]有,現(xiàn)在我們的rabbitmq集群已經(jīng)搭建成功了,如果你有更多的機(jī)器,都可以使用這個(gè)join命令加入吧,很簡單吧~~~
?
四:mirror queue
? ? 從名字上可以看出,就是鏡像隊(duì)列的意思,也就是說queue能在我們多臺機(jī)器中同步,設(shè)置的方式也能簡單,只需要在webui的policy上面設(shè)置即可。。。
這段設(shè)置表示當(dāng)前如果是mytest開頭的隊(duì)列都是“鏡像隊(duì)列”,當(dāng)然也可以用代碼來實(shí)現(xiàn),并且實(shí)現(xiàn)自動同步的功能,如下:
rabbitmqctl set_policy ha-all "^mytest" '{"ha-mode":"all","ha-sync-mode":"automatic"}'?
五:使用C#驅(qū)動連接
再好的cluster最后都需要用語言驅(qū)動連接,這樣才能真正的落地,我選擇的驅(qū)動是官方的,大家可以在nuget上面下載一下:
?
接下來我需要演示向 queue=mytest1隊(duì)列中推送數(shù)據(jù),亮點(diǎn)在于我在CreateConnection方法中塞入了多個(gè)ip地址。。。如下代碼:
class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? ConnectionFactory factory = new ConnectionFactory()
??????????? {
??????????????? UserName = "datamip",
??????????????? Password = "datamip",
??????????????? AutomaticRecoveryEnabled = true,
??????????????? TopologyRecoveryEnabled = true
??????????? };
??????????? //第一步:創(chuàng)建connection
??????????? var connection = factory.CreateConnection(new string[2] { "192.168.23.147", "192.168.23.145" });
??????????? //第二步:創(chuàng)建一個(gè)channel
??????????? var channel = connection.CreateModel();
??????????? var result = channel.QueueDeclare("mytest1", true, false, false, null);
??????????? for (int i = 0; i < int.MaxValue; i++)
??????????? {
??????????????? channel.BasicPublish(string.Empty, "mytest1", null, new byte[10]);
??????????????? Console.WriteLine("{0} 推送成功", i);
??????????????? Thread.Sleep(1000);
??????????? }
??????????? Console.Read();
??????? }
??? }
?
?
最后我們看一下webui,可以清清楚楚的看到消息已經(jīng)進(jìn)入了rabbitmq集群啦。。。
好了,本篇就說這么多了,希望對您有幫助
相關(guān)文章:
體驗(yàn)Rabbitmq強(qiáng)大的【優(yōu)先級隊(duì)列】之輕松面對現(xiàn)實(shí)業(yè)務(wù)場景
RabbitMQ消息隊(duì)列應(yīng)用
原文地址:http://www.cnblogs.com/huangxincheng/p/6113891.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jexus 5.8.2 正式发布为Asp
- 下一篇: 微软Ignite大会约起来