鄧秀輝,李 民,方 惠
(昆明理工大學(xué),昆明 650500)
當(dāng)今互聯(lián)網(wǎng)技術(shù)在物流、倉儲(chǔ)、財(cái)務(wù)等多領(lǐng)域均得到廣泛運(yùn)用,能有效提高企業(yè)的信息化和自動(dòng)化水平[1]。由于現(xiàn)代化企業(yè)員工數(shù)量和數(shù)據(jù)量的急劇增加,傳統(tǒng)信息系統(tǒng)在并發(fā)性和擴(kuò)展性等方面,存在難以逾越的瓶頸。若查詢數(shù)據(jù)緩慢或服務(wù)器節(jié)點(diǎn)一旦發(fā)生宕機(jī),則無法為企業(yè)員工正常地提供服務(wù),影響工作進(jìn)程,使得信息系統(tǒng)的可靠性和穩(wěn)定性無法得到保障。為避免發(fā)生類似情況產(chǎn)生,本文提出了分布式集群高可用系統(tǒng)設(shè)計(jì)。其流程主要含括三個(gè)部分,分布式Client;Nginx前端服務(wù)器;DataBase及Redis緩存數(shù)據(jù)庫集群架構(gòu)。該信息系統(tǒng)能夠?qū)崿F(xiàn)多用戶并發(fā)訪問資源,同時(shí)利用Redis集群實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存,提升查詢響應(yīng)速度和系統(tǒng)靈活性,增強(qiáng)系統(tǒng)的高可用性。
Nginx是一個(gè)輕量、性能高的HTTP和反向代理服務(wù)器。與傳統(tǒng)的服務(wù)器不同,它可在較低的資源使用率下提供大量的并發(fā)請求處理能力(C語言編寫),具有抗擊高并發(fā)、響應(yīng)速度快等特點(diǎn)。一般情況下,Nginx服務(wù)器的并發(fā)能力在3萬/秒高于Tomcat服務(wù)的150/秒。同時(shí),Nginx服務(wù)器可以實(shí)現(xiàn)動(dòng)態(tài)和靜態(tài)資源的分離。一方面,Nginx可以用于前端作反向代理服務(wù)器,處理靜態(tài)資源,如HTML、CSS等;另一方面,Nginx提供負(fù)載均衡技術(shù),該技術(shù)可以發(fā)揮集群性能,分流動(dòng)態(tài)請求鏈路到后端服務(wù)器集群。其負(fù)載均衡策略主要有:輪詢(RR)、權(quán)重、IPHASH、最小連接(LC)等策略[2,4]。
Redis是一種高性能分布式的非關(guān)系型數(shù)據(jù)庫[5],其數(shù)據(jù)是以Key-Value鍵值對的形式存儲(chǔ),支持多種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ),如鏈表(List)、字符串(String)、集合(Set)等,可實(shí)現(xiàn)對熱點(diǎn)數(shù)據(jù)的快速增刪查改操作。Redis緩存數(shù)據(jù)庫是基于內(nèi)存存儲(chǔ)數(shù)據(jù)的方式,具有讀寫性能高、支持不定期半持久化模式(RDB),通過異步方式將數(shù)據(jù)保存到磁盤上和實(shí)時(shí)持久化模式(AOF)保障數(shù)據(jù)安全等操作,并且Redis具有分片機(jī)制、哨兵機(jī)制、心跳檢測機(jī)制、主從復(fù)制等特點(diǎn),在提高存儲(chǔ)效率的同時(shí),能保障數(shù)據(jù)集群的高可用等特點(diǎn)。
隨著企業(yè)不斷發(fā)展,信息系統(tǒng)中的功能也在隨之增加。在大型信息系統(tǒng)設(shè)計(jì)中要把一個(gè)大系統(tǒng)拆分為多個(gè)單獨(dú)的子系統(tǒng),如生產(chǎn)、物流、采購等子系統(tǒng),分別存放在不同的服務(wù)器。一方面,可以降低信息系統(tǒng)在同時(shí)間內(nèi)多人訪問時(shí)的數(shù)據(jù)庫訪問壓力;另一方面,可以降低系統(tǒng)中各個(gè)功能模塊的耦合度,便于后期企業(yè)的擴(kuò)張新增功能模塊。
在項(xiàng)目部署到服務(wù)器時(shí),為提高系統(tǒng)的并發(fā)能力,通常根據(jù)項(xiàng)目功能模塊的不同,將項(xiàng)目進(jìn)行垂直拆分,把不同的項(xiàng)目模塊拆分到不同的服務(wù)器中,可以提高整個(gè)系統(tǒng)的并發(fā)能力,不會(huì)因一個(gè)模塊功能服務(wù)器的宕機(jī),而引發(fā)整個(gè)系統(tǒng)不能使用的現(xiàn)象,具體部署如圖1所示。

