RabbitMQ——安裝、集群搭建、鏡像隊列配置


 

一、環境說明

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軟件:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.9/rabbitmq-server-3.8.9-1.el7.noarch.rpm

 

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 節點需要通過交換密鑰令牌以獲得相互認證,
因此處於同一集群的所有節點需要具有相同的密鑰令牌,否則在搭建過程中會出現 Authentication Fail 錯誤。

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進行設置為鏡像隊列,即隊列會被復制到集群各個節點,各個集群節點交換機、隊列、隊列內容都保持一致。

  • 複製系統
在上面我們指定了 ha-mode 的值為 all ,代表消息會被同步到所有節點的相同隊列中。這里我們之所以這樣配置,因為我們本身只有三個節點,因此復制操作的性能開銷比較小。
如果你的集群有很多節點,那么此時復制的性能開銷就比較大,此時需要選擇合適的復制系數。通常可以遵循過半寫原則,即對於一個節點數為 n 的集群,只需要同步到 n/2+1 個節點上即可。
此時需要同時修改鏡像策略為 exactly,並指定復制系數 ha-params,示例命令如下:
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

 

 


免責聲明!

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



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