不只是負載均衡,活字格智慧叢集的架構與搭建方案

2022-11-10 18:00:44

還在單機伺服器,時刻面臨宕機風險嗎?

優化程度不夠,響應速度緩慢,系統工作響應像老漢拉車嗎?

為了幫助大傢俱備企業級應用的部署能力,輕鬆應對核心業務系統的部署要求,我們準備了《活字格智慧叢集的架構與搭建方案》高階教學。

作為一款優秀的企業級低程式碼開發平臺,活字格除了本身開發整合的強大功能之外,負載均衡的能力依舊手到擒來。如果你需要解決如下的問題,可以考慮搭建一套活字格智慧叢集:

  • 提升系統可用性,避免因單臺伺服器宕機導致系統服務中斷
  • 在做好各項效能優化(參考系列教學)的前提下,需要進一步提升效能,以滿足大並行量請求的響應速度

完美解決以上問題,看這一篇就夠啦。

叢集能力

活字格智慧叢集是我們官方提供的一套負載均衡解決方案,在傳統的負載均衡叢集提供的高可用性、高效能等優勢的基礎上,通過應用和設定的智慧自動分發機制,進一步降低了叢集的運維工作量,本方案提供的主要能力如下:

  • 較高可用性(包含應用伺服器的故障轉出和故障遷回)
  • 負載均衡
  • 可用性監控

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

搭建方案

我們都知道活字格的功能有多強大,搭建活字格智慧叢集需要用到Linux、nginx、Redis、GlusterFS、MySQL/MariaDB/MSSQL(您可以在PostgreSQL、Oracle等資料庫上開發業務功能,但仍需要使用這幾款資料庫來儲存使用者資訊,支援的具體版本可參考活字格的環境要求,本教學以mysql為例)。在監控服務方面,區域網專案可採用Zabbix,網際網路專案則推薦採用雲服務商提供的監控服務(本教學以阿里雲的雲監控為例)。對上述技術的瞭解程度,很大程度上決定了您搭建出的叢集的安全性、效能和可用性。

角色一覽

  • 應用伺服器:執行活字格應用,推薦安裝在Linux(範例版本:Ubuntu 18.04,下同)上的活字格伺服器管理器(範例版本:V8.0.4.0)
  • 反向代理服務:實現負載均衡等分發策略,安裝在Linux上的nginx(範例版本:1.14)

l 檔案服務:存放活字格應用、使用者上傳檔案等叢集所需的檔案,需要在多個應用伺服器間共用,推薦安裝在Linux上的GlusterFS(範例版本:3.13,2個節點)

  • 使用者資訊資料庫:存放使用者、角色、許可權等基礎資料,推薦安裝在Linux上的MySQL(範例版本:5.7)
  • 業務資料庫:存放活字格應用所使用的業務資料,推薦安裝在Linux上的MySQL(範例版本:5.7)
  • 快取和分發資料庫:存放Session對談資料,提供應用和設定同步所需的訊息,推薦安裝在Linux上的redis(範例版本:4.9)
  • 監控服務:確保第一時間能夠發現伺服器的故障,推薦阿里雲的雲監控服務

網路拓撲簡圖

活字格智慧叢集需要用到最少2臺應用伺服器,至少1臺支援伺服器(推薦視情況,將支援伺服器中不同角色部署到不同的伺服器上,包含nginx、redis、mysql、glusterfs,共4個角色)、1臺備用檔案伺服器和1個雲監控服務。

步驟1:部署應用伺服器

在官網上獲取活字格的安裝指令碼,分別在2臺應用伺服器上執行:

sudo rm -f huozige-installer-linux.tar && wget https://downloads.grapecity.com.cn/HuoZiGe/Linux/huozige-installer-linux.tar && tar -xvf huozige-installer-linux.tar && chmod +x installForguncy\_cn.sh && ./installForguncy\_cn.sh

因為範例不涉及伺服器端的PDF和Excel匯出,所以沒有安裝中文字型。

如果應用伺服器基於雲主機構建,需要開通以下入站/上行埠:

22345:活字格管理控制檯、應用釋出使用

8000-9000:推薦使用的活字格Web應用埠(國內雲服務廠商需要備案後才能開通80/443/8080埠)

步驟2:部署和設定GlusterFS

