1. 程式人生 > >Rabbit安裝(單機及叢集,阿里雲)

Rabbit安裝(單機及叢集,阿里雲)

Rabbit安裝(單機及叢集,阿里雲)

前言

雖然我並不是部署人員,但是自己私人測試環境的各類東東還是得自己安裝的。
尤其在規模不大的公司,基本安裝部署工作都是後端的份內之事。

那麼最令人痛苦的,莫過於自己就是安裝大佬教程走,但是就是過不去。尤其是初學者,解決問題的能力,還不足,往往就直接卡死了。

其實還有另外一個問題,那就是很多的教程,包括許多視訊的教學,大多采用不真實的環境。要麼是多臺虛擬機器實現叢集,要麼是一臺線上伺服器走天下。當然作者們也有著諸多考慮,有的是為了學員可以零成本的感受安裝,另一方面學員大多都是學習知識,而不是為了實際應用(真的懂得,又不大需要這個東東)。最重要的是,學習階段,大部分安裝都是單機的,可以滿足需求了。

但是,我發現在很多的扣扣群,微信群依然存在著那麼一批正式環境安裝遇到各類問題,苦求無門的朋友。在我回復之後,部分人提議我可以將這部分經驗發出來,幫助更多的人。

所以有了這個系列,我會通過真實的阿里伺服器叢集(三臺),搭建各個中介軟體的叢集等。

最後,由於打馬賽克太麻煩了。並且我之後可能會開放安裝視訊,所以有的IP什麼的,我並不方便打馬賽克。但是希望你們不要做壞事兒哈。

Rabbit安裝概述

簡介

RabbitMQ是一款訊息中介軟體,其安裝分為:

  • 單機安裝(只有一臺伺服器,上面只有一個RabbitMQ的Broker例項)
  • 多主叢集轉發資料(即RabbitMQ普通模式):
    • 多機多節點安裝(每臺伺服器一個RabbitMQ的Broker例項)
    • 單機多節點安裝(只有一臺伺服器,上面有多個RabbitMQ的Broker例項)
  • 多主叢集同步資料(即RabbitMQ映象模式)

PS:以後有機會,會科普MQ的基本叢集種類(如主從,叢集,同步資料,轉發資料,混合方案等)

RabbitMQ是基於erlang語言,所以在安裝RabbitMQ前,需要安裝erlang。

應用

可以通過systemctl指令對RabbitMQ進行操作。

rabbitMQ伺服器名:rabbitmq-server

所以可以有如下操作:

啟動服務:

sudo systemctl start rabbitmq-server

停止服務:

sudo systemctl stop rabbitmq-server

檢視狀態:

sudo systemctl status rabbitmq-server

自啟動設定:

sudo systemctl enable rabbitmq-server

外掛應用

RabbitMQ的一大特色,就是支援諸多外掛,其中最廣為人知的就是Web管理外掛。

開啟外掛

rabbitmq-plugins enable rabbitmq_management

新增使用者

RabbitMQ有一個預設的guest(密碼也是guest)使用者,但是隻能通過localhost訪問(即本地訪問)。所以需要建立一個新的管理員使用者,用於遠端訪問。

rabbitmqctl add_user admin admin

分配操作許可權(管理員)

 rabbitmqctl set_user_tags admin administrator

分配資源許可權(所有資源)

rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

安裝環境

平臺:阿里雲

ECS例項規格:ecs.t5-lc1m1.small (效能約束例項)

CPU:單核

記憶體:1G

硬碟:40G

作業系統:CentOS7.6(已經測試CentOS7.3會出現問題)

購買ECS,用於平時測試,學習的話,四點建議:

  • 只需要購買共享型,比較適合平時用得不多,測試也負擔不大,偶爾壓測。
  • 如果資金允許,直接購買將長時間,比較划算。日後需要也可以提升配置。
  • 阿里雲部分地區有優惠(目前有兩個地區)
  • 如果想要嘗試叢集等操作,並且打算購買多個伺服器,請一定要在同一個內網內,這樣才可以利用內網通訊。

如果還有什麼需要的,可以詢問我。必要的話,我會更新這裡。

防火牆

雲伺服器的防火牆,部分人將其分為兩個。一個是雲伺服器的firewall,另一個是雲平臺的安全策略。

