RabbitMQ叢集配置,rabbitmq叢集
參考文檔:
本文涉及rabbitmq的基本安裝,基本的叢集配置。
一.環境1. 作業系統
CentOS-7-x86_64-Everything-1511
2. 版本
haproxu版本:1.7.7
erlang版本:20.0
rabbitmq版本:rabbitmq-server-3.6.10
https://bintray.com/rabbitmq/rabbitmq-server-rpm/download_file?file_path=rabbitmq-server-3.6.10-1.el7.noarch.rpm
3. 拓撲
二.RabbitMQ安裝配置(單機)
以節點rmq-node1為例,rmq-node2/3適當調整。
1. 安裝erlang
RabbbitMQ基與erlang開發,首先安裝erlang,這裡採用yum方式。
1)更新EPEL源
#yum官方源無erlang;#安裝EPEL:http://fedoraproject.org/wiki/EPEL/FAQ#howtouse[root@rmq-node1 ~]# rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm[root@rmq-node1 ~]# yum install foo
2)添加erlang解決方案庫
#如果不添加erlang解決方案,yum安裝的erlang版本會比較老;#解決方案添加及安裝請見(根據OS選擇):https://www.erlang-solutions.com/resources/download.html[root@rmq-node1 ~]# wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm[root@rmq-node1 ~]# rpm -Uvh erlang-solutions-1.0-1.noarch.rpm#需要安裝驗證簽名的公開金鑰;[root@rmq-node1 ~]# rpm --import https://packages.erlang-solutions.com/rpm/erlang_solutions.asc
3)安裝erlang
#下載速度會比較慢[root@rmq-node1 ~]# yum install erlang -y
2. 安裝RabbitMQ1)下載RabbitMQ
[root@rmq-node1 ~]# wget https://bintray.com/rabbitmq/rabbitmq-server-rpm/download_file?file_path=rabbitmq-server-3.6.10-1.el7.noarch.rpm[root@rmq-node1 ~]# mv download_file\?file_path\=rabbitmq-server-3.6.10-1.el7.noarch.rpm rabbitmq-server-3.6.10-1.el7.noarch.rpm
2)匯入認證簽名
[root@rmq-node1 ~]# rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
3)安裝
#yum安裝使用已下載的rpm包本地安裝,但可能會涉及到取依賴包,同樣需要匯入認證簽名;#下載安裝請見:http://www.rabbitmq.com/install-rpm.html[root@rmq-node1 ~]# yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm -y
3. 啟動1)設定開機啟動
[root@rmq-node1 ~]# systemctl enable rabbitmq-server
2)啟動
[root@rmq-node1 ~]# systemctl start rabbitmq-server
4. 驗證1)查看狀態
[root@rmq-node1 ~]# systemctl status rabbitmq-server
2)查看日誌
#日誌中給出了rabbitmq啟動的重要訊息,如node名,$home目錄,cookie hash值,記錄檔,資料存放區目錄等;#給出的資訊會指出無設定檔(如),預設安裝沒有此檔案[root@rmq-node1 ~]# cat /var/log/rabbitmq/rabbit@rmq-node1.log
5. rabbitmq.conf
#手工建目錄,將配置範例檔案拷貝到配置目錄並改名[root@rmq-node1 ~]# mkdir -p /etc/rabbitmq[root@rmq-node1 ~]# cp /usr/share/doc/rabbitmq-server-3.6.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config#配置重啟生效[root@rmq-node1 ~]# systemctl restart rabbitmq-server#另外還可以建環境設定檔:/etc/rabbitmq/rabbitmq-env.conf
6. 安裝web管理外掛程式
#management plugin預設就在RabbitMQ的發布版本中,enable即可#服務重啟,配置生效[root@rmq-node1 ~]# rabbitmq-plugins enable rabbitmq_management
7. 設定iptables
#tcp4369連接埠用於叢集鄰居發現;#tcp5671,5672連接埠用於AMQP 0.9.1 and 1.0 clients使用;#tcp15672連接埠用於http api與rabbitadmin訪問,後者僅限在management plugin開啟時;#tcp25672連接埠用於erlang分布式節點/工具通訊[root@rmq-node1 ~]# vim /etc/sysconfig/iptables-A INPUT -p tcp -m state --state NEW -m tcp --dport 4369 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 5671 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 5672 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 15672 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 25672 -j ACCEPT[root@rmq-node1 ~]# service iptables restart
8. Management plugin登入賬1)guest帳號
#rabbit預設只有guest帳號,但為了安全,guest帳號只能從localhost登入,如果需要guest帳號可以遠程登入,可以設定rabbitmq.conf檔案:#根據說明,取消第64行參數的注釋與句末的符號;建議不開啟guest帳號的遠程登入;#服務重啟,配置生效。[root@rmq-node1 ~]# vim /etc/rabbitmq/rabbitmq.config
2)CLI建立登入帳號
#“rabbitmqctl add_user”添加帳號,並設定密碼[root@rmq-node1 ~]# rabbitmqctl add_user admin admin@123#”rabbitmqctl set_user_tags”設定帳號的狀態[root@rmq-node1 ~]# rabbitmqctl set_user_tags admin administrator#“rabbitmqctl set_permissions”設定帳號的許可權[root@rmq-node1 ~]# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"#“rabbitmqctl list_users”列出帳號[root@rmq-node1 ~]# rabbitmqctl list_users
9. Management plugin登入驗證
瀏覽器訪問:http://172.16.3.231:15672
1)guest帳號登入
2)CLI建立的帳號登入
三.叢集配置
RabbitMQ利用erlang的分布式特性組建叢集,erlang叢集通過magic cookie實現,此cookie儲存在$home/.erlang.cookie,這裡即:/var/lib/rabbitmq/.erlang.cookie,需要保證叢集各節點的此cookie一致,可以選取一個節點的cookie,採用scp同步到其餘節點。
1. 同步cookie
#注意.erlang.cookie檔案的許可權,rabbitmq帳號,許可權400或600即可,為組或other帳號賦權會報錯[root@rmq-node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@172.16.3.232:/var/lib/rabbitmq/[root@rmq-node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@172.16.3.233:/var/lib/rabbitmq/
2. 配置hosts
#組建叢集時採用”cluster@node”的格式,需要提前設定hosts檔案;#rmq-node2/3配置相同[root@rmq-node1 ~]# echo -e "172.16.3.231 rmq-node1\n172.16.3.232 rmq-node2\n172.16.3.233 rmq-node3" >> /etc/hosts
3. 使用-detached參數啟動節點
#rmq-node2/3因更換了.erlang.cookie,使用此命令會無效並報錯,可以依次採用“systemctl stop rabbitmq-server”停止服務,“systemctl start rabbitmq-server”啟動服務,最後再“rabbitmqctl stop”[root@rmq-node1 ~]# rabbitmqctl stop[root@rmq-node1 ~]# rabbitmq-server -detached
4. 組建叢集(rmq-node2&rmq-node3)1)組建叢集(disk節點)
#“rabbitmqctl join_cluster rabbit@rmq-node1”中的“rabbit@rmq-node1”,rabbit代表叢集名,rmq-node1代表叢集節點;rmq-node2與rmq-node3均串連到rmq-node1,它們之間也會自動建立串連。#如果需要使用記憶體節點,增加一個”--ram“的參數即可,如“rabbitmqctl join_cluster --ram rabbit@rmq-node1”,一個叢集中至少需要一個”disk”節點 [root@rmq-node2 ~]# rabbitmqctl stop_app[root@rmq-node2 ~]# rabbitmqctl join_cluster rabbit@rmq-node1[root@rmq-node2 ~]# rabbitmqctl start_app[root@rmq-node3 ~]# rabbitmqctl stop_app[root@rmq-node3 ~]# rabbitmqctl join_cluster rabbit@rmq-node1[root@rmq-node3 ~]# rabbitmqctl start_app
2)修改disk節點到記憶體節點
#如果節點已是"disk"節點,可以修改為記憶體節點[root@rmq-node3 ~]# rabbitmqctl stop_app[root@rmq-node3 ~]# rabbitmqctl change_cluster_node_type ram[root@rmq-node3 ~]# rabbitmqctl start_app
5. 查看叢集狀態
[root@rmq-node1 ~]# rabbitmqctl cluster_status
6. 設定鏡像隊列高可用
到目前為止,叢集雖然搭建成功,但只是預設的普通叢集,exchange,binding等資料可以複製到叢集各節點。
但對於隊列來說,各節點只有相同的中繼資料,即隊列結構,但隊列實體只存在於建立改隊列的節點,即隊列內容不會複製(從其餘節點讀取,可以建立臨時的通訊傳輸)。
這樣此節點宕機後,其餘節點無法從宕機節點擷取還未消費的訊息實體。如果做了持久化,則需要等待宕機節點恢複,期間其餘節點不能建立宕機節點已建立過的持久化隊列;如果未做持久化,則訊息丟失。
#任意節點執行均可如下命令:將所有隊列設定為鏡像隊列,即隊列會被複製到各個節點,各個節點狀態保持一直;#可通過命令查看:rabbitmqctl list_policies;#鏡像隊列相關解釋與設定&操作等請見:http://www.ywnds.com/?p=4741[root@rmq-node1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
四.設定Haproxy1. haproxy.cfg
#這裡只給出針對rabbit_cluster的監控配置,global與default配置請見:http://www.cnblogs.com/netonline/p/7593762.html[root@haproxy-1 ~]# vim /usr/local/haproxy/etc/haproxy.cfglisten RabbitMQ_Cluster #監控模式 mode tcp #負載平衡模式 balance roundrobin #訪問連接埠 bind 0.0.0.0:5672 #後端伺服器檢測 server rmq-node1 172.16.3.231:15672 check inter 2000 rise 2 fall 3 server rmq-node2 172.16.3.232:15672 check inter 2000 rise 2 fall 3 server rmq-node3 172.16.3.233:15672 check inter 2000 rise 2 fall 3
2. 效果驗證
五.注意事項與遇到的問題1. 注意事項2. 網路磁碟分割問題
在完成叢集後,遇到過1個"partitioned network"的錯誤。
網路磁碟分割具體問題請參考:https://www.rabbitmq.com/partitions.html
中文翻譯:https://my.oschina.net/moooofly/blog/424660
1)現象
rmq-node1& rmq-node3與rmq-node2分裂成了兩個網路磁碟分割
2)查看日誌
查看rmq-node1與rmq-node2日誌可以印證網路磁碟分割的形成時間
3)原因
如果其他節點無法串連該節點的時間達到1分鐘以上(net_ticktime設定),則Mnesia判定某個其他節點失效。當這兩個串連失效的節點恢複串連狀態時,都會認為對端已down 掉,此時Mnesia將會判定發生了網路磁碟分割,這種情況會被記錄進 RabbitMQ 的記錄檔中。
導致網路磁碟分割的原因有很多,常見如下:
發生網路磁碟分割時,各分區均能夠獨立運行,同時認為其餘節點(分區)已處於不可用狀態。其中 queue、binding、exchange 均能夠在各個分區中建立和刪除;當由於網路磁碟分割而被割裂的鏡像隊列,最後會演變成每個分區中產生一個 master ,並且每一個分區均能獨立進行工作,其他未定義和奇怪的行為也可能發生。
4)恢複手工處理
#更簡單直接的方式是:重啟叢集所有節點,但需要保證重啟的第一個節點是可信任的節點。
#同時也可以觀察3個節點的日誌。
自動處理
RabbitMQ提供3種自動處理方式:pause-minority mode, pause-if-all-down mode and autoheal mode;預設的行為是ignore mode,不做處理,此模式適合網路非常穩定的情境。
自動處理設定檔:/etc/rabbitmq/rabbitmq.conf,第279行"cluster_partition_handling"項,可配置參數如下:
pause_minority
{pause_if_all_down, [nodes], ignore | autoheal}
autoheal
設定檔請參考:https://www.rabbitmq.com/configure.html#configuration-file