GlusterFS可以盡最大可能避免出現因儲存裝置損壞帶來的損失。使用者上傳檔案、應用檔案和資料庫檔案均推薦儲存在GlusterFS等分散式儲存,而不是NFS、SAMBA等單節點儲存。

在範例中,我們將支援伺服器作為GlusterFS的主檔案伺服器,另外搭建一臺備用檔案伺服器,用作實時熱備。

2.1主檔案伺服器和備用檔案伺服器

首先,在主檔案伺服器和備用檔案伺服器上,更新apt-get源:

sudo apt-get update

然後,從apt-get安裝glusterfs-server:

sudo apt-get install glusterfs-server

啟動gluster服務,並設定為自啟動:

sudo systemctl start glusterd

sudo systemctl enable glusterd

如果GlusterFS基於雲主機構建,需要開通以下入站/上行埠:

24007-24008:GlusterFS管理埠

49152-49251:Gluster卷存取介面

在主檔案伺服器和備用檔案伺服器的磁碟上分別建立用來儲存檔案的本地資料夾。

sudo mkdir -p /gluster/data

在範例中,我們將支援伺服器作為主伺服器(172.31.9.34),在主伺服器上連結備用檔案伺服器(172.31.15.58),然後基於兩臺伺服器上的本地資料夾,建立共用的卷:volumn-hzg

sudo gluster peer probe 172.31.15.58

sudo gluster volume create volumn-hzg replica 2 172.31.9.34:/gluster/data 172.31.15.58:/gluster/data force

sudo gluster volume start volumn-hzg
GlusterFS的伺服器端設定完成了。

2.2:應用伺服器

接下來切換到應用伺服器,分別執行以下操作,更新apt-get,並且利用apt-get安裝Gluster使用者端。

sudo apt-get install glusterfs-client

將伺服器上的資料夾掛在到本地之前,需要先建立「掛載點」,即原生的資料夾。這一點與NFS不同,GlusterFS的使用者端不會自動建立掛載點。

sudo mkdir /share

修改組態檔,開機自動掛載主伺服器提供的卷。在 /etc/fstab 中追加下方一行。

172.31.9.34:/volumn-hzg        /share   glusterfs       defaults 0 0

重新載入fstab檔案,即完成檔案掛載。

sudo mount -a

步驟3:部署MySQL

在支援伺服器上,更新apt-get源

sudo apt-get update

然後,從apt-get安裝mysql:

sudo apt-get install mysql-server

安裝完成後,啟動mysql:

sudo systemctl start mysql

使用內建的mysql使用者端登入mysql:

sudo mysql -uroot -p

預設情況下,root沒有密碼,繫結的是當前伺服器的root許可權,所以也就無需輸入密碼。執行SQL語句,設定應用伺服器有權存取的賬號。您可以直接使用root作為外網存取賬號,也可以建立一個新的使用者。在測試和學習階段,推薦直接為root開放外網存取,便於使用設計器、mysql workbrench等視覺化工具對資料進行查詢和操作;生產環境則推薦建立專門的使用者,並控制可存取的IP地址(如僅允許應用伺服器),以策安全。

CREATE USER 'root'@'%' IDENTIFIED BY '{新的資料庫密碼}';GRANT ALL ON \*.\* TO  'root'@'%';flush privileges;

再執行建立使用者資訊資料庫的SQL語句。

CREATE DATABASE userservicedb;

MySQL 5.7預設僅監聽本地埠,需要修改組態檔才能提供給其他機器存取。MySQL的組態檔很多,推薦修改/etc/mysql/my.cnf檔案。在檔案的最後,追加以下內容:

bind-address=0.0.0.0  #全部地址或者指定的ip地址

如果MySQL基於雲主機構建,需要開通以下入站/上行埠:

  • 3306:MySQL預設埠

重要提示:在生產環境中,請把MySQL的檔案儲存至GlusterFS,而不是本地磁碟。檢視教學(來自CSDN)

步驟4:部署Redis

在支援伺服器上,更新apt-get源:

sudo apt-get update

然後,從apt-get安裝redis:

sudo apt-get install redis

Redis預設不允許其他機器存取,需要修改組態檔:/etc/redis/redis.conf。組態檔比較大,可通過vim的查詢功能,定位需要修改的點:

查詢bind 127.0.0.1 ::1,在前面加上#,註釋掉這一行。2. 查詢protected-mode,把yes修改為no

