1. 程式人生 > >RabbitMQ 叢集原理和完善

RabbitMQ 叢集原理和完善

一、RabbitMQ叢集方案的原理

RabbitMQ這款訊息佇列中介軟體產品本身是基於Erlang編寫,Erlang語言天生具備分散式特性(通過同步Erlang叢集各節點的magic cookie來實現)。

因此,RabbitMQ天然支援Clustering。這使得RabbitMQ本身不需要像ActiveMQ、Kafka那樣通過ZooKeeper分別來實現HA方案和儲存叢集的元資料。叢集是保證可靠性的一種方式,同時可以通過水平擴充套件以達到增加訊息吞吐量能力的目的。下面先來看下RabbitMQ叢集的整體方案:

上面圖中採用三個節點組成了一個RabbitMQ的叢集,Exchange A(交換器,對於RabbitMQ基礎概念不太明白的童鞋可以看下基礎概念)的元資料資訊在所有節點上是一致的,而Queue(存放訊息的佇列)的完整資料則只會存在於它所建立的那個節點上。,其他節點只知道這個queue的metadata資訊和一個指向queue的owner node的指標。

(1)RabbitMQ叢集元資料的同步

RabbitMQ叢集會始終同步四種類型的內部元資料(類似索引): a.佇列元資料:佇列名稱和它的屬性; b.交換器元資料:交換器名稱、型別和屬性; c.繫結元資料:一張簡單的表格展示瞭如何將訊息路由到佇列; d.vhost元資料:為vhost內的佇列、交換器和繫結提供名稱空間和安全屬性; 因此,當用戶訪問其中任何一個RabbitMQ節點時,通過rabbitmqctl查詢到的queue/user/exchange/vhost等資訊都是相同的。

(2)為何RabbitMQ叢集僅採用元資料同步的方式

我想肯定有不少同學會問,想要實現HA方案,那將RabbitMQ叢集中的所有Queue的完整資料在所有節點上都儲存一份不就可以了麼?(可以類似MySQL的主主模式嘛)這樣子,任何一個節點出現故障或者宕機不可用時,那麼使用者的客戶端只要能連線至其他節點能夠照常完成訊息的釋出和訂閱嘛。

我想RabbitMQ的作者這麼設計主要還是基於叢集本身的效能和儲存空間上來考慮。

第一,儲存空間,如果每個叢集節點都擁有所有Queue的完全資料拷貝,那麼每個節點的儲存空間會非常大,叢集的訊息積壓能力會非常弱(無法通過叢集節點的擴容提高訊息積壓能力);

第二,效能,訊息的釋出者需要將訊息複製到每一個叢集節點,對於持久化訊息,網路和磁碟同步複製的開銷都會明顯增加。

(3)RabbitMQ叢集傳送/訂閱訊息的基本原理

RabbitMQ叢集的工作原理圖如下:

場景1:客戶端直接連線佇列所在節點

如果有一個訊息生產者或者訊息消費者通過amqp-client的客戶端連線至節點1進行訊息的釋出或者訂閱,那麼此時的叢集中的訊息收發只與節點1相關,這個沒有任何問題;如果客戶端相連的是節點2或者節點3(佇列1資料不在該節點上),那麼情況又會是怎麼樣呢?

場景2:客戶端連線的是非佇列資料所在節點

如果訊息生產者所連線的是節點2或者節點3,此時佇列1的完整資料不在該兩個節點上,那麼在傳送訊息過程中這兩個節點主要起了一個路由轉發作用,根據這兩個節點上的元資料(也就是上文提到的:指向queue的owner node的指標)轉發至節點1上,最終傳送的訊息還是會儲存至節點1的佇列1上。

同樣,如果訊息消費者所連線的節點2或者節點3,那這兩個節點也會作為路由節點起到轉發作用,將會從節點1的佇列1中拉取訊息進行消費。

一、RabbitMQ叢集完善

可以根據這個架構圖,做一些RabbitMQ叢集完善,主要是將記憶體節點作為負載,磁碟節點作為儲存。

更改叢集節點型別:

# rabbitmqctl stop_app

# rabbitmqctl change_cluster_node_type ram
# rabbitmqctl change_cluster_node_type disc

# rabbitmqctl start_app

# rabbitmqctl cluster_status

如果出現錯誤:

Error: unable to connect to node [email protected]: nodedown

解決方式:

# /sbin/service rabbitmq-server stop
# /sbin/service rabbitmq-server start
# rabbitmqctl status

如果要將節點移除叢集,則在本節點上執行:

# rabbitmqctl stop_app && 
rabbitmqctl reset && 
rabbitmqctl start_app

然後在主節點執行:

# rabbitmqctl forget_cluster_node [email protected]

節點加入叢集命令:

# rabbitmqctl join_cluster [email protected] --ram
# rabbitmqctl join_cluster [email protected] --disc

參考資料:

  • http://blog.51cto.com/zengestudy/1885054
  • http://www.cnblogs.com/Richard-xie/p/4201994.html

相關推薦

RabbitMQ 叢集原理完善

