1. 程式人生 > >訊息中介軟體—RabbitMQ(叢集原理與搭建篇)

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

一般來說,如果只是為了學習RabbitMQ或者驗證業務工程的正確性那麼在本地環境或者測試環境上使用其單例項部署就可以了,但是出於MQ中介軟體本身的可靠性、併發性、吞吐量和訊息堆積能力等問題的考慮,在生產環境上一般都會考慮使用RabbitMQ的叢集方案。

對於RabbitMQ這麼成熟的訊息佇列產品來說,搭建它並不難並且也有不少童鞋寫過如何搭建RabbitMQ訊息佇列叢集的博文,但可能仍然有童鞋並不瞭解其背後的原理,這會導致其遇到效能問題時無法對叢集進行進一步的調優。

本篇主要介紹RabbitMQ叢集方案的原理,如何搭建具備負載均衡能力的中小規模RabbitMQ叢集,並最後給出生產環境構建一個能夠具備高可用、高可靠和高吞吐量的中小規模RabbitMQ叢集設計方案。

一、RabbitMQ叢集方案的原理

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

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

640?wx_fmt=jpeg

上面圖中採用三個節點組成了一個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叢集的工作原理圖如下:

640?wx_fmt=jpeg

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

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

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

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

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

二、RabbitMQ叢集的搭建

(1)搭建RabbitMQ叢集所需要安裝的元件

在搭建RabbitMQ叢集之前有必要在每臺虛擬機器上安裝如下的元件包,分別如下:

a.Jdk 1.8

b.Erlang執行時環境,這裡用的是otpsrc19.3.tar.gz (200MB+)

c.RabbitMq的Server元件,這裡用的rabbitmq-server-generic-unix-3.6.10.tar.gz

關於如何安裝上述三個元件的具體步驟,已經有不少博文對此進行了非常詳細的描述,那麼本文就不再贅述了。有需要的同學可以具體參考這些步驟來完成安裝。

(2)搭建10節點組成的RabbitMQ叢集

該節中主要展示的是叢集搭建,需要確保每臺機器上正確安裝了上述三種元件,並且每臺虛擬機器上的RabbitMQ的例項能夠正常啟動起來。 

a.編輯每臺RabbitMQ的cookie檔案,以確保各個節點的cookie檔案使用的是同一個值,可以scp其中一臺機器上的cookie至其他各個節點,cookie的預設路徑為/var/lib/rabbitmq/.erlang.cookie或者$HOME/.erlang.cookie,節點之間通過cookie確定相互是否可通訊。 

b.配置各節點的hosts檔案( vim /etc/hosts)

  1. xxx.xxx.xxx.xxx rmq-broker-test-1

  2. xxx.xxx.xxx.xxx rmq-broker-test-2

  3. xxx.xxx.xxx.xxx rmq-broker-test-3

  4. ......

  5. xxx.xxx.xxx.xxx rmq-broker-test-10

c.逐個節點啟動RabbitMQ服務

  1. rabbitmq-server -detached

d.檢視各個節點和叢集的工作執行狀態

  1. rabbitmqctl status, rabbitmqctl cluster_status

e.以rmq-broker-test-1為主節點,在rmq-broker-test-2上:

  1. rabbitmqctl stop_app

  2. rabbitmqctl reset

  3. rabbitmqctl join_cluster [email protected]-broker-test-2

  4. rabbitmqctl start_app

在其餘的節點上的操作步驟與rmq-broker-test-2虛擬機器上的一樣。 

f.在RabbitMQ叢集中的節點只有兩種型別:記憶體節點/磁碟節點,單節點系統只執行磁碟型別的節點。而在叢集中,可以選擇配置部分節點為記憶體節點。

記憶體節點將所有的佇列,交換器,繫結關係,使用者,許可權,和vhost的元資料資訊儲存在記憶體中。而磁碟節點將這些資訊儲存在磁碟中,但是記憶體節點的效能更高,為了保證叢集的高可用性,必須保證叢集中有兩個以上的磁碟節點,來保證當有一個磁碟節點崩潰了,叢集還能對外提供訪問服務。

