rabbitmq 集群数据存储与单点故障
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
rabbitmq每個(gè)節(jié)點(diǎn)記錄四類信息:交換機(jī)、隊(duì)列、綁定、vhost元數(shù)據(jù)。
集群中的信息存儲(chǔ)
在rabbitmq2.6.0之前沒有鏡像隊(duì)列,數(shù)據(jù)存儲(chǔ)情況為:
隊(duì)列所屬節(jié)點(diǎn)保存隊(duì)列全部信息(元數(shù)據(jù)、狀態(tài)、內(nèi)容),其他節(jié)點(diǎn)擁有隊(duì)列元數(shù)據(jù);所有節(jié)點(diǎn)保存exchange、bundling信息。好處有兩點(diǎn):
? ? 1.節(jié)約存儲(chǔ)空間,每個(gè)節(jié)點(diǎn)都有相同信息的拷貝,意味著磁盤空間成倍占用;
? ? 2.提升性能,數(shù)據(jù)在節(jié)點(diǎn)間同步占用網(wǎng)絡(luò)資源,如果是持久化狀態(tài),又會(huì)有大量I/O;
正常情況的工作原理:
集群中有三個(gè)節(jié)點(diǎn):rabbit、hare、hare1,隊(duì)列聲明在hare節(jié)點(diǎn),向rabbit節(jié)點(diǎn)發(fā)消息,消息會(huì)轉(zhuǎn)發(fā)到hare節(jié)點(diǎn),消費(fèi)者連接hare1節(jié)點(diǎn),則從hare節(jié)點(diǎn)讀取數(shù)據(jù)。
異常情況1(發(fā)送過(guò)程中故障):
向rabbit節(jié)點(diǎn)發(fā)送5條消息,第一條發(fā)送成功后,關(guān)掉hare節(jié)點(diǎn)
2017-11-16 12:05:07,015 [http-bio-8080-exec-1] [org.springframework.amqp.rabbit.core.RabbitTemplate]-[DEBUG] Publishing message (Body:'< publishmessage 內(nèi)容為:[ Thu Nov 16 12:05:07 CST 2017 ]>' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=62, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])on exchange [AMC_TMP_EXCHANGE], routingKey = [cluster.send]控制臺(tái)顯示正常發(fā)送,實(shí)際上后面4條消息已經(jīng)丟失
localhost:sbin zcjlq$ ./rabbitmqctl -n hare stop_app Stopping rabbit application on node hare@localhost localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues Listing queues AMC_TMP_QUEUEhare節(jié)點(diǎn)重啟,只有第一條消息
localhost:sbin zcjlq$ ./rabbitmqctl -n hare start_app Starting node hare@localhost localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues Listing queues AMC_TMP_QUEUE 1拓展:
如果使用publisher confirm機(jī)制,在回調(diào)函數(shù)RabbitTemplate.ConfirmCallback,你將拿到5個(gè)ack,RabbitTemplate.ReturnCallback不會(huì)被回調(diào)。
異常情況2(發(fā)送完畢故障):
假如我們連上任意節(jié)點(diǎn),發(fā)送4條消息,先不消費(fèi),各個(gè)節(jié)點(diǎn)都能查到消息。
下面停掉隊(duì)列所屬節(jié)點(diǎn)hare
localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues Listing queues AMC_TMP_QUEUE 4 localhost:sbin zcjlq$ ./rabbitmqctl -n hare1 -p zcjlq list_queues Listing queues AMC_TMP_QUEUE 4 localhost:sbin zcjlq$ ./rabbitmqctl -n hare stop_app Stopping rabbit application on node hare@localhost localhost:sbin zcjlq$ ./rabbitmqctl -n hare1 -p zcjlq list_queues Listing queues AMC_TMP_QUEUE localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues Listing queues AMC_TMP_QUEUE localhost:sbin zcjlq$ ./rabbitmqctl -n hare start_app Starting node hare@localhost localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues Listing queues AMC_TMP_QUEUE 4 localhost:sbin zcjlq$ ./rabbitmqctl -n hare1 -p zcjlq list_queues Listing queues AMC_TMP_QUEUE 4我們發(fā)現(xiàn):停用hare節(jié)點(diǎn)后,在另外兩個(gè)節(jié)點(diǎn)查不到消息,hare節(jié)點(diǎn)重啟后,三個(gè)節(jié)點(diǎn)都能查到消息。
說(shuō)明:本測(cè)試在單機(jī)上啟動(dòng)三個(gè)節(jié)點(diǎn)(單機(jī)集群搭建見后續(xù)文章)
rabbitmqctl -n參數(shù)指定節(jié)點(diǎn)名稱,-p指定vhost名稱,start_app啟動(dòng)節(jié)點(diǎn),stop_app關(guān)閉節(jié)點(diǎn),
list_queues查看隊(duì)列列表和待消費(fèi)消息。
異常情況3(故障期間重新聲明隊(duì)列):
在恢復(fù)hare節(jié)點(diǎn)前,我們嘗試通過(guò)其他節(jié)點(diǎn)重新創(chuàng)建隊(duì)列。出現(xiàn)以下錯(cuò)誤
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - home node 'hare@localhost' of durable queue 'AMC_TMP_QUEUE' in vhost 'zcjlq' is down or inaccessible, class-id=50, method-id=10)?
節(jié)點(diǎn)類型
集群中的節(jié)點(diǎn)有兩個(gè)類型:磁盤節(jié)點(diǎn)、內(nèi)存節(jié)點(diǎn)。內(nèi)存節(jié)點(diǎn)(ram)將所有的隊(duì)列、交換器、綁定、用戶、權(quán)限、vhost的元數(shù)據(jù)定義都僅存儲(chǔ)于內(nèi)存中。磁盤節(jié)點(diǎn)(disc)將元數(shù)據(jù)存儲(chǔ)在磁盤中。
是磁盤節(jié)點(diǎn)還是內(nèi)存節(jié)點(diǎn)?
在集群中聲明隊(duì)列、交換器、綁定的時(shí)候,其他節(jié)點(diǎn)會(huì)得到元數(shù)據(jù)的同步,如果集群中全都是磁盤節(jié)點(diǎn),那么你需要等到所有的節(jié)點(diǎn)都磁盤I/O后才完成工作,內(nèi)存節(jié)點(diǎn)將會(huì)更快。
rabbitmq要求集群中至少有一個(gè)磁盤節(jié)點(diǎn)。磁盤節(jié)點(diǎn)離開集群時(shí),集群還可以進(jìn)行部分工作,創(chuàng)建隊(duì)列、創(chuàng)建交換機(jī)、創(chuàng)建綁定、添加用戶、更改權(quán)限、添加或刪除集群節(jié)點(diǎn)將不能使用。原理的磁盤節(jié)點(diǎn)重啟后,集群可以正常工作。我們想要更安全一點(diǎn):原磁盤節(jié)點(diǎn)重啟前,為讓集群正常工作,這時(shí)候可以考慮設(shè)置兩個(gè)集群節(jié)點(diǎn),當(dāng)其中一個(gè)磁盤節(jié)點(diǎn)離開時(shí),它會(huì)將該變更通知到至少一個(gè)磁盤節(jié)點(diǎn)。
?
轉(zhuǎn)載于:https://my.oschina.net/zcjlq/blog/1574455
總結(jié)
以上是生活随笔為你收集整理的rabbitmq 集群数据存储与单点故障的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果MAC OS X怎么安装双系统?
- 下一篇: .net程序中资源文件的保护办法探讨