一、RabbitMQ叢集方案的原理 RabbitMQ這款訊息佇列中介軟體產品本身是基於Erlang編寫,Erlang語言天生具備分散式特性(通過同步Erlang叢集各節點的magic cookie來實現)。 因此,RabbitMQ天然支援Clustering。這使得RabbitMQ本身不需要像ActiveMQ

RabbitMQKafka的高可用叢集原理

  前言 小夥伴們,通過前邊文章的閱讀,相信大家已經對RocketMQ的基本原理有了一個比較深入的瞭解,那麼大家對當前比較常用的RabbitMQ和Kafka是不是也有興趣瞭解一些呢,瞭解的多一些也不是壞事,面試或者跟人聊技術的時候也會讓你更有話語權嘛。 那王子今天就跟大家聊一聊RabbitMQ和Ka

Rabbitmq原理分析

1、基本原理 MQ全稱為Message Queue,是一種分散式應用程式的的通訊方法,它是消費-生產者模型的一個典型的代表,producer往訊息佇列中不斷寫入訊息,而另一端consumer則可以讀取或者訂閱佇列中的訊息。 RabbitMQ是MQ產品的典型代表,是一款基於AMQP協議可複用的

架構師之路--視訊業務介紹,離線服務架構各種叢集原理

java架構師、叢集、高可用、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Netty、Jvm大型分散式專案實戰 視訊課程內容包含: 高階Java架構師包含:Spring boot、Spring  cloud、

Redis叢集原理搭建

前言 Redis 是我們目前大規模使用的快取中介軟體,由於它強大高效而又便捷的功能,得到了廣泛的使用。單節點的Redis已經就達到了很高的效能,為了提高可用性我們可以使用Redis叢集。本文參考了Rdis的官方文件和使用Redis官方提供的Redis Clus

mysql-cluster叢集原理介紹搭建步驟(四個data/sql節點)

MySQL簇概述 MySQL簇是一種技術,該技術允許在無共享的系統中部署“記憶體中”資料庫的簇。通過無共享體系結構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。此外,由於每個元件有自己的記憶體和磁碟,不存在單點故障。 MySQL簇將標準的MySQL伺服器與名為NDB的“

redis叢集(Redis Cluster)原理應用

全面剖析Redis Cluster原理和應用 1.Redis Cluster總覽 1.1 設計原則和初衷 在官方文件Cluster Spec中,作者詳細介紹了Redis叢集為什麼要設計成現在的樣子。最核心的目標有三個: 效能:這

訊息中介軟體—RabbitMQ叢集原理與搭建篇)

一般來說,如果只是為了學習RabbitMQ或者驗證業務工程的正確性那麼在本地環境或者測試環境上使

docker-compose安裝rabbitmq 叢集管理工具

單機版 rabbit1: image: rabbitmq:management hostname: rabbit1 ports: - "4369:4369" - "56

RabbitMQ交換機Direct型別工作原理PHP樣例程式碼

1 RabbitMQ交換機Direct型別工作原理 direct型別的Exchange路由規則也很簡單,它會把訊息路由到那些binding key與routing key完全匹配的Queue中 1 當生產者,投遞訊息時候,使用exchange_cleve

ORACLE叢集概念原理

Oracle叢集概念和原理 Oracle的三種高可用叢集方案 1 RAC(Real Application Clusters)                         多個Oracle伺服器組成一個共享的Cache,而這些Oracle伺服器共享一個基於網

RabbitMQ交換機Topic型別工作原理PHP樣例程式碼

1 Topic型別工作原理 1.1原理: 前面講到direct型別的Exchange路由規則是完全匹配binding key與routing key,但這種嚴格的匹配方式在很多情況下不能滿足實際業務需求。 topic型別的Exchange在匹配規則

ORACLE rac叢集概念原理

Oracle叢集概念和原理 Oracle的三種高可用叢集方案 1 RAC(Real Application Clusters)                        多個Oracle伺服器組成一個共享的Cache,而這些Oracle伺服器共享一個基於網路的儲

Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之ORACLE叢集概念原理(二)

概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。

【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程之RAC 工作原理相關元件(三)

概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。

【Linux運維-叢集技術進階】keepalived工作原理配置檔案解析

keepalived是什麼 keepalived是叢集管理中保證叢集高可用的一個服務軟體,其功能類似於heartbeat,用來防止單點故障,它可以自動檢測叢集中伺服器的健康狀況,比如主從模式時,當主伺

Keepalived叢集軟體高階使用(工作原理狀態通知)

今年企業對Java開發的市場需求,你看懂了嗎? >>>   

八、RabbitMQ叢集原理

叢集架構 寫在前面 RabbitMQ叢集是按照低延遲環境設計的,千萬不要跨越WAN或者網際網路來搭建RabbitMQ叢集。

貝葉斯算法的基本原理算法實現

utf shape less 流程 我們 def .sh 詞向量 貝葉斯算法 一. 貝葉斯公式推導   樸素貝葉斯分類是一種十分簡單的分類算法,叫它樸素是因為其思想基礎的簡單性:就文本分類而言,它認為詞袋中的兩兩詞之間的關系是相互獨立的,即一個對象 的特征向量

base64加密解碼原理代碼

先來 自動 clas enter 緩沖區 urn rar col his Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基於用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法!也是MIME(多用途互聯網郵件擴展,主要用