一、普通集群(副本集群)
1.1、簡介
官方文檔: https://www.rabbitmq.com/clustering.html
All data/state required for the operation of a RabbitMQ broker is replicated across all nodes. An exception to this are message queues, which by default reside on one node, though they are visible and reachable from all nodes. To replicate queues across nodes in a cluster --摘自官網
默認情況下:RabbitMQ代理操作所需的所有數據/狀態都將跨所有節點復制。這方面的一個例外是消息隊列,默認情況下,消息隊列位於一個節點上,盡管它們可以從所有節點看到和訪問
1.2、架構圖
缺點: 默認情況下,RabbitMQ集群中隊列的內容僅位於單個節點上(即聲明該隊列的節點,也就是主節點)。創建隊列時,只會在某一個節點上創建隊列,其它節點上並不含有隊列,而只是含有創建節點的元數據(包括隊列信息,綁定關系等)。如果隊列所在的節點故障,則隊列就崩潰了
1.3、集群搭建
1)集群規划
主機名 | ip | 角色 |
rabbitmq1 | 10.0.0.11 | master |
rabbitmq2 | 10.0.0.12 | repl01 |
rabbitmq3 | 10.0.0.13 | repl03 |
2)配置映射關系
[root@rabbitmq1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.11 rabbitmq1 10.0.0.12 rabbitmq2 10.0.0.13 rabbitmq3
3)三台安裝rabbitmq,以一台為例
文檔: https://www.cnblogs.com/hujinzhong/p/13523705.html
[root@rabbitmq1 ~]# ll total 34388 -rw-r--r-- 1 root root 19782364 Aug 18 15:43 erlang-22.3-1.el7.x86_64.rpm -rw-r--r-- 1 root root 15429219 Aug 18 15:46 rabbitmq-server-3.8.6-1.el7.noarch.rpm [root@rabbitmq1 ~]# rpm -ivh erlang-22.3-1.el7.x86_64.rpm [root@rabbitmq1 ~]# yum install socat -y [root@rabbitmq1 ~]# rpm -ivh rabbitmq-server-3.8.6-1.el7.noarch.rpm #配置(模板下載地址:https://raw.githubusercontent.com/rabbitmq/rabbitmq-server/v3.8.6/docs/rabbitmq.conf.example) [root@rabbitmq1 ~]# vim /etc/rabbitmq/rabbitmq.conf ## Uncomment the following line if you want to allow access to the ## guest user from anywhere on the network. loopback_users.guest = false #打開注釋 #啟動rabbitmq中的插件管理 [root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management #啟動 [root@rabbitmq1 ~]# systemctl start rabbitmq-server [root@rabbitmq1 ~]# systemctl enable rabbitmq-server #web訪問 http://10.0.0.11:15672
4)同步cookie文件
可以將master上的/var/lib/rabbitmq/.erlang.cookie同步至其他節點
[root@rabbitmq1 ~]# ll /var/lib/rabbitmq/.erlang.cookie -r-------- 1 rabbitmq rabbitmq 20 Aug 19 00:00 /var/lib/rabbitmq/.erlang.cookie [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@10.0.0.12:/var/lib/rabbitmq/ [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@10.0.0.13:/var/lib/rabbitmq/ #查看 [root@rabbitmq1 ~]# cat /var/lib/rabbitmq/.erlang.cookie XARNAMUJEWELISZXCTRJ
5)重啟所有節點
[root@rabbitmq1 ~]# systemctl restart rabbitmq-server #或者停止rabbitmq后,使用rabbitmq-server -detached(官方建議)
6)在node2和node3執行加入集群命令
#rabbitmq2上 [root@rabbitmq2 ~]# rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitmq2 ... [root@rabbitmq2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq1 Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 [root@rabbitmq2 ~]# rabbitmqctl start_app Starting node rabbit@rabbitmq2 ... #同理rabbitmq3
7)查看集群狀態,任意節點執行
[root@rabbitmq1 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 ... Basics Cluster name: rabbit@rabbitmq1 Disk Nodes rabbit@rabbitmq1 rabbit@rabbitmq2 rabbit@rabbitmq3 Running Nodes rabbit@rabbitmq1 rabbit@rabbitmq2 rabbit@rabbitmq3 Versions rabbit@rabbitmq1: RabbitMQ 3.8.6 on Erlang 22.3 rabbit@rabbitmq2: RabbitMQ 3.8.6 on Erlang 22.3 rabbit@rabbitmq3: RabbitMQ 3.8.6 on Erlang 22.3 Alarms (none) Network Partitions (none) Listeners Node: rabbit@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@rabbitmq1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@rabbitmq1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@rabbitmq2, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@rabbitmq2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@rabbitmq2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@rabbitmq3, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@rabbitmq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@rabbitmq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Feature flags Flag: drop_unroutable_metric, state: disabled Flag: empty_basic_get_metric, state: disabled Flag: implicit_default_bindings, state: enabled Flag: quorum_queue, state: enabled Flag: virtual_host_metadata, state: enabled [root@rabbitmq1 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 ... Basics Cluster name: rabbit@rabbitmq1 Disk Nodes rabbit@rabbitmq1 rabbit@rabbitmq2 rabbit@rabbitmq3 Running Nodes rabbit@rabbitmq1 rabbit@rabbitmq2 rabbit@rabbitmq3 Versions rabbit@rabbitmq1: RabbitMQ 3.8.6 on Erlang 22.3 rabbit@rabbitmq2: RabbitMQ 3.8.6 on Erlang 22.3 rabbit@rabbitmq3: RabbitMQ 3.8.6 on Erlang 22.3 Alarms (none) Network Partitions (none) Listeners Node: rabbit@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@rabbitmq1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@rabbitmq1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@rabbitmq2, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@rabbitmq2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@rabbitmq2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Node: rabbit@rabbitmq3, interface: [::], port: 15672, protocol: http, purpose: HTTP API Node: rabbit@rabbitmq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Node: rabbit@rabbitmq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0 Feature flags Flag: drop_unroutable_metric, state: disabled Flag: empty_basic_get_metric, state: disabled Flag: implicit_default_bindings, state: enabled Flag: quorum_queue, state: enabled Flag: virtual_host_metadata, state: enabled
8)登錄管理界面,展示如下狀態
9)測試master上創建隊列,其他節點查看
查看從節點隊列狀態:同步過來了
10)測試master節點宕機后,節點狀態
二、鏡像集群
2.1、介紹
This guide covers mirroring (queue contents replication) of classic queues --摘自官網
By default, contents of a queue within a RabbitMQ cluster are located on a single node (the node on which the queue was declared). This is in contrast to exchanges and bindings, which can always be considered to be on all nodes. Queues can optionally be made mirrored across multiple nodes. --摘自官網
鏡像隊列機制就是將隊列在三個節點之間設置主從關系,消息會在三個節點之間進行自動同步,且如果其中一個節點不可用,並不會導致消息丟失或服務不可用的情況,提升MQ集群的整體高可用性
2.2、架構圖
2.3、集群配置
鏡像集群在副本集群基礎上做如下配置即可
[root@rabbitmq1 ~]# rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all","ha-sync-mode":"automatic"}' Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
查看集群狀態:
相關說明:
# 0.策略說明 rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition> -p Vhost: 可選參數,針對指定vhost下的queue進行設置 Name: policy的名稱 Pattern: queue的匹配模式(正則表達式) Definition:鏡像定義,包括三個部分ha-mode, ha-params, ha-sync-mode ha-mode:指明鏡像隊列的模式,有效值為 all/exactly/nodes all:表示在集群中所有的節點上進行鏡像 exactly:表示在指定個數的節點上進行鏡像,節點的個數由ha-params指定 nodes:表示在指定的節點上進行鏡像,節點名稱通過ha-params指定 ha-params:ha-mode模式需要用到的參數 ha-sync-mode:進行隊列中消息的同步方式,有效值為automatic和manual priority:可選參數,policy的優先級 # 1.查看當前策略 rabbitmqctl list_policies # 2.添加策略 rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}' 說明:策略正則表達式為 “^” 表示所有匹配所有隊列名稱 ^hello:匹配hello開頭隊列 # 3.刪除策略 rabbitmqctl clear_policy ha-all # 4.測試集群,當master宕機能自動切換,不影響業務