鄧秀輝,李 民,方 惠
(昆明理工大學,昆明 650500)
當今互聯(lián)網(wǎng)技術在物流、倉儲、財務等多領域均得到廣泛運用,能有效提高企業(yè)的信息化和自動化水平[1]。由于現(xiàn)代化企業(yè)員工數(shù)量和數(shù)據(jù)量的急劇增加,傳統(tǒng)信息系統(tǒng)在并發(fā)性和擴展性等方面,存在難以逾越的瓶頸。若查詢數(shù)據(jù)緩慢或服務器節(jié)點一旦發(fā)生宕機,則無法為企業(yè)員工正常地提供服務,影響工作進程,使得信息系統(tǒng)的可靠性和穩(wěn)定性無法得到保障。為避免發(fā)生類似情況產(chǎn)生,本文提出了分布式集群高可用系統(tǒng)設計。其流程主要含括三個部分,分布式Client;Nginx前端服務器;DataBase及Redis緩存數(shù)據(jù)庫集群架構。該信息系統(tǒng)能夠實現(xiàn)多用戶并發(fā)訪問資源,同時利用Redis集群實現(xiàn)熱點數(shù)據(jù)緩存,提升查詢響應速度和系統(tǒng)靈活性,增強系統(tǒng)的高可用性。
Nginx是一個輕量、性能高的HTTP和反向代理服務器。與傳統(tǒng)的服務器不同,它可在較低的資源使用率下提供大量的并發(fā)請求處理能力(C語言編寫),具有抗擊高并發(fā)、響應速度快等特點。一般情況下,Nginx服務器的并發(fā)能力在3萬/秒高于Tomcat服務的150/秒。同時,Nginx服務器可以實現(xiàn)動態(tài)和靜態(tài)資源的分離。一方面,Nginx可以用于前端作反向代理服務器,處理靜態(tài)資源,如HTML、CSS等;另一方面,Nginx提供負載均衡技術,該技術可以發(fā)揮集群性能,分流動態(tài)請求鏈路到后端服務器集群。其負載均衡策略主要有:輪詢(RR)、權重、IPHASH、最小連接(LC)等策略[2,4]。
Redis是一種高性能分布式的非關系型數(shù)據(jù)庫[5],其數(shù)據(jù)是以Key-Value鍵值對的形式存儲,支持多種數(shù)據(jù)結構的存儲,如鏈表(List)、字符串(String)、集合(Set)等,可實現(xiàn)對熱點數(shù)據(jù)的快速增刪查改操作。Redis緩存數(shù)據(jù)庫是基于內存存儲數(shù)據(jù)的方式,具有讀寫性能高、支持不定期半持久化模式(RDB),通過異步方式將數(shù)據(jù)保存到磁盤上和實時持久化模式(AOF)保障數(shù)據(jù)安全等操作,并且Redis具有分片機制、哨兵機制、心跳檢測機制、主從復制等特點,在提高存儲效率的同時,能保障數(shù)據(jù)集群的高可用等特點。
隨著企業(yè)不斷發(fā)展,信息系統(tǒng)中的功能也在隨之增加。在大型信息系統(tǒng)設計中要把一個大系統(tǒng)拆分為多個單獨的子系統(tǒng),如生產(chǎn)、物流、采購等子系統(tǒng),分別存放在不同的服務器。一方面,可以降低信息系統(tǒng)在同時間內多人訪問時的數(shù)據(jù)庫訪問壓力;另一方面,可以降低系統(tǒng)中各個功能模塊的耦合度,便于后期企業(yè)的擴張新增功能模塊。
在項目部署到服務器時,為提高系統(tǒng)的并發(fā)能力,通常根據(jù)項目功能模塊的不同,將項目進行垂直拆分,把不同的項目模塊拆分到不同的服務器中,可以提高整個系統(tǒng)的并發(fā)能力,不會因一個模塊功能服務器的宕機,而引發(fā)整個系統(tǒng)不能使用的現(xiàn)象,具體部署如圖1所示。
圖1 功能模塊垂直拆分
大型信息系統(tǒng)在設計時為了后期維護與新增功能模塊的需求,根據(jù)業(yè)務代碼的層級進行項目功能的水平拆分,可以拆分為Web/viwe層、Controller層、Service層、接口、Vo層、Pojo層等,從而實現(xiàn)代碼的高內聚,低耦合。
圖2 項目功能水平拆分
該系統(tǒng)為抗擊高并發(fā),采用Nginx前端服務器和Redis緩存數(shù)據(jù)庫的形式搭建并發(fā)訪問機制。首先,通過Nginx前端服務器的輪詢負載均衡策略,以用戶端的邏輯事務請求的域名地址,鏈路到后端服務器集群。后端服務器集群根據(jù)具體的域名地址效解析相關的邏輯業(yè)務請求。針對相關的內容進行相對應的處理,實現(xiàn)動態(tài)業(yè)務資源信息的實時寫入操作。其次,Tomcat服務器在處理相關邏輯業(yè)務的同時,會先查找Redis服務器集群中是否緩存有需要的數(shù)據(jù)信息,如果有則直接返回給業(yè)務邏輯層進行相對應的邏輯處理;若Redis服務器集中中沒有相對應的緩存數(shù)據(jù)信息,則從數(shù)據(jù)庫中查詢對應信息,返回給業(yè)務邏輯進行處理。最后,通過業(yè)務邏輯的處理,把從數(shù)據(jù)庫查找到的數(shù)據(jù)信息備份到Redis緩存數(shù)據(jù)中,以便下次執(zhí)行相同的業(yè)務邏輯時,可以提高響應速度。
圖3 高并發(fā)服務器集群設計
為提高員工查詢數(shù)據(jù)時的響應速度,通常會把熱點數(shù)據(jù)保存在內存中。但是由于內存大小有限,在緩存數(shù)據(jù)時需要搭建Redis數(shù)據(jù)庫集群[6]。為保證數(shù)據(jù)能夠分散存儲和數(shù)據(jù)存儲的一致性;同時,也能滿足用戶的正常訪問需求,實現(xiàn)服務故障的自動遷移。因此采用Redis哨兵機制,提升緩存數(shù)據(jù)的高可用性,并且對Redis服務器集群節(jié)點做主從復制,從節(jié)點對主節(jié)點進行復制備份,實現(xiàn)數(shù)據(jù)同步[7]。
若內存占用大,會導致Redis效率下降,搭建Redis分片機制可以實現(xiàn)內存的擴容。為盡可能使Redis服務器不出現(xiàn) 機情況,采用Redis哨兵工作原理,哨兵通過心跳檢測檢測機制向主機發(fā)出心跳檢測PING-PONG,如果連續(xù)三次沒有收到主機的回執(zhí),則發(fā)現(xiàn)主機宕機,開始進行故障遷移,從從機中推選主服務器。最后,配置Redis主從復制結構服務器集群,具體Redis數(shù)據(jù)庫集群架構如圖5所示。
圖4 Redis集群服務器設計
本文將Tomcat服務集群和Redis緩存數(shù)據(jù)庫集群部署到Vmware虛擬機Linux系統(tǒng)中,因為項目在Lixun系統(tǒng)中運行,具有更穩(wěn)定,更安全,更有效率等特點。在集群搭建過程中,需要把Tomcat服務器集群和Redis數(shù)據(jù)庫集群部署到Linux虛擬機中,同時開放Linux系統(tǒng)的防火墻設置。與此同時,在Windows系統(tǒng)中,開放Mysql數(shù)據(jù)的訪問權限和防火墻,使用xshell工具實現(xiàn)Linux系統(tǒng)與Windows系統(tǒng)進行通信,具體如圖5所示。
圖5 集群搭建
本實驗在Wmware虛擬機Linux系統(tǒng)中分別部署Tomcat服務器三臺,將項目打包復制到三個Tomcat服務中進行部署,具體步驟如下:
步驟一:分別運行Tomcat服務器,檢測項目是否能夠正常啟動;
步驟二:使用超級管理員啟動Nginx;
步驟三:Nginx啟動檢查(主進程和守護進程);
步驟四:編寫Nginx.conf文件,包括監(jiān)聽端口號、域名;編寫輪詢策略、集群連接信息等;
步驟五:編輯Windows系統(tǒng)中Host文件,添加IP與域名映射關系;
步驟六:Windows系統(tǒng)Web頁面中打開信息系統(tǒng),進行增、刪、查、改等測試操作,檢測Windows系統(tǒng)與Linux系統(tǒng)能否進行正常的數(shù)據(jù)通信。
在本實驗中Redis主從劃分規(guī)則為3臺主機和3臺從機共6臺服務器部署到Vmware中Linux系統(tǒng)中。
1)檢測Redis節(jié)點是否能正常啟動
圖6 Redis節(jié)點啟動
2)搭建Redis集群
從圖7中可以看出Redis節(jié)點為主機的分別是:節(jié)點7000、7001、7002;從機節(jié)點分別是:7003、7004、7005。
圖7 Redis主從節(jié)點
3)Redis集群高可用測試
步驟一:關閉Redis主機節(jié)點7000,檢測是否自動實現(xiàn)故障遷移[8];
步驟二:再次啟動關閉的主機,檢測是否能夠實現(xiàn)自動掛載。
圖8 故障遷移
為了驗證系統(tǒng)架構在并發(fā)處理能力和讀取數(shù)據(jù)方面的性能,選擇運用PostMan工具和JMeter插件進行測試。實驗測試環(huán)境為:i7/8G內存、Windows10系統(tǒng)、JDK1.8、Mysql8.0、Redis4.0、Tomcat8.5。
實驗測試方案:
1)使用PostMan工具進行數(shù)據(jù)讀取操作測試,比較有無Redis緩存數(shù)據(jù)庫的情況下的讀取速度;從圖9可以看出添加Redis緩存數(shù)據(jù)庫的響應速度為32.37ms要明顯高于沒有添加Redis緩存數(shù)據(jù)庫的讀取速度,且添加Redis緩存數(shù)據(jù)庫的其他性能指標也要高于沒有添加Redis緩存的性能。
圖9 有無Reids緩存讀取速度比較
2)使用Jemeter插件工具,比較員工數(shù)量在500、1000、2000數(shù)量時傳統(tǒng)信息系統(tǒng)與本文設計的信息系統(tǒng)的并發(fā)能力比較。從表1平均響應時間來看,Nginx+Redis系統(tǒng)的性能要優(yōu)于傳統(tǒng)的信息系統(tǒng)。
表1 平均響應時間
本文運用Nginx前端服務器與Redis緩存的方式構建了基于分布式集群高可用的信息系統(tǒng),通過Nginx前端服務器負載均衡策略鏈路后端服務器集群,緩解服務器在同一點內的訪問壓力,提高并發(fā)能力;采用高可用Redis哨兵、分片、主從復制機制對熱點數(shù)據(jù)進行緩存,提高數(shù)據(jù)庫讀寫能力,并防止因服務器因 機出現(xiàn)數(shù)據(jù)丟失現(xiàn)象。由實驗對比表明,相比傳統(tǒng)的信息系統(tǒng),該系統(tǒng)并發(fā)能力和數(shù)據(jù)讀取方面都有。明顯的提升,滿足企業(yè)發(fā)展需求,提升企業(yè)的運行效率和經(jīng)濟效益。