叢集部署看過來,低程式碼@AWS智慧叢集的架構與搭建方案

2022-11-28 15:00:47

為了幫助充分利用AWS的託管服務快速構建起一套叢集環境,徹底去掉「單一故障點」,實現最高的可用性,我們準備了《低程式碼智慧叢集@AWS的架構與搭建方案》看完本文,帶你掌握「基於nginx設定伺服器叢集」。

應用場景

如果你需要解決如下的問題,可以考慮搭建一套活字格@AWS智慧叢集:

  • 保障系統高可用,全面降低停服風險
  • 在做好各項效能優化(參考系列教學)的前提下,需要進一步提升效能,以滿足大並行量請求的響應速度

叢集能力

本方案是低程式碼與亞馬遜AWS提供的一套高可用負載均衡解決方案,在低程式碼智慧叢集的基礎上,通過引入ALB等託管服務,進一步提升可用性。本方案提供的主要能力如下:

  • 高可用
  • 負載均衡
  • 可用性監控

特別提示:智慧叢集不相容內建SQLite資料庫,您需要在外聯資料庫上構建資料表和業務。

搭建方案

叢集需要用到亞馬遜提供的EC2負載均衡器(ALB模式)、ElasticCache Redis叢集、Elastic File Systems、RDS for MySQL、CloudWatch託管服務,還需要用到nginx實現應用伺服器內部的埠轉發。對上述技術的瞭解程度,很大程度上決定了您搭建出的叢集的安全性、效能和可用性。

網路拓撲簡圖

為了實現高可用的目標,本方案的應用伺服器設計為位於不同可用區的2臺EC2,其他託管服務也選擇了多可用區的設定。

步驟1:設定EFS

在AWS控制檯中選擇EFS服務,建立檔案系統,點選「自定義」按鈕後,按照下面的推薦值完成設定:

  • 儲存類:標準
  • 掛載目標:選擇至少2個可用區
  • 安全組:選擇的安全組中需要允許2049埠(你可以在EC2服務的控制檯上找到「網路與安全→安全組」建立一個安全組)

建立完成後,等檔案系統的檔案系統狀態變成「可用」,點選剛建立的檔案系統,DNS名稱就是用來存取該EFS的地址,記錄下來備用。

步驟2:設定RDS

RDS的預設安全設定與活字格不相容。所以,在建立資料庫前,你需要建立引陣列,具體做法如下:
在AWS控制檯中選擇RDS服務,在「資源」區域,點選「引陣列」,建立新的引陣列,選擇和建立RDS時一致的版本,範例中組名和描述都設定為「huozige-aws」。點選建立好的引陣列,在搜尋方塊中輸入「log_bin_trust_function_creators」,然後點選「編輯引數」按鈕,將值修改為1。

然後回到控制檯,點選「建立資料庫」,點選「標準建立」後,按照下面的推薦值完成設定:

  • 引擎型別:MySQL
  • 版本:MySQL 5.6.x、5.7.x、8.0.x都可以,範例選擇的是5.7.38
  • 模板:生產
  • 設定-主密碼:你的登入密碼,範例設定的是123456
  • 資料庫範例類:根據並行使用者數、業務資料量和預算選擇
  • 分配的儲存空間:根據業務資料量選擇,需要注意的是活字格不會將使用者上傳的檔案存放的資料庫,不佔用該儲存空間
  • 多可用區範例:建立備用範例
  • 連線-公開存取:是
  • 安全組:選擇的安全組中需要允許3306埠
  • 其他設定-引陣列:剛建立的huozige-aws

建立完成後,等資料庫的狀態變成「可用」,點選剛建立的資料庫範例,找到連線和安全性索引標籤下的「終端節點」,這個就是資料庫服務的地址,記錄下來備用。使用本地安裝的MySQL Workbrench等工具登入到該地址,建立一個userservicedb資料庫備用。

步驟3:設定EC Redis

在AWS控制檯中選擇ElastiCache服務,點選右側選單中「資源→Redis叢集」,點選「建立Redis叢集」後,按照下面的推薦值完成設定:

  • 叢集模式:已啟用
  • 位置-多可用區:已啟用
  • 引擎版本:推薦6.2
  • 節點型別:根據使用者數量和預算選擇,活字格會使用Redis儲存使用者對談,範例選擇的是cache.t3.medium(3.09GB)
  • 子網組設定:建立新的子網組,確保「已選擇 子網」包含不少於2個可用區
  • 安全組:選擇的安全組中需要允許6379埠

建立完成後,等叢集的狀態變成「可用」,點選剛建立的叢集,找到「主終端節點」,這個就是Redis的地址,記錄下來備用。

步驟4:設定應用伺服器

在AWS控制檯中選擇EC2服務,點選右側選單中「範例→範例」,點選「建立新範例」後,按照下面的推薦值完成設定:

  • 映象:在【亞馬遜雲科技Marketplace】中搜尋「GrapeCity Huozige Lowcode Development Platform」,選擇官方提供的AMI映象
  • 範例型別:根據應用複雜度、並行使用者數和預算選擇,範例中使用的是t3.meduim,推薦用於簡單的部門級應用
  • 子網:應用伺服器需要放到不同的可用區,如cn-northwest-1a和cn-northwest-1b
  • 安全組:選擇的安全組中需要允許22埠(SSH)、22345埠(活字格應用釋出)、8200(用於活字格應用伺服器,可以在nginx.conf中修改)
  • ssh證書:妥善保管瀏覽器下載的pem格式的證書,這是遠端登入EC2的唯一憑據。推薦所有EC2共用同一個證書,這樣在登入時更方便一些

建立完成後,等範例狀態變成「正在執行」後,點選檢視詳情,私有IPv4地址即內網IP,用於設定負載均衡器;公有IPv4 DNS是外網地址,用於監控(EC2範例停止後重新啟動時,公有IPv4地址會發生變化,所以,不能使用這個地址做監控),記錄下這兩個值備用。點選「連線」按鈕,進入SSH使用者端索引標籤,複製「範例」下的ssh命令,記錄備用。

在Windows電腦上,將下載的pem證書拷貝到%homepath%(如C:\Users\Will)下,這裡也是Windows終端的啟動目錄。啟動終端,用EC2共的ssh命令就可以遠端登入到該伺服器,執行下面的安裝和設定操作。

4.1 安裝中文字型

受到版許可權制,我們無法為您預置常用的「微軟雅黑」等中文字型,如果您需要匯出PDF功能,需要手動安裝字型,具體方法見 幫助檔案的第6節

4.2 安裝和設定ngnix

nginx負責將各應用的埠統一成8200(可修改,需要和安全組的設定匹配)。

首先,我們需要安裝nginx。安裝完成後,修改ngnix.conf檔案

sudo apt-get update
sudo apt-get install nginx

在http節點下,為管理控制檯和每一個應用分別建立upstream

# 內建服務指向本機22345固定埠
upstream local-us{
server localhost:22345;
}
# 針對每個應用建立上游,指向本機即可
upstream local-e{
server localhost:8005;
}

然後,在http→server節點下,設定偵聽埠,過濾location並轉發管理控制檯和每一個應用

server {
# 對外的埠號
listen 8200;

server\_name huozige-aws-app-server.com;
proxy\_set\_header   Upgrade $http\_upgrade;
proxy\_set\_header   Connection keep-alive;
proxy\_set\_header   Host $host;
proxy\_cache\_bypass $http\_upgrade;
proxy\_set\_header   X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
proxy\_set\_header   X-Forwarded-Proto $scheme;
proxy\_set\_header   X-Real-IP $remote\_addr;
# 轉發內建服務
location ^~ /UserService/ {
proxy\_pass http://local-us/UserService/;
proxy\_redirect default;
}
# 針對每個應用做轉發,去掉埠號
location ^~ /app\_e/ {
proxy\_pass http://local-e/app\_e/;
proxy\_redirect default;
}
}

組態檔修改完畢,讓nginx做熱載入,不中斷伺服器的前提下,讀取新的設定

sudo nginx -s reload

4.3 掛載EFS目錄

建立掛載用資料夾 /share,然後修改/etc/fstab檔案,再執行重新載入命令,將EFS的檔案系統掛載到該資料夾

sudo mkdir /share
sudo vim /etc/fstab
sudo mount -a