修改組態檔後,重啟redis服務。

sudo systemctl restart redis-server

如果Redis基於雲主機構建,需要開通以下入站/上行埠:

  • 6379:Redis預設埠

重要提示:在生產環境中,請把redis的持久化路徑設定到GlusterFS的卷,而不是本地磁碟。檢視教學(來自CSDN)
步驟5:部署nginx

首先,在支援伺服器上,更新apt-get源:

sudo apt-get update

然後,從apt-get安裝redissudo apt-get install nginx。
安裝完畢後,可以通過修改/etc/nginx/nginx.conf,設定反向代理規則。以下的例子中有兩臺應用伺服器,內網地址分別是172.31.12.135和172.31.12.228,兩個應用app_a和app_b,埠分別是8101和8102。反向代理對外提供的埠統一為8100。搭建活字格智慧叢集,涉及到/etc/nginx/nginx.conf的http節點下upstream 和location。具體設定方法和範例檔案如下。

upstream節點定義了每個活字格應用對應的應用伺服器和伺服器級別的處理策略。你需要為UserService和每一個應用分別設定一個upstream。

# app_a:每個APP的後臺埠不同,需要設定單獨的upstream,下同

upstream  hq-a-server {

# 按使用者端分配時,取消下面一行的註釋

# 這種方法通常用於相容現有軟體,當軟體不是按照無狀態進行設定時,可以用這種方法,避免對談中斷

# ip\_hash;

server 172.31.12.135:8101 max\_fails=30 fail\_timeout=20s;

server 172.31.12.228:8101 max\_fails=30 fail\_timeout=20s;

}

