一、環境說明
1、Centos7.7-64位
2、Erlang-OTP 23
3、RabbitMQ-3.8.9
操作系統 |
ip |
主機名 |
配置 |
centos 7.7 |
17.16.10.62 |
rabbit-1 |
4核8g |
centos 7.7 |
17.16.10.63 |
rabbit-2 |
4核8g |
centos 7.7 |
17.16.10.66 |
rabbit-3 |
4核8g |
二、下載安裝文件
1、RabbitMQ軟件:
2、erlang是RabbitMQ的依賴軟件,在erlang官網下載以下版本:
https://github.com/rabbitmq/erlang-rpm/releases/download/v23.2.1/erlang-23.2.1-1.el7.x86_64.rpm
3、把下載的文件分別上傳到3台服務器的 /root/soft/rabbitmq 目錄下。
三、安裝RabbitMQ依賴包
-
安裝基礎依賴包
1. 配置yum源:
touch /etc/yum.repos.d/rabbitmq_erlang.repo vim /etc/yum.repos.d/rabbitmq_erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/23/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1
2. 導入key:
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
注:安裝 rabbitMQ 時需要key。
3. 安裝socat:
yum -y install epel-release
yum -y install socat
注:安裝 rabbitMQ 時需要依賴socat。
-
安裝與配置erlang
1. erlang和rabbitmq的版本對應關系
2. 安裝erlang
cd /root/soft/rabbitmq rpm -ivh erlang-23.2.1-1.el7.x86_64.rpm
3. 使用以下指令進入erlang如出現以下訊息表示成功安裝:
shell>erl
用ctrl+c退出。
四、安裝RabbitMQ
- 安裝RabbitMQ
cd /root/soft/rabbitmq rpm -ivh rabbitmq-server-3.8.9-1.el7.noarch.rpm
- 在rabbit-1、rabbit-2、rabbit-3上分別配置RabbitMQ:
rabbit-1:
touch /etc/rabbitmq/rabbitmq-env.conf echo "NODENAME=rabbit@rabbit-1" > /etc/rabbitmq/rabbitmq-env.conf
rabbit-2:
touch /etc/rabbitmq/rabbitmq-env.conf echo "NODENAME=rabbit@rabbit-2" > /etc/rabbitmq/rabbitmq-env.conf
rabbit-3:
touch /etc/rabbitmq/rabbitmq-env.conf echo "NODENAME=rabbit@rabbit-3" > /etc/rabbitmq/rabbitmq-env.conf
- 啟動RabbitMQ節點
systemctl start rabbitmq-server
注:該命令會同時啟動 Erlang 虛擬機和 RabbitMQ 應用服務。而后文用到的 rabbitmqctl start_app
只會啟動 RabbitMQ 應用服務, rabbitmqctl stop_app
只會停止 RabbitMQ 服務。
- 查看RabbitMQ節點狀態
systemctl status rabbitmq-server
rabbitmqctl status
- 停止RabbitMQ節點
systemctl stop rabbitmq-server
- 開啟RabbitMQ管理控制台
rabbitmq-plugins enable rabbitmq_management
五、配置RabbitMQ集群
1. 在3台機器上/etc/hosts文件中添加IP和節點名稱的對應:
vi /etc/hosts 172.16.10.62 rabbit-1 172.16.10.63 rabbit-2 172.16.10.66 rabbit-3
2. 在各個RabbitMQ服務器中停止RabbitMQ服務:
rabbitmqctl stop rabbitmq-server
3. 拷貝 cookie
.erlang.cookie
文件拷貝到其他兩台主機上。該 cookie 文件相當於密鑰令牌,集群中的 RabbitMQ 節點需要通過交換密鑰令牌以獲得相互認證,
RabbitMQ 服務啟動時,erlang VM 會自動創建該 cookie 文件,默認的存儲路徑為:
/var/lib/rabbitmq/.erlang.cookie
或$HOME/.erlang.cookie
rabbit-1:
登陸第一台rabbit-1機器,拷貝cookie至另外2台機器rabbit-2、rabbit-3:
scp /var/lib/rabbitmq/.erlang.cookie root@172.16.10.63:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@172.16.10.66:/var/lib/rabbitmq/
rabbit-2:
登錄rabbit-2機器執行:
chown -R rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie chmod 600 /var/lib/rabbitmq/.erlang.cookie
rabbit-3:
登錄rabbit-3機器執行:
chown -R rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie chmod 600 /var/lib/rabbitmq/.erlang.cookie
4. 啟動3個節點上的RabbitMQ服務:
systemctl start rabbitmq-server
5. 在rabbit-2及rabbit-3服務器中使用以下指令把在rabbit-2及rabbit-3服務器中的RabbitMQ服務加入到rabbit-1服務器的rabbitmq集群中:
rabbit-2:
# 1.停止服務
rabbitmqctl stop_app
# 2.重置狀態
rabbitmqctl reset
# 3.節點加入 rabbitmqctl join_cluster rabbit@rabbit-1
# 4.啟動服務 rabbitmqctl start_app
rabbit-3:
# 1.停止服務
rabbitmqctl stop_app
# 2.重置狀態
rabbitmqctl reset
# 3.節點加入
rabbitmqctl join_cluster rabbit@rabbit-1
# 4.啟動服務 rabbitmqctl start_app
join_cluster
命令有一個可選的參數 --ram
,該參數代表新加入的節點是內存節點,默認是磁盤節點。
如果是內存節點,則所有的隊列、交換器、綁定關系、用戶、訪問權限和 vhost 的元數據都將存儲在內存中,如果是磁盤節點,則存儲在磁盤中。
內存節點可以有更高的性能,但其重啟后所有配置信息都會丟失,因此RabbitMQ 要求在集群中至少有一個磁盤節點,其他節點可以是內存節點。
當內存節點離開集群時,它可以將變更通知到至少一個磁盤節點;然后在其重啟時,再連接到磁盤節點上獲取元數據信息。
除非是將 RabbitMQ 用於 RPC 這種需要超低延遲的場景,否則在大多數情況下,RabbitMQ 的性能都是夠用的,可以采用默認的磁盤節點的形式。
另外,如果節點以磁盤節點的形式加入,則需要先使用 reset
命令進行重置,然后才能加入現有群集,重置節點會刪除該節點上存在的所有的歷史資源和數據。
采用內存節點的形式加入時可以略過 reset
這一步,因為內存上的數據本身就不是持久化的。
6. 在rabbit-1服務器上確認rabbitmq集群的信息:
rabbitmqctl cluster_status
六、配置RabbitMQ管理控制面板
1. 創建用戶
rabbitmqctl add_user zat zat123
2. 創建vhost
rabbitmqctl add_vhost zat
3. 分配權限
rabbitmqctl set_permissions -p zat zat ".*" ".*" ".*"
4. 賦予admin權限
rabbitmqctl set_user_tags zat administrator
5. 用戶zat分配vhost zat的用戶許可證
rabbitmqctl set_permissions -p zat zat '.*' '.*' '.*'
6. 登入RabbitMQ管理控制台
http:// 172.16.10.62:15672/#/ 用戶zat 密碼zat123
七、設置鏡像隊列策略
- 設置
在rabbit-1節點上執行:
rabbitmqctl set_policy -p zat ha-allqueue "^" '{"ha-mode":"all"}'
命令說明:針對指定vhost(zat)下的queue進行設置為鏡像隊列,即隊列會被復制到集群各個節點,各個集群節點交換機、隊列、隊列內容都保持一致。
- 複製系統
rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
- 驗證
1、在rabbit-1節點增加一個隊列(在vhost下):mirror_queue_test
2、查看mirror_queue_test隊列的列表信息:
3、在列表信息點擊mirror_queue_test,查看它的詳細信息:
注:上圖中該隊列使用了策略(ha-allqueue),有2個鏡像節點(rabbit@rabbit63、rabbit@rabbit66)
4、驗證完成後,在詳細信息介面中,刪除mirror_queue_test隊列:
八、集群節點下線
以上介紹的集群搭建的過程就是服務擴容的過程,如果想要進行服務縮容,即想要把某個節點剔除集群,有兩種可選方式:
第一種:可以先使用 rabbitmqctl stop 停止該節點上的服務,然后在其他任意一個節點上執行 forget_cluster_node
命令。
這里以剔除 rabbit-3 上的服務為例,此時可以在 rabbit-1 或 2 上執行下面的命令:
rabbitmqctl forget_cluster_node rabbit@rabbit-3
第二種:先使用 rabbitmqctl stop
停止該節點上的服務,然后再執行 rabbitmqctl reset
這會清空該節點上所有歷史數據,並主動通知集群中其它節點它將要離開集群。
九、集群關閉與重啟
沒有一個直接的命令可以關閉整個集群,需要逐一進行關閉。但是需要保證在重啟時,最后關閉的節點最先被啟動。
如果第一個啟動的不是最后關閉的節點,那么這個節點會等待最后關閉的那個節點啟動,默認進行 10 次連接嘗試,超時時間為 30 秒,如果依然沒有等到,則該節點啟動失敗。
這帶來的一個問題是,假設在一個三節點的集群當中,關閉的順序為 node1,node2,node3,如果 node1 因為故障暫時沒法恢復,此時 node2 和 node3 就無法啟動。
想要解決這個問題,可以先將 node1 節點進行剔除,命令如下:
rabbitmqctl forget_cluster_node rabbit@node1 -offline
此時需要加上 -offline
參數,它允許節點在自身沒有啟動的情況下將其他節點剔除。
十、卸載
停止服務:
rabbitmqctl stop_app
停止進程:
systemctl stop rabbitmq-server
查看進程狀態kill 掉erlang相關進程:
ps -ef |grep rabbit
卸載MQ:
yum list|grep rabbitmq
yum -y remove rabbitmq-server.noarch
卸載erlang:
yum list | grep erlang
yum -y remove erlang.x86_64
刪除相關文件:
rm -rf /usr/lib64/erlang rm -rf /var/lib/rabbitmq rm -rf /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.9/ rm -rf /etc/rabbitmq/ rm -rf /var/log/rabbitmq