在上面的操作中,可以通過如下的方式,設定新加入的節點為記憶體節點還是磁碟節點:

  1. #加入時候設定節點為記憶體節點(預設加入的為磁碟節點)

  2. [[email protected] ~]# rabbitmqctl join_cluster [email protected]1 --ram

  1. #也通過下面方式修改的節點的型別

  2. [[email protected] ~]# rabbitmqctl changeclusternode_type disc | ram

g.最後可以通過“rabbitmqctl cluster_status”的方式來檢視叢集的狀態,上面搭建的10個節點的RabbitMQ叢集狀態。

(3個節點為磁碟節點,7個節點為記憶體節點)如下:

  1. Cluster status of node '[email protected]'

  2. [{nodes,[{disc,['[email protected]','[email protected]',

  3. '[email protected]']},

  4. {ram,['[email protected]','[email protected]',

  5. '[email protected]','[email protected]',

  6. '[email protected]','[email protected]',

  7. '[email protected]']}]},

  8. {running_nodes,['[email protected]','[email protected]',

  9. '[email protected]','[email protected]',

  10. '[email protected]','[email protected]',

  11. '[email protected]','[email protected]',

  12. '[email protected]','[email protected]']},

  13. {cluster_name,<<"[email protected]">>},

  14. {partitions,[]},

  15. {alarms,[{'[email protected]',[]},

  16. {'[email protected]',[]},

  17. {'[email protected]',[]},

  18. {'[email protected]',[]},

  19. {'[email protected]',[]},

  20. {'[email protected]',[]},

  21. {'[email protected]',[]},

  22. {'[email protected]',[]},

  23. {'[email protected]',[]},

  24. {'[email protected]',[]}]}]

(3)配置HAProxy

HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支援虛擬主機,它是免費、快速並且可靠的一種解決方案。根據官方資料,其最高極限支援10G的併發。HAProxy支援從4層至7層的網路交換,即覆蓋所有的TCP協議。就是說,Haproxy 甚至還支援 Mysql 的均衡負載。

為了實現RabbitMQ叢集的軟負載均衡,這裡可以選擇HAProxy。 關於HAProxy如何安裝的文章之前也有很多同學寫過,這裡就不再贅述了,有需要的同學可以參考下網上的做法。這裡主要說下安裝完HAProxy元件後的具體配置。 HAProxy使用單一配置檔案來定義所有屬性,包括從前端IP到後端伺服器。下面展示了用於7個RabbitMQ節點組成叢集的負載均衡配置(另外3個磁碟節點用於儲存叢集的配置和元資料,不做負載)。同時,HAProxy執行在另外一臺機器上。

