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管理頁面的一些設定即可實現。
所以不存在部署方面的問題