圖1 功能模塊垂直拆分
大型信息系統(tǒng)在設(shè)計(jì)時(shí)為了后期維護(hù)與新增功能模塊的需求,根據(jù)業(yè)務(wù)代碼的層級進(jìn)行項(xiàng)目功能的水平拆分,可以拆分為Web/viwe層、Controller層、Service層、接口、Vo層、Pojo層等,從而實(shí)現(xiàn)代碼的高內(nèi)聚,低耦合。

圖2 項(xiàng)目功能水平拆分
該系統(tǒng)為抗擊高并發(fā),采用Nginx前端服務(wù)器和Redis緩存數(shù)據(jù)庫的形式搭建并發(fā)訪問機(jī)制。首先,通過Nginx前端服務(wù)器的輪詢負(fù)載均衡策略,以用戶端的邏輯事務(wù)請求的域名地址,鏈路到后端服務(wù)器集群。后端服務(wù)器集群根據(jù)具體的域名地址效解析相關(guān)的邏輯業(yè)務(wù)請求。針對相關(guān)的內(nèi)容進(jìn)行相對應(yīng)的處理,實(shí)現(xiàn)動(dòng)態(tài)業(yè)務(wù)資源信息的實(shí)時(shí)寫入操作。其次,Tomcat服務(wù)器在處理相關(guān)邏輯業(yè)務(wù)的同時(shí),會(huì)先查找Redis服務(wù)器集群中是否緩存有需要的數(shù)據(jù)信息,如果有則直接返回給業(yè)務(wù)邏輯層進(jìn)行相對應(yīng)的邏輯處理;若Redis服務(wù)器集中中沒有相對應(yīng)的緩存數(shù)據(jù)信息,則從數(shù)據(jù)庫中查詢對應(yīng)信息,返回給業(yè)務(wù)邏輯進(jìn)行處理。最后,通過業(yè)務(wù)邏輯的處理,把從數(shù)據(jù)庫查找到的數(shù)據(jù)信息備份到Redis緩存數(shù)據(jù)中,以便下次執(zhí)行相同的業(yè)務(wù)邏輯時(shí),可以提高響應(yīng)速度。

圖3 高并發(fā)服務(wù)器集群設(shè)計(jì)
為提高員工查詢數(shù)據(jù)時(shí)的響應(yīng)速度,通常會(huì)把熱點(diǎn)數(shù)據(jù)保存在內(nèi)存中。但是由于內(nèi)存大小有限,在緩存數(shù)據(jù)時(shí)需要搭建Redis數(shù)據(jù)庫集群[6]。為保證數(shù)據(jù)能夠分散存儲(chǔ)和數(shù)據(jù)存儲(chǔ)的一致性;同時(shí),也能滿足用戶的正常訪問需求,實(shí)現(xiàn)服務(wù)故障的自動(dòng)遷移。因此采用Redis哨兵機(jī)制,提升緩存數(shù)據(jù)的高可用性,并且對Redis服務(wù)器集群節(jié)點(diǎn)做主從復(fù)制,從節(jié)點(diǎn)對主節(jié)點(diǎn)進(jìn)行復(fù)制備份,實(shí)現(xiàn)數(shù)據(jù)同步[7]。
若內(nèi)存占用大,會(huì)導(dǎo)致Redis效率下降,搭建Redis分片機(jī)制可以實(shí)現(xiàn)內(nèi)存的擴(kuò)容。為盡可能使Redis服務(wù)器不出現(xiàn) 機(jī)情況,采用Redis哨兵工作原理,哨兵通過心跳檢測檢測機(jī)制向主機(jī)發(fā)出心跳檢測PING-PONG,如果連續(xù)三次沒有收到主機(jī)的回執(zhí),則發(fā)現(xiàn)主機(jī)宕機(jī),開始進(jìn)行故障遷移,從從機(jī)中推選主服務(wù)器。最后,配置Redis主從復(fù)制結(jié)構(gòu)服務(wù)器集群,具體Redis數(shù)據(jù)庫集群架構(gòu)如圖5所示。

圖4 Redis集群服務(wù)器設(shè)計(jì)
本文將Tomcat服務(wù)集群和Redis緩存數(shù)據(jù)庫集群部署到Vmware虛擬機(jī)Linux系統(tǒng)中,因?yàn)轫?xiàng)目在Lixun系統(tǒng)中運(yùn)行,具有更穩(wěn)定,更安全,更有效率等特點(diǎn)。在集群搭建過程中,需要把Tomcat服務(wù)器集群和Redis數(shù)據(jù)庫集群部署到Linux虛擬機(jī)中,同時(shí)開放Linux系統(tǒng)的防火墻設(shè)置。與此同時(shí),在Windows系統(tǒng)中,開放Mysql數(shù)據(jù)的訪問權(quán)限和防火墻,使用xshell工具實(shí)現(xiàn)Linux系統(tǒng)與Windows系統(tǒng)進(jìn)行通信,具體如圖5所示。