HAProxy的具體配置如下:

  1. #全域性配置

  2. global

  3. #日誌輸出配置,所有日誌都記錄在本機,通過local0輸出

  4.        log 127.0.0.1 local0 info

  5. #最大連線數

  6.        maxconn 4096

  7. #改變當前的工作目錄

  8.        chroot /apps/svr/haproxy

  9. #以指定的UID執行haproxy程序

  10.        uid 99

  11. #以指定的GID執行haproxy程序

  12.        gid 99

  13. #以守護程序方式執行haproxy #debug #quiet

  14.        daemon

  15. #debug

  16. #當前程序pid檔案

  17.        pidfile /apps/svr/haproxy/haproxy.pid

  18. #預設配置

  19. defaults

  20. #應用全域性的日誌配置

  21.        log global

  22. #預設的模式mode{tcp|http|health}

  23. #tcp是4層,http是7層,health只返回OK

  24.        mode tcp

  25. #日誌類別tcplog

  26.        option tcplog

  27. #不記錄健康檢查日誌資訊

  28.        option dontlognull

  29. #3次失敗則認為服務不可用

  30.        retries 3

  31. #每個程序可用的最大連線數

  32.        maxconn 2000

  33. #連線超時

  34.        timeout connect 5s

  35. #客戶端超時

  36.        timeout client 120s

  37. 相關推薦

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

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

    訊息中介軟體——RabbitMQ四)命令列管控臺的基本操作!

    前言 在前面的文章中我們介紹過RabbitMQ的搭建:RabbitMQ的安裝過以及各大主流訊息中介軟體的對比:,本章就主要來介紹下我們之前安裝的管控臺是如何使用以及如何通過命令列進行操作。 1. 命令列操作 1.1 基礎服務的命令操作 rabbitmqctl stop_app:關閉應用 rabbitm

    訊息中介軟體——RabbitMQ五)快速入門生產者消費者,SpringBoot整合RabbitMQ

    前言 本章我們來一次快速入門RabbitMQ——生產者與消費者。需要構建一個生產端與消費端的模型。什麼意思呢?我們的生產者傳送一條訊息,投遞到RabbitMQ叢集也就是Broker。 我們的消費端進行監聽RabbitMQ,當發現佇列中有訊息後,就進行消費。 1. 環境準備 本次整合主要採用Spring

    訊息中介軟體Rabbitmq二)-使用詳解

    https://blog.csdn.net/Dante_003/article/details/79377908Rabbitmq 是基於amqp(高階訊息佇列協議)實現的佇列技術,在他之上可以完成多種型別的訊息轉發模型。 下面列舉一些常用的訊息轉發場景,在rabbitmq中是

    訊息中介軟體——RabbitMQ一)Windows/Linux環境搭建完整版)

    前言 最近在學習訊息中介軟體——RabbitMQ,打算把這個學習過程記錄下來。此章主要介紹環境搭建。此次主要是單機搭建(條件有限),包括在Windows、Linux環境下的搭建,以及RabbitMQ的監控平臺搭建。 環境準備 在搭建RabbitMQ之前,請先確保如下環境已經搭建完畢 Java環境(我

    訊息中介軟體——RabbitMQ二)各大主流訊息中介軟體綜合對比介紹!

    前言 訊息佇列已經逐漸成為企業IT系統內部通訊的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步RPC的主要手段之一。當今市面上有很多主流的訊息中介軟體,如老牌的ActiveMQ、RabbitMQ,炙手可熱的Kafka,阿里巴巴自主開發RocketMQ等。今天主要來

    訊息中介軟體——RabbitMQ三)理解RabbitMQ核心概念和AMQP協議!

    前言 本章學習,我們可以瞭解到以下知識點: 網際網路大廠為什麼選擇RabbitMQ? RabbiMQ的高效能之道是如何做到的? 什麼是AMQP高階協議? AMQP核心概念是什麼? RabbitMQ整體架構模型是什麼樣子的? RabbitMQ訊息是如何流轉的? 1. 初識RabbitMQ Rabbi

    訊息中介軟體——RabbitMQ六)理解Exchange交換機核心概念!

    前言 來了解RabbitMQ一個重要的概念:Exchange交換機 1. Exchange概念 Exchange:接收訊息,並根據路由鍵轉發訊息所繫結的佇列。 藍色框:客戶端傳送訊息至交換機,通過路由鍵路由至指定的佇列。 黃色框:交換機和佇列通過路由鍵有一個繫結的關係。 綠色框:消費端通過監聽

    訊息中介軟體——RabbitMQ七)高階特性全在這裡!上)

    前言 前面我們介紹了RabbitMQ的安裝、各大訊息中介軟體的對比、AMQP核心概念、管控臺的使用、快速入門RabbitMQ。本章將介紹RabbitMQ的高階特性。分兩篇(上/下)進行介紹。 訊息如何保障100%的投遞成功? 冪等性概念詳解 在海量訂單產生的業務高峰期,如何避免訊息的重複消費的問題?

    訊息中介軟體——RabbitMQ八)高階特性全在這裡!下)

    前言 上一篇訊息中介軟體——RabbitMQ(七)高階特性全在這裡!(上)中我們介紹了訊息如何保障100%的投遞成功?,冪等性概念詳解,在海量訂單產生的業務高峰期,如何避免訊息的重複消費的問題?,Confirm確認訊息、Return返回訊息。這篇我們來介紹下下面內容。 自定義消費者 訊息的限流(防止

    訊息中介軟體——RocketMQ一) 環境搭建完整版)

    每章一點正能量:自我控制是最強者的本能。——蕭伯納 前言 最近在學習訊息中介軟體——RocketMQ,打算把這個學習過程記錄下來。此章主要介紹環境搭建。此次主要是單機搭建(條件有限),包括在Windows、Linux環境下的搭建,以及console監控平臺搭建,最後加一demo驗證一下。 環境準備

    訊息中介軟體--RabbitMQ學習一)

    Activemq介紹 Activemq是 Apache出品,最流行的能力強勁的開源訊息匯流排,並且它個完全支援MS規範的訊息中介軟體。 其豐富的AP、多種叢集構建模式使得他成為業界老牌訊息中介軟體,在中小型企業中應用廣泛。 MQ衡量指標:服務效能、資料儲存、叢集架構

    訊息中介軟體選型分析 —— 從 Kafka RabbitMQ 的對比來看全域性

    一、前言 二、各類訊息佇列簡述 三、選型要點概述 四、訊息中介軟體選型誤區探討 一、前言 訊息佇列中介軟體(簡稱訊息中介軟體)是指利用高效可靠的訊息傳遞機制進行與平臺無關的資料交流,並基於資料通訊來進行分散式系統的整合。通過提供訊息傳遞

    訊息中介軟體--RabbitMQ學習二)

    Server:又稱 Broker,接受客戶端的連線,實現AMQP實體服務。 Connection:連線,應用程式與 Broker的網路連線。 Channel:網路通道,幾乎所有的操作都在 Channel中進行, Channel是進行訊息讀寫的通道。客戶端可建立多個 hannel,每個 Channel代表一個

    訊息中介軟體--RabbitMQ學習六)

    Fanout Exchange學習 Fanout Exchange介紹 不處理路由鍵,只需要簡單的將佇列繫結到交換機上 傳送到交換機的訊息都會被轉發到與該交換機繫結的所有佇列上 Fanout交換機轉發訊息是最快的 只要交換機跟佇列有繫結,就能夠傳送訊息過去。

    訊息中介軟體--RabbitMQ學習十七)---高階特性之死信佇列

    死信佇列:DLX,Dead- Letter- Exchange 利用DLX,當訊息在一個佇列中變成死信( dead message)之後它能被重新 publish到另一個 Exchange,這個 Exchange就是DLX 死信佇列訊息變成死信有一下幾種情況

    SpringBoot訊息中介軟體(RabbitMQ)的基本使用

    最近新的專案分配給我的任務需要用到RabbitMQ做訊息中介軟體, RabbitMQ已經忘了好多, 今天就來回顧一下RabbitMQ的基本使用(注: 不瞭解RabbitMQ的請參考: https://blog.csdn.net/w1316022737/artic

    訊息中介軟體選型分析——從KafkaRabbitMQ的對比來看全域性

    本文收錄於InfoQ,未經允許不得轉載。 一、前言 訊息佇列中介軟體(簡稱訊息中介軟體)是指利用高效可靠的訊息傳遞機制進行與平臺無關的資料交流,並基於資料通訊來進行分散式系統的整合。通過提供訊息傳遞和訊息排隊模型,它可以在分散式環境下提供應用解耦、彈性伸縮、

    十次方專案第五天訊息中介軟體RabbitMQ

    學習目標: 能夠說出訊息佇列的應用場景以及RabbitMQ的主要概念 完成RabbitMQ安裝以及RabbitMQ三種模式的入門案例 完成使用者註冊,能夠將訊息傳送給RabbitMQ 完成簡訊微服務,能夠接收訊息並呼叫阿里雲通訊完成簡訊傳送 1 RabbitMQ簡介

    【直播預告】:Java Spring Boot開發實戰系列課程【第11講】:訊息中介軟體 RabbitMQ api原始碼解析

    內容概要:mq訊息中介軟體在高併發系統架構中扮演關鍵角色,阿里雙11高併發使用了mq技術。本次課程一起學習最新Java Spring Boot 2.0、RabbitMQ中介軟體的最新特性與實戰應用,同樣會分析核心api原始碼。主講人:徐雷(阿里雲棲特邀Java專家)直播時間:2019年1月8日 週二 今晚20