RabbitMQ Clustering Guide

http://previous.rabbitmq.com/v3_6_x/clustering.html

RabbitMQ Broker是一個或多個Erlang節點的邏輯分組,每個節點運行RabbitMQ應用程序,並共享users, virtual hosts, queues, exchanges, bindings, and runtime parameters.有時我們將節點集合稱爲集羣。

RabbitMQ Broker操作所需的所有數據/狀態將在所有節點之間複製。message queues是一個例外,默認情況下它駐留在一個節點上,但是它們是可見的,並且可以從所有節點訪問。

RabbitMQ節點使用短域名或全限定域名(FQDNs)相互尋址。因此,所有集羣成員的主機名必須能夠從所有集羣節點以及可能使用rabbitmqctl等命令行工具的機器上解析。

主機名解析可以使用任何標準os提供的方法:

  • DNS records
  • Local host files (e.g. /etc/hosts)

在限制更嚴格的環境中,DNS記錄或主機文件修改是受限制的、不可能的或不需要的,Erlang VM可以配置爲使用其他主機名解析方法,如備用DNS服務器、本地文件、非標準主機文件位置或方法的組合。這些方法可以與標準OS主機名解析方法協同工作。 

集羣可以通過以下幾種方式創建:

  • Manually with rabbitmqctl (e.g. in development environments)
  • Declaratively by listing cluster nodes in config file
  • Declaratively with rabbitmq-autocluster (a plugin)

集羣的組成可以動態更改。所有RabbitMQ代理最初都在單個節點上運行。這些節點可以連接到集羣中,然後再次轉換回單個代理。

RabbitMQ代理允許單個節點的失敗。節點可以隨意啓動和停止,只要它們能夠在關機時聯繫到已知的集羣成員節點。

RabbitMQ集羣有幾種處理網絡分區的模式,主要是面向一致性的。集羣是用來跨LAN使用的。不建議運行跨WAN的集羣。The Shovel or Federation plugins是跨WAN連接代理的更好解決方案。注意,The Shovel or Federation plugins並不等同於集羣。 

當從一個主要或次要版本的RabbitMQ升級到另一個版本或升級Erlang時,必須關閉整個集羣進行升級(因爲集羣不能像這樣運行混合版本)。

RabbitMQ節點使用主機名彼此通信。因此,所有節點名必須能夠解析所有集羣節點的名稱。對於rabbitmqctl等工具也是如此。

除此之外,默認情況下,RabbitMQ使用系統的當前主機名來命名數據庫目錄。如果主機名更改,將創建一個新的空數據庫。爲了避免數據丟失,必須設置一個固定的和可解析的主機名。當主機名改變時,您應該重啓RabbitMQ:

$ /etc/init.d/rabbitmq-server restart

當節點位於數據中心或可靠網絡上,但被防火牆分隔時,就會出現防火牆集羣節點。同樣,不建議通過WAN或節點之間的網絡鏈接不可靠時進行集羣。在最常見的配置中,您將需要打開一些標準端口:

  • 4369: epmd, a peer discovery service used by RabbitMQ nodes and CLI tools
  • 5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS
  • 25672: used by Erlang distribution for inter-node and CLI tools communication and is allocated from a dynamic range (limited to a single port by default, computed as AMQP port + 20000). See networking guide for details.
  • 15672: HTTP API clients and rabbitmqadmin (only if the management plugin is enabled)
  • 61613, 61614: STOMP clients without and with TLS (only if the STOMP plugin is enabled)
  • 1883, 8883: (MQTT clients without and with TLS, if the MQTT plugin is enabled
  • 15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)
  • 15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)

集羣中的所有節點必須運行相同的Erlang小版本:19.3.4和19.3.6可以混合使用,但19.0.1和19.3.6(或17.5和19.3.6)不能混合使用。不同版本之間的Erlang/OTP補丁版本之間的兼容性可能有所不同,但這種情況通常很少見。

Client可以正常連接到集羣中的任何節點。如果某個節點失敗,而集羣的其餘部分節點正常,那麼Client應該注意到關閉的連接,並且應該能夠重新連接到集羣中其他正常的節點。通常,不建議將節點主機名或IP地址放入client端應用程序中:這帶來了不靈活性,如果集羣的配置或節點數量發生變化,將需要編輯、重新編譯和重新部署client端應用程序。我們推薦一種更抽象的方法:這可以是一個動態DNS服務,它具有非常短的TTL配置,或者一個普通的TCP負載均衡器,或者使用pacemaker或類似技術實現的某種移動IP。一般來說,管理到集羣中節點的連接的這方面超出了RabbitMQ本身的範圍,我們建議使用專門爲解決這些問題而設計的其他技術。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章