還在單機服務器,時刻面臨宕機風險嗎?
優化程度不夠,響應速度緩慢,系統工作響應像老漢拉車嗎?
爲了幫助大傢俱備企業級應用的部署能力,輕鬆應對核心業務系統的部署要求,我們準備了《活字格智能集羣的架構與搭建方案》高級教程。
作爲一款優秀的企業級低代碼開發平臺,活字格除了本身開發集成的強大功能之外,負載均衡的能力依舊手到擒來。如果你需要解決如下的問題,可以考慮搭建一套活字格智能集羣:
- 提升系統可用性,避免因單臺服務器宕機導致系統服務中斷
- 在做好各項性能優化(參考系列教程)的前提下,需要進一步提升性能,以滿足大併發量請求的響應速度
完美解決以上問題,看這一篇就夠啦。
集羣能力
活字格智能集羣是我們官方提供的一套負載均衡解決方案,在傳統的負載均衡集羣提供的高可用性、高性能等優勢的基礎上,通過應用和配置的智能自動分發機制,進一步降低了集羣的運維工作量,本方案提供的主要能力如下:
- 較高可用性(包含應用服務器的故障轉出和故障遷回)
- 負載均衡
- 可用性監控
特別提示:活字格智能集羣不兼容內建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;
完整的配置文件,可以參考:
配置文件修改後,讓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提供的服務替換爲阿里雲、華爲雲的對標產品,也是沒問題的。