Rabbitmq-Peer Discovery on AWS (EC2)
AWS上的對等發現(EC2)
aws(ec2)特定發現機制可以通過插件獲得,它為節點提供了兩種發現其對等點的方法:
1.使用ec2執行個體标記
2.使用aws自動标度組成員
這兩種方法都依賴于aws特定的API,是以無法在其他IaaS環境中工作。
一旦檢索到叢集成員執行個體清單,最終節點名稱使用執行個體主機名或IP位址計算。
使用AWS對等發現機制時,節點将延遲啟動以擷取随機選擇的值,以降低初始群集形成期間競争條件的可能性。
1.建立角色和Accesskey
在aws平台建立一個角色綁定一個使用者,具體步驟不示範,角色權限如下圖:
内容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScalingInstances",
"ec2:DescribeInstances"
],
"Resource": [
"*"
]
}
]
}
為上述角色綁定的使用者建立通路密鑰:
請妥善保管密鑰下面将使用密鑰等資訊
2.Rabbitmq部署
準備搭建Rabbitmq的鏡像和機器,因為此對等發現隻針對AWS-EC2,是以選用AWS的鏡像
啟動執行個體選擇鏡像:
Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-b70554c8
這裡選用的Amazon Linux 2 也就是我們常用的Centos鏡像,根據自己需求設定好相關安區組子網等選項啟動執行個體。
說明:通過插件可以獲得更多的對等發現機制。從3.7.0開始,RabbitMQ附帶對等發現插件,是以我們安裝的Rabbitmq-server要選擇大于等于3.7.0的版本
3.配置AWS CLI
對等發現機制及aws内部服務調用很多都是通過aws cli去調用API執行的,此步很重要。
aws configure
根據提示輸入:
AWS Access Key ID、密碼、可用區、輸出格式,這裡的access key 資訊就是之前在使用者界面建立的。
4.安裝Erlang
vim /etc/yum.repos.d/rabbitmq-erlang.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7
gpgcheck=1
gpgkey=https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
yum install erlang -y
5.安裝Rabbitmq-server
5.安裝Rabbitmq-server
wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.6/rabbitmq-server-3.7.6-1.el7.noarch.rpm
rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
yum install rabbitmq-server-3.7.6-1.el7.noarch.rpm -y
6.啟動插件并設計Rabbitmq開機啟動
rabbitmq-plugins --offline enable rabbitmq_peer_discovery_aws #aws對等發現插件(一定在啟動rabbitmq之前啟動)
rabbitmq-plugins enable rabbitmq_management (管理插件)
systemctl enable rabbitmq-server
7.修改Rabbitmq可用guest登入方式
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.6/ebin/rabbit.app
#修改39行把[]裡的内容去掉,修改後的結果如下:
{loopback_users, []},
8.優化系統限制
運作生産工作負載的RabbitMQ安裝可能需要系統限制和核心參數調整,以便處理更多的并發連接配接和隊列。需要調整的主要設定是打開檔案的最大數量,ulimit -n
許多作業系統上的預設值太低(例如,在幾個Linux發行版上為1024),個人建議在生産環境中為使用者rabbitmq至少允許65536個檔案描述符。
有兩個限制作業系統核心允許的最大打開檔案數(fs.file-max)和每個使用者限制(ulimit -n),前者必須高于後者
fs.file-max設定
echo 'fs.file-max = 65535' >> /etc/sysctl.conf
解除 Linux 系統的最大程序數和最大檔案打開數限制
cat /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
##以上4行在文檔末尾添加
=====================================
#為了避免重新開機失效,加入rc.local
echo 'ulimit -SHn 65535' > /etc/rc.local
rabbitmq-server配置
sed -i '11a LimitNOFILE=20000' /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service
在[Service]子產品中添加LimitNOFILE=20000 (具體參數根據需求調整)
systemctl daemon-reload 修改完Rabbitmq服務需要重新加載服務
9.修改.erlang.cookie 權限
cd /var/lib/rabbitmq/ && chown rabbitmq.rabbitmq .erlang.cookie
預設安裝完服務屬主屬組都是root,在啟動rabbitmq時會報錯,是以在啟動前先修改一下,另外對等發現注冊依賴于.erlang.cookie 是以注冊節點必須和主節點的 cookie值必須一緻,
我們制作成鏡像應用autoscaling自行擴充是以就不會存在cooke不一緻的問題了。
10.Rabbitmq配置檔案
vim /etc/rabbitmq/rabbitmq.conf
#1.這部分設定了access_key等相關資訊和告訴Rabbitmq後端的對等發現模式是 autoscaling_grou
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_aws
cluster_formation.aws.region = us-east-1
cluster_formation.aws.access_key_id = AKIAIMYGK*********
cluster_formation.aws.secret_key = d9O6apD/Vyc9t*********************
cluster_formation.aws.use_autoscaling_group = true
#2.這部分設定了rabbitmq的一些基本優化
listeners.tcp.default = 5672 #要偵聽AMQP連接配接的端口或主機名
vm_memory_high_watermark.relative = 0.8 #觸發流控制的記憶體門檻值。可以是絕對的,也可以是相對于作業系統可用的RAM數量
cluster_partition_handling = pause_minority #如何處理網絡分區,預設值為ignore
loopback_users = none #允許預設來賓使用者遠端連接配接 需要修改為none 預設值為localhost
heartbeat = 60 #表示伺服器在connection.tune幀中發送的心跳延遲(以秒為機關)的值。如果設定為0,則禁用心跳,禁用心跳可能會在具有大量連接配接的情況下提高性能,但可能會導緻在存在關閉非活動連接配接的網絡裝置時連接配接中斷。
vm_memory_high_watermark_paging_ratio = 0.75 #隊列開始将消息分頁到磁盤以釋放記憶體的高水位限制的分數
disk_free_limit.absolute = 2GB #RabbitMQ存儲資料的分區的磁盤可用空間限制。當可用磁盤空間低于此限制時,将觸發流量控制。該值可以相對于RAM總量設定,也可以設定為絕對值(以位元組為機關),或者以資訊機關(例如“50MB”或“5GB”)設定
collect_statistics = coarse #統計收集模式。主要與管理插件相關 這裡選擇粗略統計
collect_statistics_interval = 2500 #統計資訊收集間隔(毫秒)。主要與管理插件相關。機關:毫秒
queue_master_locator = random #隊列master政策,預設值:client-local 這裡選擇随機
cluster_keepalive_interval = 2500 #節點應該多長時間向其他節點發送keepalive消息(以毫秒為機關)。請注意,這與net_ticktime不同;錯過的keepalive消息不會導緻節點被視為關閉。
hipe_compile = true #設定為true以使用HiPE預編譯RabbitMQ的部分,HiPE是Erlang的即時編譯器。這将以增加啟動時間為代價來增加伺服器吞吐量。您可能會在啟動時延遲幾分鐘後看到20-50%的性能提升。這些數字與工作負載和硬體有很大關系。
#3.管理插件的一些優化參數
management.sample_retention_policies.global.minute = 5
management.sample_retention_policies.global.hour = 60
management.sample_retention_policies.global.day = 1200
management.sample_retention_policies.basic.minute = 5
management.sample_retention_policies.basic.hour = 60
management.sample_retention_policies.detailed.10 = 5
11.啟動Rabbitmq-server
systemctl start rabbitmq-server
12.封裝鏡像
在安裝rabbitmq的建立AMI鏡像,通過此鏡像建立啟動配置,建立auto scaling組驗證結果
13.建立啟動配置和Auto Scaling組
注意建立Auto Scaling組的安全組的時候,相關端口要設定允許,否則影響對等發現
組大小設定為2,為了驗證Auto Scaling建立的2個執行個體是否可以完成自動發現,自動注冊并形成叢集
登入機器驗證:
[root@ip-172-31-11-83 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@ip-172-31-11-83 ...
[{nodes,[{disc,['rabbit@ip-172-31-11-83','rabbit@ip-172-31-25-160']}]},
{running_nodes,['rabbit@ip-172-31-25-160','rabbit@ip-172-31-11-83']},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[{'rabbit@ip-172-31-25-160',[]},{'rabbit@ip-172-31-11-83',[]}]}]
經過檢視通過AutoScaling建立的2個主機自動注冊發現實驗成功,這樣後續配合監控等相關資訊,可以基于封裝好AMI自動擴容,縮容了。