rabbitmq3.8集群部署


環境介紹

主機名 IP
rabbitmq1 192.168.50.134
rabbitmq2 192.168.50.135
rabbitmq3 192.168.50.136

1、修改主機名

如果已經修改過主機名的話,就不再進行修改。但是切記rabbitmq搭建完成后期不要再進行修改,否則會出現問題。

hostnamectl set-hostname rabbitmq1
hostnamectl set-hostname rabbitmq2
hostnamectl set-hostname rabbitmq3

每個節點添加hosts

192.168.50.134 rabbitmq1
192.168.50.135 rabbitmq2
192.168.50.136 rabbitmq3

最好是重啟一下

reboot

2、安裝源

三台分別都進行操作

分別是erlang和rabbitmq的源。默認地源下載的版本比較低,這里安裝的erlang版本是21.3.8.18。rabbitmq的版本是3.8.9

erlang的源

[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/21/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

rabbitmq-server的源

[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/7/
gpgcheck=0
repo_gpgcheck=0
enabled=1

接下來需要生成一下yum緩存

dnf clean all
dnf makecache

3、安裝

三台分別都進行操作

3.1、先安裝erlang和socat

dnf install socat erlang -y

3.2、安裝rabbitmq-server

dnf install rabbitmq-server -y

分別啟動rabbitmq-server服務

systemctl start rabbitmq-server

4、三台機器同步.erlang.cookie文件

這里我們以rabbtmq1節點作為集群管理節點,.erlang.cookie文件在rabbitmq的安裝目錄/var/lib/rabbitmq目錄下,這是一個隱藏文件,需要加上-a參數

[root@rabbitmq1 rabbitmq]# ls -al
total 8
drwxr-xr-x   3 rabbitmq rabbitmq   42 Oct 30 21:47 .
drwxr-xr-x. 27 root     root     4096 Oct 30 21:20 ..
-r--------   1 rabbitmq rabbitmq   20 Oct 30 00:00 .erlang.cookie
drwxr-x---   4 rabbitmq rabbitmq  135 Oct 30 21:47 mnesia

這里我們把.erlang.cookie文件同步到其他機器上面

[root@rabbitmq1 rabbitmq]# scp .erlang.cookie  root@192.168.50.135:/var/lib/rabbitmq/
root@192.168.50.135's password: 
.erlang.cookie                             100%   20    27.0KB/s   00:00    
[root@rabbitmq1 rabbitmq]# scp .erlang.cookie  root@192.168.50.136:/var/lib/rabbitmq/
root@192.168.50.136's password: 
.erlang.cookie                             100%   20    36.7KB/s   00:00 

同步完成之后我們再來查看幾個節點的.erlang.cookie文件,發現都是一致的,這是我們想要的結果。

[root@rabbitmq1 rabbitmq]# cat .erlang.cookie 
SFWVLUCDUUVPIVRJDWTE[root@rabbitmq1 rabbitmq]#

這個文件是不帶結尾換行符的,大家應該能看出來。

5、重啟服務

三個節點分別重啟rabbitmq-server服務

systemctl restart rabbitmq-server

6、三個節點都打開rabbitmq監控插件

如果不打開的話,那么集群之間無法查看對方的數據,查看數據就是依靠web插件來實現的

[root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@rabbitmq1:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@rabbitmq1...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.

其他另外兩個節點都打開此功能(如有必要,需要重啟服務,不過一般都不用重啟rabbitmq)

7、在rabbitmq1上面添加用戶

默認下,我們上面打開了監控插件功能,那么此時就能夠看到15672端口了,我們可以使用IP:PORT的方式來進行訪問,默認地賬戶密碼都是guest,但是rabbitmq只允許本機通過localhost的方式進行通訊,因此我們再創建個其他的用戶實現遠程訪問。

rabbitmq1添加用戶實現web訪問

[root@rabbitmq1 ebin]# rabbitmqctl add_user admin 111111
Adding user "admin" ...
[root@rabbitmq1 ebin]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
[root@rabbitmq1 ebin]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...

這個時候再次訪問並登錄即可。

8、將其他兩個節點rabbitmq2、rabbitmq3加入集群中

這里需要強調的是,我們將rabbitmq1作為第一個集群節點,然后在rabbitm2和rabbitmq3節點分別操作申請加入集群的方式。

8.1、rabbitmq1節點查看當前集群。

雖然只有一個節點,但也是集群,也是可以查看本身的集群信息的。

[root@rabbitmq1 ebin]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
Basics

Cluster name: rabbit@rabbitmq1

Disk Nodes

rabbit@rabbitmq1

Running Nodes

rabbit@rabbitmq1

Versions

rabbit@rabbitmq1: RabbitMQ 3.8.9 on Erlang 21.3.8.18

Maintenance status

Node: rabbit@rabbitmq1, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

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@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API

Feature flags

Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

我們需要注意的一行信息就是Cluster name: rabbit@rabbitmq1。要記住這個名字,一會我們要使用。

8.2、現在我們操作rabbitmq2節點

需要強調一下,集群中至少有一個節點是磁盤節點用於數據持久化,然后剩下的節點都設置為內存節點以提高性能。

這里將 rabbitmq2 添加到集群當中,並成為內存節點,不加--ram 默認是磁盤節點

[root@rabbitmq2 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq2 ...
[root@rabbitmq2 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq2 ...
[root@rabbitmq2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1
[root@rabbitmq2 ~]# rabbitmqctl  start_app
Starting node rabbit@rabbitmq2 ...

好了,現在rabbitmq2節點已經加入集群中了,怎么驗證呢?我們來到rabbitmq1節點上面查看集群信息即可看到rabbitmq2節點。

[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
Basics

Cluster name: rabbit@rabbitmq1

Disk Nodes

rabbit@rabbitmq1

RAM Nodes

rabbit@rabbitmq2

Running Nodes

rabbit@rabbitmq1
rabbit@rabbitmq2

Versions

rabbit@rabbitmq1: RabbitMQ 3.8.9 on Erlang 21.3.8.18
rabbit@rabbitmq2: RabbitMQ 3.8.9 on Erlang 21.3.8.18

Maintenance status

Node: rabbit@rabbitmq1, status: not under maintenance
Node: rabbit@rabbitmq2, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

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@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
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

8.3、現在操作rabbitmq3節點加入集群

[root@rabbitmq3 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq3 ...
[root@rabbitmq3 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq3 ...
[root@rabbitmq3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1
Clustering node rabbit@rabbitmq3 with rabbit@rabbitmq1
[root@rabbitmq3 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq3 ...

現在也可以來到rabbitmq1節點查看到rabbitmq3的節點信息了。

當然也可以在web上面查看到三個節點的信息,如下所示:、

9、設置集群為鏡像模式

鏡像隊列機制就是將隊列在 N 個節點之間設置主從關系,消息會在 N 個節點之間進行自動同步,且如果其中一個節點不可用,並不會導致消息丟失或服務不可用的情況,提升 MQ 集群的整體高可用性。

這里在rabbitmq1節點操作(在任意節點操作都是可以的)

[root@rabbitmq1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

10、驗證當前集群

[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
Basics

Cluster name: rabbit@rabbitmq1

Disk Nodes

rabbit@rabbitmq1

RAM Nodes

rabbit@rabbitmq2
rabbit@rabbitmq3

Running Nodes

rabbit@rabbitmq1
rabbit@rabbitmq2
rabbit@rabbitmq3

Versions

rabbit@rabbitmq1: RabbitMQ 3.8.9 on Erlang 21.3.8.18
rabbit@rabbitmq2: RabbitMQ 3.8.9 on Erlang 21.3.8.18
rabbit@rabbitmq3: RabbitMQ 3.8.9 on Erlang 21.3.8.18

Maintenance status

Node: rabbit@rabbitmq1, status: not under maintenance
Node: rabbit@rabbitmq2, status: not under maintenance
Node: rabbit@rabbitmq3, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

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@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
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


免責聲明!

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



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