圖5 集群搭建
本實(shí)驗(yàn)在Wmware虛擬機(jī)Linux系統(tǒng)中分別部署Tomcat服務(wù)器三臺,將項(xiàng)目打包復(fù)制到三個(gè)Tomcat服務(wù)中進(jìn)行部署,具體步驟如下:
步驟一:分別運(yùn)行Tomcat服務(wù)器,檢測項(xiàng)目是否能夠正常啟動(dòng);
步驟二:使用超級管理員啟動(dòng)Nginx;
步驟三:Nginx啟動(dòng)檢查(主進(jìn)程和守護(hù)進(jìn)程);
步驟四:編寫Nginx.conf文件,包括監(jiān)聽端口號、域名;編寫輪詢策略、集群連接信息等;
步驟五:編輯Windows系統(tǒng)中Host文件,添加IP與域名映射關(guān)系;
步驟六:Windows系統(tǒng)Web頁面中打開信息系統(tǒng),進(jìn)行增、刪、查、改等測試操作,檢測Windows系統(tǒng)與Linux系統(tǒng)能否進(jìn)行正常的數(shù)據(jù)通信。
在本實(shí)驗(yàn)中Redis主從劃分規(guī)則為3臺主機(jī)和3臺從機(jī)共6臺服務(wù)器部署到Vmware中Linux系統(tǒng)中。
1)檢測Redis節(jié)點(diǎn)是否能正常啟動(dòng)

圖6 Redis節(jié)點(diǎn)啟動(dòng)
2)搭建Redis集群
從圖7中可以看出Redis節(jié)點(diǎn)為主機(jī)的分別是:節(jié)點(diǎn)7000、7001、7002;從機(jī)節(jié)點(diǎn)分別是:7003、7004、7005。

圖7 Redis主從節(jié)點(diǎn)
3)Redis集群高可用測試
步驟一:關(guān)閉Redis主機(jī)節(jié)點(diǎn)7000,檢測是否自動(dòng)實(shí)現(xiàn)故障遷移[8];
步驟二:再次啟動(dòng)關(guān)閉的主機(jī),檢測是否能夠?qū)崿F(xiàn)自動(dòng)掛載。

圖8 故障遷移
為了驗(yàn)證系統(tǒng)架構(gòu)在并發(fā)處理能力和讀取數(shù)據(jù)方面的性能,選擇運(yùn)用PostMan工具和JMeter插件進(jìn)行測試。實(shí)驗(yàn)測試環(huán)境為:i7/8G內(nèi)存、Windows10系統(tǒng)、JDK1.8、Mysql8.0、Redis4.0、Tomcat8.5。
實(shí)驗(yàn)測試方案:
1)使用PostMan工具進(jìn)行數(shù)據(jù)讀取操作測試,比較有無Redis緩存數(shù)據(jù)庫的情況下的讀取速度;從圖9可以看出添加Redis緩存數(shù)據(jù)庫的響應(yīng)速度為32.37ms要明顯高于沒有添加Redis緩存數(shù)據(jù)庫的讀取速度,且添加Redis緩存數(shù)據(jù)庫的其他性能指標(biāo)也要高于沒有添加Redis緩存的性能。

圖9 有無Reids緩存讀取速度比較
2)使用Jemeter插件工具,比較員工數(shù)量在500、1000、2000數(shù)量時(shí)傳統(tǒng)信息系統(tǒng)與本文設(shè)計(jì)的信息系統(tǒng)的并發(fā)能力比較。從表1平均響應(yīng)時(shí)間來看,Nginx+Redis系統(tǒng)的性能要優(yōu)于傳統(tǒng)的信息系統(tǒng)。

表1 平均響應(yīng)時(shí)間
本文運(yùn)用Nginx前端服務(wù)器與Redis緩存的方式構(gòu)建了基于分布式集群高可用的信息系統(tǒng),通過Nginx前端服務(wù)器負(fù)載均衡策略鏈路后端服務(wù)器集群,緩解服務(wù)器在同一點(diǎn)內(nèi)的訪問壓力,提高并發(fā)能力;采用高可用Redis哨兵、分片、主從復(fù)制機(jī)制對熱點(diǎn)數(shù)據(jù)進(jìn)行緩存,提高數(shù)據(jù)庫讀寫能力,并防止因服務(wù)器因 機(jī)出現(xiàn)數(shù)據(jù)丟失現(xiàn)象。由實(shí)驗(yàn)對比表明,相比傳統(tǒng)的信息系統(tǒng),該系統(tǒng)并發(fā)能力和數(shù)據(jù)讀取方面都有。明顯的提升,滿足企業(yè)發(fā)展需求,提升企業(yè)的運(yùn)行效率和經(jīng)濟(jì)效益。