環境介紹
主機名 | 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