之所以要寫這篇文章,是因為11月19日正好是個週五,一下班匆匆忙忙拿起書包往家趕,誰知剛出公司大門就連續接到好幾個報警電話,伺服器崩掉了。趕緊回公司定位問題,發現公司發了一條公眾號,連結到商城小程式的使用者突增,導致伺服器CPU飆高,資料庫使用率也瞬間飈到100%。怎麼辦,趕緊手動擴容,臨時增加了兩臺16C伺服器,把壓力過高的服務擴容到這兩臺資料,資料庫之前就配置了自動擴容,很快就自動恢復了。雖然有驚無險,但是前前後後也耗費了半個多小時。
為了避免以後遇到同樣的問題,花了兩天時間,利用阿里雲彈性伸縮服務,實現服務在壓力過高時,自動擴容,壓力恢復後再自動縮容。
背景:
一,生產環境硬體構成:
- 阿里雲ECS主機
- 阿里雲RDS資料庫
- 阿里雲MOngoDB資料庫
- 阿里雲Redis資料庫
二,生產環境服務管理:
Rancher中使用Cattle容器編排排程引擎
關於rancher的使用不做詳細描述,有興趣的同學可以去查閱相關資料
整體實現思路:
開始操作:
1,建立伸縮組。
登入阿里雲彈性伸縮控制檯,建立伸縮組,下圖是我在生產所使用的
2,建立伸縮規則。
點選伸縮組管理,進入剛剛建立的伸縮組,點選伸縮規則與伸縮活動,建立伸縮規則
這裡我建立了兩個規則,一個是簡單增加主機(increase),另外一個簡單減少主機(decrease)
3,建立生命週期掛鉤。用於主機在建立後執行初始化指令碼,自動新增到rancher,並擴容指定服務,實現服務的自動擴容和排程。同時需要自動增加MongoDB以及Redis資料庫白名單,避免服務出現連線資料庫超時
第一步:實現新增的主機自動初始化,並自動新增到rancher,先要製作一個shell指令碼
初步確定需要執行的命令如下(最終整理後的指令碼在演示1,2 之後):
apt-get -y update
apt-get -y upgrade
#安裝rancher指定的的docker
curl https://releases.rancher.com/install-docker/18.06.sh | sh
#註冊主機到rancher(該指令碼涉及隱私,所以只展示一部分),步驟在下面:演示1
sudo docker run -e CATTLE_HOST_LABELS='group=ext' --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher***********
#利用rancher提供的webhooks實現服務自動擴容,需要指定服務,獲取觸發地址步驟在下面:演示2
curl -X POST "http://101.200.****:18080/v1-webhooks/endpoint?key=****"
演示1:註冊主機到rancher,在rancher新增主機頁面找到該指令
建議新增一個主機標籤,方便服務自動排程到該標籤的主機,如圖第五步,就是我們要的註冊主機指令碼
演示2:利用webhooks實現服務擴容
建立好之後複製觸發地址,http://101.200.****:18080/v1-webhooks/endpoint?key=****
簡單整理,得到最終執行的指令碼:
拿到指令碼後先暫存到本地,接下來開始正式建立生命週期掛鉤,回到阿里雲伸縮組管理,進入生命週期掛鉤頁面,建立生命週期掛鉤
選中OOS模板,設定引數,把剛剛整理好的指令碼貼上到此處,點選建立
同樣的步驟,在建立兩個生命週期掛鉤實現自動加入資料庫白名單,最終如圖
測試生命週期掛鉤是否生效:
點選伸縮規則,手動執行剛剛建立的擴容規則,會自動建立一個ECS主機,如果該主機會動自動加入到rancher控制檯,並自動擴容服務,說明掛鉤已生效
四,自動觸發擴容
1,進入阿里云云監控控制檯,建立報警規則,這裡我監控ECS主機CPU狀態,根據需要自己配置,配置觸發彈性伸縮,指定彈性伸縮規則,是擴容還是縮容,操作如圖
生產環境使用還需要做一個服務正常後自動縮容服務,自動釋放主機。操作大同小異
到此為止,自動擴容已經全部完成,整個過程並不複雜,但是小坑還是比較多的,這兒不做詳細講解,有問題的同學在評論區交流