而阿里雲的官方CentOS7.6映象,是不開啟firewall。可以通過systemctl status firewalld來進行確認。

而云平臺的安全策略是需要在安全組內進行設定的。這個部分網上很多資料,就不在此贅述了。

而RabbitMQ需要開放4396,5672,15672,25672四個埠。

如果需要的話,可以@我或私信我。如果需求較大,我會回來,在此進行補充。

單機安裝

下載安裝包

首先是下載。

在阿里雲的Linux上可以通過以下方式,進行下載。

erlang(CentOS7)

 wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm

RabbitMQ(CentOS7)

wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm`

但是,由於牆的緣故,阿里雲的下載速度會非常感人(大約20kb/s)。

所以,建議有梯子的小夥伴,先下載到本地,再進行上傳。

沒有梯子的,那就沒辦法了。算了,我分享一下吧。

erlang(CentOS7):提取碼:aee8

RabbitMQ(CentOS7):提取碼:84lg

安裝

安裝erlang

sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm

安裝socat

sudo yum install -y socat

安裝RabbitMQ

sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm

校驗

沒有校驗的安裝是不合理的。

此時,我們可以通過系統服務的方式,啟動RabbitMQ服務。

見到如下頁面就表示安裝OK了。

RabbitMQ普通模式(多機多節點安裝):

簡單說一下記憶體節點和磁碟節點。RabbitMQ中硬碟節點負責資料落地,負責將元資料落地到硬碟等工作。而記憶體節點不會進行元資料到硬碟的落地。所以如果一個叢集只有記憶體節點,那麼一旦斷電,就徹底GG。另外,建議實際生產,配備多個磁碟節點,避免單點故障。

RabbitMQ的Node名

首先,在安裝RabbitMQ之前,需要對阿里雲伺服器的HostName進行變更。

具體看下圖:

我的伺服器叢集,是node0,node1,node2。有需要的可以改一下。

詳細的原因,以及替代方案,會在後面提及。

修改hosts檔案

通過以下命令

sudo vim /etc/hosts

修改hosts檔案:

::1 localhost   localhost.localdomain   localhost6  localhost6.localdomain6
127.0.0.1   localhost   localhost.localdomain   localhost4  localhost4.localdomain4

172.26.40.223       node0   node0
172.26.40.224       node1   node1
172.26.40.225       node2   node2

前兩行,一般為系統預設生成,可以不進行修改。

而後三行,就是我們需要進行修改和新增的。

後三行,首先IP地址,一般採用內網(因為內網速度快)。如果由於某些原因,無法使用內網IP,那就只能外網IP了。後兩者其實就是RabbitMQ的節點名,此處等同於伺服器的HostName,原因後面再說。

然後,通過SCP,將上述檔案同步到所有叢集伺服器。

sudo scp /etc/hosts root@node1:/etc/

sudo scp /etc/hosts root@node2:/etc/

PS:期間,會需要你輸入另外兩臺伺服器的對應密碼(否則,豈不是誰都可以向你伺服器傳檔案)。

同步erlang的cookie檔案

由於RabbitMQ的叢集是基於其實現語言erlang自身的分散式實現。所以我們需要通過同步erlang的cookie檔案,來幫助RabbitMQ實現叢集。就類似於,大家都有相同的erlang.cookie,表示大家是自己人,可以相互通訊。

在node0伺服器上,執行以下語句:

scp /var/lib/rabbitmq/.erlang.cookie root@node1:/var/lib/rabbitmq/

scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/

防火牆

之前已經介紹了。不再贅述。

叢集新增

啟動RabbitMQ

通過以下命令,啟動所有節點的RabbitMQ例項。

sudo systemctl start rabbitmq-server

將node1新增到叢集(node0的叢集)

停止RabbitMQ應用(與停止例項是不同的)

rabbitmqctl stop_app

重置RabbitMQ設定

rabbitmqctl reset

加入叢集

rabbitmqctl join_cluster rabbit@node0 --ram

PS:叢集新增節點成功,應該可以看到如下效果:

啟動RabbitMQ應用

rabbitmqctl start_app

校驗叢集

rabbitmqctl cluster_status

PS:當然,也可以直接從Web管理介面,更直觀地看到。

PS:其實,單機模式下,各個節點就是叢集。不過是由單個磁碟節點組成的單節點叢集。

**重複該過程,將其它節點也添入到node0的叢集中。

最終可以在Web管理介面,看到如下效果圖,表示RabbitMQ多機多節點叢集構建成功。

PS:圖中Info中有標明,當前node0為disc節點,而node1與node2為RAM節點。

擴充套件(改變節點型別)

按照上述的方式,構建出來的叢集,是一個磁碟節點+多個記憶體節點。為了提高可用性。往往需要複數個磁碟節點。所以,這裡簡單介紹一下切換節點型別的方式。

停止RabbitMQ應用

rabbitmqctl stop_app

改變當前RabbitMQ例項在叢集中的節點型別

rabbitmqctl change_cluster_node_type disc

PS:叢集節點型別切換成功,應該可以看到如下效果:

啟動RabbitMQ應用

rabbitmqctl start_app

PS:叢集節點型別修改成功,應該可以看到如下Web管理介面:

常見Bug修復

叢集節點新增失敗

也就是執行以下語句時,出現異常:

rabbitmqctl join_cluster rabbit@node1 --ram

異常截圖:

其實,根本原因就是由於RabbitMQ的節點名稱造成的。

其中異常資訊,已經明確地說了:Hostname mismatch:XXXXXX

就是由於阿里雲的預設HostName是隨機生成的,而RabbitMQ的節點名,預設採用了伺服器的HostName。

解決方案有兩個:

  • 如之前提到的,直接修改阿里雲伺服器的HostName,一勞永逸。
  • 修改RabbitMQ的預設節點名。在/etc/rabbitmq/rabbitmq-env.conf(初始不存在)增加以下內容:
 NODENAME=node1

節點停止應用失敗/無法檢視節點叢集資訊

也就是執行以下語句時,出現異常:

rabbitmqctl stop_app

rabbitmqctl cluster_status

異常截圖:


其實這是由於erlang.cookie是在RabbitMQ啟動後替換,而導致的衝突。

解決辦法:

通過以下命令重啟服務即可

systemctl restart rabbitmq-server

RabbitMQ普通模式(單機多節點安裝)

由於這個不涉及多個真實伺服器,所以比較簡單。我就不再贅述。

簡單引用一下WizMime大佬的過程。

準備工作

準備一臺已經安裝好RabbitMQ的機器

啟動RabbitMQ

修改預設節點名(非必要),在/etc/rabbitmq/rabbitmq-env.conf增加以下內容

NODENAME=rabbit1

RabbitMQ單機多節點時需要改為手動啟動,先停止執行中的RabbitMQ服務。

sudo systemctl stop rabbitmq-server

啟動第一個節點

rabbitmq-server -detached

啟動第二個節點

RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached

啟動第三個節點

RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

將第二個節點rabbit2加入到叢集中

停止rabbit2的應用
rabbitmqctl -n rabbit2 stop_app

PS:-n表示針對特定節點進行操作

重置 rabbit2 的設定
rabbitmqctl -n rabbit2 reset
rabbit2 節點加入到 rabbit1的叢集中
rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram
啟動 rabbit2 節點
rabbitmqctl -n rabbit2 start_app

rabbit3類似操作

校驗

通過

rabbitmqctl cluster_status

檢視叢集狀態,看到{running_nodes,[rabbit3@node1,rabbit2@node1,rabbit1@node1]}說明節點已啟動成功。

PS:同樣也可以從Web管理介面檢視。

防火牆

注意防火牆相關配置,尤其這次增加了許多埠。

sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent

sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent

sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent

sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

sudo firewall-cmd --zone=public --add-port=5673/tcp --permanent

sudo firewall-cmd --zone=public --add-port=25673/tcp --permanent

sudo firewall-cmd --zone=public --add-port=15673/tcp --permanent

sudo firewall-cmd --zone=public --add-port=5674/tcp --permanent

sudo firewall-cmd --zone=public --add-port=25674/tcp --permanent

sudo firewall-cmd --zone=public --add-port=15674/tcp --permanent

映象佇列模式叢集

其實就是依賴之前實現的多主叢集轉發資料模式,再通過Web管理頁面的一些設定即可實現。

所以不存在部署方面的問題