每個upstream對應了server下面的一個location。location會在傳送到server中定義埠的請求中,按照URL的Path部分(不包含協定、主機名和埠,如http://xxx.com:2002/app/xxx?yyy=zzz的Path是/app/xxx?yyy=zzz)過濾出符合要求的請求,分發到upstream中。在活字格智慧叢集中,可以利用Path的第一段(UserService或應用名)作為查詢條件。

# 為每個應用做對映,下同

location ^~ /app_a/ {

故障轉移的條件:如果後端的伺服器執行超時或發生錯誤(5xx不能視作不可用,需要轉發給瀏覽器處理),自動將請求轉發到upstream負載均衡池中的另一臺伺服器,實現故障轉移。下同。

`proxy\_next\_upstream error timeout invalid\_header ;

proxy\_send\_timeout 5s;     # 代理傳送超時時間,下同

proxy\_read\_timeout 5s;    # 代理接收超時時間,下同

proxy\_pass http://hq-a-server/app\_a/;

proxy\_redirect default;

}

此外,在server節點上,你需要設定監聽的埠,和HTTP HEADER的處理策略。

listen       8100;  #應用服務和基礎服務的頁面和WebAPI,對外公開的埠統一成8100。統一埠可以避免瀏覽器的地址變化,也可以避免出現跨域請求

server_name  hq.commany.con;

轉發HTTP的HEADER,這是反向代理中的常見做法,主要是避免因修改過HEADER,帶來的相容性問題

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;

完整的組態檔,可以參考:

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

組態檔修改後,讓nginx重新載入即可。

sudo nginx -s reload

如果nginx基於雲主機構建,需要開通以下入站/上行埠:

  • 8100:設定的伺服器埠號

步驟6:設定活字格叢集

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

  • 開啟:勾選,啟用負載均衡設定
  • 資料庫型別:使用者資訊資料庫的型別,範例中採用MySQL
  • 資料庫連結字串:使用者資訊資料庫的連結字串,即剛才搭建的支援伺服器的MySQL的userservicedb資料庫
  • Redis服務地址:快取伺服器的IP和埠號(預設埠為6379),即剛才搭建的支援伺服器的Redis
  • 共用儲存路徑:使用者儲存應用和使用者上傳檔案的共用目錄,即剛才掛載GlusterFS伺服器的本地目錄

步驟7:設定監控服務

雖然活字格智慧叢集有自動的故障轉移能力,但依然需要我們關注伺服器的健康狀態,及時發現出現故障的應用伺服器,並及時予以處理。通常情況下,您需要針對nginx服務和所有應用服務建立撥測,即通過HTTP請求應用的根目錄,通過返回的結果,判斷該節點是否出錯。範例採用了阿里雲的雲監控服務。監控地址如下:

  • nginx(總體服務質量):http://{支援伺服器nginx的IP}:8100/app_a/
  • 應用伺服器1:http://{應用伺服器1的IP}:8100/app_a/
  • 應用伺服器2:http://{應用伺服器2的IP}:8100/app_a/

當nginx服務異常時,需第一時間進行處理,如重啟nginx服務等;當應用伺服器異常時,因為故障轉移機制的存在,你有一定的處理時間,範例為不低於10分鐘(30次延時,每次20秒)。如果無法在該時間範圍內處理完畢,nginx會將該伺服器標記為故障,不在向其轉發請求。此時,你需要在將故障排除後,在nginx伺服器上執行熱載入命令,將該伺服器的狀態重置為正常,接收請求分發。

sudo nginx -s reload

使用方法

1. 釋出應用

你可以通過設計器將開發好的應用釋出到任意一個應用伺服器上,活字格智慧叢集將自動把新發布的應用同步部署到其他應用伺服器。同步部署的過程不涉及檔案拷貝(應用所需的檔案都位於NFS共用資料夾中),耗費時間很短。如果恰好有使用者存取,部署過程中的伺服器因為返回碼為4xx,而被nginx伺服器識別為不可用,請求被自動分發到可用的應用伺服器上,最終實現「升級部署不停服務」的目標。

2. 管理使用者資訊

你可以在任何一臺應用伺服器的管理控制檯上,對使用者、組、組織結構、第三方授權等資料進行查詢和操作,這些操作均會影響到所有應用伺服器。

3. 設定

你可以在任何一臺應用伺服器的管理控制檯上,對應用和伺服器等設定進行調整,包括但不限於安全提供程式等。這些操作也會影響到所有應用伺服器。

常見問題

Q:如果我的應用部署在公有云上,是否可以用雲服務商的產品構建叢集?

A:當然可以,基於公有云的產品搭建活字格智慧叢集更簡單、維護也更方便。您可以使用雲服務商提供的MySQL、Redis和NFS產品,如亞馬遜(葡萄城生態合作伙伴)AWS提供的Amazon RDS for MySQL、Amazon MemoryDB for Redis、Amazon EFS。

Q:應用執行出了問題,我該如何檢視紀錄檔?

A:叢集中各應用伺服器的紀錄檔沒有被合併,依然存放在各自的磁碟上,目錄為 /var/log/ForguncyServer。管理控制檯上的【分析錯誤】功能,也僅收集當前應用伺服器的資訊。

Q:如果應用同步發生錯誤,可以手動修復嗎?

A:在設定的過程中,一旦發生應用同步出錯的情況,如不同應用伺服器上的應用版本不一致、部分應用伺服器上的應用不可用等,請首先檢查應用伺服器的時間/時區是否一致,GlusterFS載入是否正確,Redis是否執行正常。如果問題依然沒有解決,請到求助中心發帖,尋求技術支援。

Q:我不會使用Linux,是否可以基於Windows來搭建叢集?

A:搭建叢集用到的各項服務均有Windows版本,但是我們沒有做過測試。你可以參照Linux的做法,在Windows上嘗試搭建活字格叢集。如果能夠執行,歡迎到格友雜談版塊分享成功經驗。

Q:每一個應用伺服器都需要重複購買產品授權嗎?

A:叢集的授權比較靈活,請致電400-657-6008,與我們聯絡。

Q:如果我只想實現故障轉移,可以接受像編碼開發一樣手動部署和同步各應用伺服器,是否有更簡單的方案?

A:如果你希望放棄活字格智慧叢集的負載均衡和自動同步能力,手動搭建和維護傳統的故障轉移叢集,可以檢視這篇教學。

Q:能否進一步提升叢集的可用性,即便閘道器節點發生故障也能保持系統正常執行?

A:可以的,不過需要依託於硬體或軟體負載均衡器。如果你可以接受在雲端搭建叢集,可以利用雲服務商提供的負載均衡器服務,進一步提升可用性。以葡萄城的生態合作伙伴亞馬遜AWS為例,您可以按照這篇教學快速完成叢集搭建。將AWS提供的服務替換為阿里雲、華為雲的對標產品,也是沒問題的。

拓展閱讀

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

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

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