RabbitMQ學習(三)-集群架構


一、普通集群(副本集群)

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、架構圖

image

缺點: 默認情況下,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)登錄管理界面,展示如下狀態

image

9)測試master上創建隊列,其他節點查看

image

查看從節點隊列狀態:同步過來了

image

10)測試master節點宕機后,節點狀態

image

image

二、鏡像集群

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、架構圖

image

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 "/" ...

查看集群狀態:

image

image

相關說明:

# 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宕機能自動切換,不影響業務

2.4、docker單機鏡像集群

文檔:https://www.jianshu.com/p/ad0257624224


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM