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