/etc/fstab的內容如下,其中fs-0402a832717e9d61e.efs.cn-northwest-1.amazonaws.com.cn為前面建立的NFS的地址:

fs-0402a832717e9d61e.efs.cn-northwest-1.amazonaws.com.cn:/ /share nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,\_netdev 0 0

4.4 設定活字格負載均衡

完成上述環境準備後,我們需要依次登入應用服務的管理控制檯站點(http://{應用伺服器外網地址}:22345/UserService/ManagementPage/LoginPage),完成叢集設定。設定頁面在【設定】索引標籤的【負載均衡設定】選單。

  • 開啟:勾選,啟用負載均衡設定
  • 資料庫型別:使用者資訊資料庫的型別,範例中採用MySQL
  • 資料庫連結字串:使用者資訊資料庫的連結字串,即剛才搭建的支援伺服器的RDS的userservicedb資料庫
  • Redis服務地址:EC Redis的地址
  • 共用儲存路徑:使用者儲存應用和使用者上傳檔案的共用目錄,即剛才掛載EFS檔案系統的本地目錄

步驟5:設定ALB

ALB的設定分為負載均衡器和目標群組兩部分。在2022.08版本AWS中,ALB的設定介面大多數是英文。

5.1 設定目標群組

首先,你需要基於第四步中建立的應用伺服器資訊設定目標群組。

在AWS控制檯中選擇EC2服務,點選右側選單中「負載均衡→目標群組」,點選Create target group按鈕,按照下面的推薦值完成設定:

  • target type:IP addresses
  • Protocol/Port:HTTP/8000(8000是叢集對外的統一伺服器埠,可修改)
  • Health check path:/UserService/ManagementPage/LoginPage (內建的頁面,更適合用來做健康監測)

點選Next按鈕,在Step 2區域裡,新增步驟4中建立的應用伺服器的內網IP,將Ports設定為8200(步驟4中應用伺服器的應用埠);點選Include as pending below按鈕,將其新增到候選列表,再點選Create target group按鈕完成建立。

提示:沒有關聯到負載均衡器之前,targets的heath status都是Unused

5.2 設定負載均衡器

在AWS控制檯中選擇EC2服務,點選右側選單中「負載均衡→負載均衡器」,點選「建立負載均衡器」按鈕,按照下面的推薦值完成設定:

  • Load balancer types: Application Load Balancer
  • Network mapping → Mappings:選擇至少2個可用區
  • Security groups: 選擇的安全組中需要允許8000埠(叢集對外提供服務的埠,可修改)
  • Listeners and routing:監聽HTTP,8000埠,Default action選擇剛建立的目標群組

點選剛建立的負載均衡器,在描述索引標籤下的DNS名稱,就是叢集對外提供服務地址了。

步驟6:設定CloudWatch

在AWS控制檯中選擇CloudWatch服務,點選右側選單中「應用程式監控→Synthetics Canary」,點選Canary版本區域的「建立Cannary版本」按鈕,按照下面的推薦值完成設定:

  • 應用程式或端點 URL:新增負載均衡器端點,分別為http://{叢集對外提供服務地址}:8000/UserService/ManagementPage/LoginPage,以及每個應用服務的對應的地址http://{應用伺服器外網地址}:22345/UserService/ManagementPage/LoginPage
  • CloudWatch告警-可選:選擇 失敗 | 大於/等於 | 1 | 15分鐘
  • 設定此Canary版本的通知:建立新主題,輸入郵件標題(英文+數位)和你的郵箱地址,點選「建立主題」按鈕。

點選「建立」按鈕後,系統需要一分鐘左右的時間進行處理,你需要留意剛才輸入的郵箱地址,系統會給你傳送一封郵件,點選該郵件上「Confirm subscription」連線,啟用郵件通知。

文內範例下載地址:

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MjI4NzczfDliZDZlY2ZjfDE2Njk2MDg3MTZ8NjI2NzZ8MTUyOTU1

拓展閱讀

萬物皆可整合系列:低程式碼對接企企雲實現資料整合

萬物皆可整合系列:低程式碼如何不成為資料孤島

萬物皆可整合系列:活字格對接泛微e-cology