Spring升級案例之IOC介紹和依賴注入(轉載)
簡述
RabbitMQ是流行的開源訊息佇列系統,本身已經具備了較強的併發處理速度及執行穩定性,然而在大規模的實際應用中,往往還需要使用叢集配置來保證系統中訊息通訊部分的高可用性,併發處理效能及異常恢復能力。這裡將介紹一種實用的訊息叢集架構,以及一種能夠快速、高效、可靠地部署並配置訊息叢集的方式,通過這種方法,我們可以在系統部署時僅需短短几分鐘就能完成規模化的訊息叢集架設,極大地提高了工作效率和部署成功率。
叢集結構設計
RabbitMQ 已經支援與 Erlang 整合的 active/active cluster 方案,但是為了實現叢集的高可用及自動化管理,我們還需要一個叢集管理工具,來負責監控各節點訊息服務的執行狀態,以及在發現異常時自動執行一些預訂的恢復動作,從而增強叢集的容錯恢復能力和持續服務能力。我們這裡選擇的是 Pacemaker 加 RabbitMQ 的整合方式。
叢集結構如下圖所示,RabbitMQ clustering 部分提供訊息叢集內部心跳檢查及資料管理和同步功能,Pacemaker 則負責監控 RabbitMQ 各節點的服務狀態及異常恢復,保證叢集正常執行。
圖 1.RabbitMQ 叢集結構
部署準備工作
準備工作主要分為如下幾個步驟:
- 配置系統軟體源,需要包括 Erlang,RabbitMQ,Pacemaker 及相關的依賴包。
本文采用的各主要軟體及版本包括:rhel6.5,rabbitmq3.4.4,erlang17.0,pacemaker1.1.12,corosync2.3.4,可以根據實際情況增減所需依賴。 - 這裡使用 Chef 實現自動化安裝,需要一臺配置好的 Chef Server,詳細介紹請參考 Chef Server安裝配置。
- 下載需要的社群 Cookbook:
如果你的軟體源裡已經包含了 Erlang 相關 package,可以不用下載 Erlang Cookbook,只需修改RabbitMQ裡的 Erlang 安裝方式為本地安裝就可以,本文采用本地安裝方式,需要修改 RabbitMQ Cookbook 中以下檔案:
- 修改 metadata.rb,去除 RabbitMQ Cookbook 的 Erlang 依賴
1 |
#depends 'erlang'
|
- 修改 recipe/default.rb 為本地安裝
1 2 |
#include_recipe 'erlang'
package 'erlang'
|
如果系統啟用了 iptables,還需要下載使用 iptables Cookbook 來開放相應埠。
自動安裝流程
為實現本文使用的訊息叢集結構,需要在所有訊息節點上分別搭建RabbitMQ的叢集與 Pacemaker 的叢集,設計完成的自動指令碼安裝配置過程如下:
- 新增所有節點的 ip hostname 對映至/etc/hosts,用作RabbitMQ cluster 之間通訊
- 安裝RabbitMQ,設定統一的 erlang cookie,通過配置檔案 (/etc/rabbitmq/rabbitmq.config) 來建立 cluster,並開放相應埠
- 4369 (epmd), 25672 (Erlang distribution)
- 5672, 5671 (AMQP 0-9-1 without and with TLS)
- 15672 (if management plugin is enabled)
- 61613, 61614 (if STOMP is enabled)
- 1883, 8883 (if MQTT is enabled)
- 安裝 Pacemaker,並開放相應埠
- 5405 (corosync)
- 建立新的RabbitMQ賬戶供使用者使用。從 rabbitmq3.3.0 版本開始,guest 賬戶預設不支援遠端訪問,需另建帶相應許可權的遠端訪問帳號。
- 建立 pacemaker rabbitmq resource,並 clone 至所有節點。
注意:上述 1、2、3 步驟需要在所有節點執行,4、5 步只需在任一臺 cluster 節點上執行一次就可以對整個叢集生效。
詳細實現
將所有下載的 Cookbook 放至相同目錄下,按以下步驟建立並修改新的 rabbitmq-ha cookbook,實現自動安裝流程:
- 在 Chef Server 上使用 knife 命令建立 rabbitmq-ha cookbook
1 knife cookbook create rabbitmq-ha
- 進入建立的 rabbitmq-ha cookbook 目錄,修改檔案 metadata.rb,增加以下 Cookbook 依賴
1 2 3 depends iptables
depends rabbitmq
depends pacemaker
- 在 rabbitmq-ha cookbook 中新增 iptables 埠模板檔案 templates/default/port.erb
1 2 3 4 5 -A FWR -p tcp --dports 5672 -j ACCEPT
-A FWR -p tcp --dports 4369 -j ACCEPT
-A FWR -p tcp --dports 25672 -j ACCEPT
-A FWR -p udp --dports 5405 -j ACCEPT
-A FWR -p udp --sports 5405 -j ACCEPT
- 新增安裝指令碼 recipe/ha-install.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 註冊埠
iptables_rule 'port'
# 新增 ip hostname 對映
execute 'add qpd hostnames to /etc/hosts' do
command <<-EOF
echo "# Hosts of rabbitmq nodes" >> /etc/hosts
echo "192.168.1.10 rab001" >> /etc/hosts
echo "192.168.1.11 rab002" >> /etc/hosts
EOF
end
# 安裝 rabbitmq
include_recipe 'rabbitmq'
# 安裝 pacemaker
include_recipe 'pacemaker'
- 新增叢集配置指令碼 recipe/ha-setup.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 建立 rabbitmq 使用者
rabbitmq_user 'rabbituser' do
password 'password'
action :add
end
# 設定許可權
rabbitmq_user 'rabbituser' do
vhost '/'
permissions '.* .* .*'
action :set_permissions
end
# 建立 clone 資源
pacemaker_clone 'rabbitmq' do
name "RABBITMQ"
agent "ocf:rabbitmq:rabbitmq-server"
params { "nodename" => "rabbit@`hostname -s`", "config_file" => "/etc/rabbitmq/rabbitmq" }
op {'monitor' => { 'interval' => '10s', 'timeout' => '30s' } }
action :create
end
- 在 Cookbook 同級目錄建立 environment 檔案:rabbit-ha-env.json,並配置RabbitMQ相關引數
1 2 3 4 5 6 7 8 9 10 11 {
"name": "rabbit-ha-env",
"json_class": "Chef::Environment",
"chef_type": "environment",
"override_attributes": {
"rabbitmq": {
"cluster": true,
"cluster_disk_nodes": ["rabbit@rab001", "rabbit@rab002"]
}
}
}
安裝
安裝步驟如下:
- 進入存放所有 Cookbook 的目錄,上傳所有 Cookbook 至 Chef Server
1 knife cookbook upload -a -o .
也可以分別單獨上傳。
1 knife cookbook upload rabbitmq-ha -o .
- 上傳 environment 檔案
1 knife environment from file rabbit-ha-env.json
- 順序執行安裝命令,等待前一個節點安裝完成後再執行下個節點
1 2 3 4 knife bootstrap 192.168.1.10 -x root -P ×××××× -r
"recipe[rabbitmq-ha::ha-install]" -E rabbit-ha-env
knife bootstrap 192.168.1.11 -x root -P ×××××× -r "recipe[rabbitmq-ha::ha-install],
recipe[rabbitmq-ha::ha-setup]" -E rabbit-ha-env
驗證
安裝成功後,SSH 登入任意一個 RabbitMQ 節點檢查安裝狀態
- 檢查 RabbitMQ 叢集狀態,所有節點處於 running list 中:
1 |
rabbitmqctl cluster_status
|
- 檢查 Pacemaker 叢集狀態,所有節點 online 並且 started
1 |
pcs status
|
叢集管理
配置完成後 Pacemaker 叢集會自動對各節點 RabbitMQ 的服務執行狀態進行監控管理,RabbitMQ 叢集負責對外提供訊息服務。以下是叢集常用管理命令:
- 通過 Pacemaker 來管理各節點 RabbitMQ 服務執行狀態
- 停止監控節點並停止 Rabbit 服務:
1 crm_standby -U rab001 -v on
- 重新開啟監控開啟 Rabbit 服務:
1 crm_standby -U rab001 -v off
- 配置好 resource 後 Pacemaker 已經接管了 RabbitMQ 服務,啟停 Pacemaker 服務同樣會導致 RabbitMQ 服務的啟動和停止
1 service pacemaker restart
- RabbitMQ 叢集管理
- 檢視使用者列表
1 |
rabbitmqctl list_users
|
- 檢視使用者許可權
1 |
rabbitmqctl list_user_permissions rabbituser
|
- 檢視 HA 策略
1 |
rabbitmqctl list_policies
|
結束語
在大規模的企業應用系統中,負責訊息收發的模組往往承擔著非常重要的中間角色和非常龐大的處理壓力,所以在系統的設計階段就必須對可能出現的業務瓶頸作出合理的預判,並採取相應的架構設計來適當應對。在所有系統的實際使用階段,擁有快速可靠地部署穩定、可用、不間斷服務的能力,以及適當的自我恢復,無疑是可以影響產品成功與否的關鍵性因素,所以必須審慎對待