劉金秀 陳怡華 谷長樂
摘? 要:隨著互聯(lián)網(wǎng)的迅猛發(fā)展,傳統(tǒng)的商務(wù)模式正在發(fā)生巨大變化:商家的銷售模式和消費(fèi)者的購物模式都在快速向互聯(lián)網(wǎng)轉(zhuǎn)變。本論文要解決的問題是Web應(yīng)用系統(tǒng)的高并發(fā)和高可用問題,為此作者設(shè)計(jì)了一個(gè)在Linux操作系統(tǒng)下的Nginx+Keepalived的高可用架構(gòu)。
關(guān)鍵詞:Nginx;Keepalived;Mycat;高可用
Abstract:With the rapid development of the internet,the traditional business model is undergoing tremendous changes:the sales model of merchants and the shopping model of consumers are rapidly changing to the internet. The problem to be solved in this thesis is the high concurrency and high availability of the Web application system. For this reason,the author designs a high availability architecture of Nginx + Keepalived under Linux operating system.
Keywords:Nginx;Keepalived;Mycat;high availability
0? 引? 言
21世紀(jì)是信息大爆炸的時(shí)代。隨著互聯(lián)網(wǎng)的迅猛發(fā)展,傳統(tǒng)的商務(wù)模式受到了巨大的沖擊。近兩年,整個(gè)社會都在大力推薦“互聯(lián)網(wǎng)+”。在這樣的大環(huán)境下,傳統(tǒng)的商務(wù)模式正在發(fā)生翻天覆地的變化:商家的銷售模式和消費(fèi)者的購物模式都在快速向互聯(lián)網(wǎng)轉(zhuǎn)變。目前國內(nèi)有阿里巴巴、淘寶、京東、當(dāng)當(dāng)網(wǎng)、唯品會、蘇寧易購、一號店等電商平臺,他們的線上銷售做得比較成功,特別是京東,其擁有自己的京東物流和良好的售前售后服務(wù),這無疑讓他們的線上銷售如虎添翼。
當(dāng)前,中小企業(yè)對線上銷售有很大的需求,但是因?yàn)榉N種原因,他們有的只能依托阿里巴巴和京東等這樣的平臺進(jìn)行銷售,有的是自己開發(fā)一個(gè)電商系統(tǒng),進(jìn)行線上銷售。這樣的線上銷售方式存在著一些問題:依托大平臺的企業(yè),其商品的特色和性價(jià)比很容易淹沒在大品牌效應(yīng)中;另外,它們還需要向平臺交付較高的管理費(fèi)用,對很多小型企業(yè)來說,隨著時(shí)間增長累計(jì)經(jīng)費(fèi)投入將成為一個(gè)很大的負(fù)擔(dān)。很多企業(yè)可能會選擇自己開發(fā)系統(tǒng),然而,企業(yè)自己開發(fā)的系統(tǒng),往往會因?yàn)榧軜?gòu)原因,出現(xiàn)高可用和高并發(fā)問題。
基于這樣的社會需求和技術(shù)需要,本文通過對市場上的架構(gòu)進(jìn)行研究分析,設(shè)計(jì)了一個(gè)可以處理高并發(fā)和高可用問題的架構(gòu)——Nginx+Keepalived+Mycat集群架構(gòu),該集群架構(gòu)可以滿足一般電商企業(yè)的業(yè)務(wù)要求,也可以滿足企業(yè)非電商業(yè)務(wù)的需求。
本文首先介紹了服務(wù)器集群以及集群中用到的一些技術(shù),包括服務(wù)器集群分類,構(gòu)建集群需要的軟件,然后對不同服務(wù)器架構(gòu)進(jìn)行了比較,最后選擇了一個(gè)適合中小型企業(yè)搭建自己的高可用Web系統(tǒng)的架構(gòu)。
1? 服務(wù)器集群介紹
1.1? 服務(wù)器集群
服務(wù)器集群就是指將很多服務(wù)器集中起來一起進(jìn)行同一種服務(wù),在客戶端看來就像是只有一個(gè)服務(wù)器。集群可以利用多個(gè)計(jì)算機(jī)進(jìn)行并行計(jì)算從而獲得很高的計(jì)算速度,也可以用多個(gè)計(jì)算機(jī)做備份,從而使得任何一個(gè)機(jī)器壞了整個(gè)系統(tǒng)還是能正常運(yùn)行。一旦在服務(wù)器上安裝并運(yùn)行了集群服務(wù),該服務(wù)器即可加入群集。集群化操作可以減少單點(diǎn)故障數(shù)量,并且實(shí)現(xiàn)了群集化資源的高可用性。[1]
1.2? 集群技術(shù)的分類
高可用集群:高可用的英文全稱是High Availability,此類集群可以給用戶提供持久不間斷的服務(wù)。
負(fù)載均衡集群:該類集群一般是由提供負(fù)載調(diào)度的前端服務(wù)和后端業(yè)務(wù)處理服務(wù)的多臺服務(wù)器組成,該結(jié)構(gòu)的后端服務(wù)器都對外提供服務(wù),通過前端服務(wù)器的調(diào)度分?jǐn)傁到y(tǒng)的工作負(fù)載。
科學(xué)計(jì)算集群:這類集群致力于提供單個(gè)計(jì)算機(jī)不能完成的處理工作,傾向于追求綜合性能。
本文討論的對象是高可用和負(fù)載均衡集群。
1.3? LNMJ集群技術(shù)
LNMJ是一組開源軟件包,主要包括Linux、Nginx、MySQL和Java EE。搭建這種集群,需要使用Nginx、Keepalived、Mycat等開源軟件,其中,Nginx作為反向代理服務(wù)器,以解決負(fù)載均衡問題,它還可以作為靜態(tài)Web服務(wù)器;Keepalived可解決高可用問題,又可以解決Nginx的單點(diǎn)故障問題;Mycat可以用來搭建雙主雙備的MySQL數(shù)據(jù)庫服務(wù)器集群。
2? 高可用負(fù)載均衡的集群架構(gòu)設(shè)計(jì)
高可用和負(fù)載均衡架構(gòu)原理圖如圖1所示。該架構(gòu)中使用的技術(shù)介紹如下。
2.1? Nginx
Nginx是一款輕量級的高性能的Web代理服務(wù)器,目前在全球范圍內(nèi)新的大型網(wǎng)站很多使用Nginx服務(wù)器。同Apache的Httpd相比,它具有消耗資源少,可代理的后端服務(wù)器多的特點(diǎn),因此市場占有率增長很快,目前占全球Web服務(wù)器的三成。
Nginx使用的場景是:有高并發(fā)的系統(tǒng)、需要解決負(fù)載均衡的系統(tǒng)和高可用場景。Nginx有兩個(gè)功能:一是作為前端服務(wù)器響應(yīng)靜態(tài)頁面的功能,二是作為集群中的反向代理服務(wù)器功能。
在圖1中,主備Nginx服務(wù)器通過Keepalived保持通信,這里的Nginx是作為反向代理服務(wù)器來使用。[2]
2.2? Keepalived
Keepalived是用C語言寫的一個(gè)開源路由軟件。它使用VRRP協(xié)議實(shí)現(xiàn)高可用性,目的是為Linux系統(tǒng)和基于Linux的基礎(chǔ)架構(gòu)提供一個(gè)簡單而強(qiáng)大的負(fù)載均衡和高可用設(shè)施。
圖1的主備服務(wù)器中的Keepalived配置了虛擬IP(以下簡稱VIP),只有當(dāng)主Nginx服務(wù)器中的Nginx服務(wù)停止,Keepalived在規(guī)定時(shí)間內(nèi)在系統(tǒng)進(jìn)程中發(fā)現(xiàn)主服務(wù)器的Nginx進(jìn)程不存在,主服務(wù)器的Keepalived就停止服務(wù)。只有當(dāng)主服務(wù)器中的Keepalived停止,備Nginx服務(wù)器的才會接管主Nginx的工作,以保證整個(gè)系統(tǒng)的高可用性,當(dāng)主Nginx恢復(fù)工作,備Nginx會將管理權(quán)限交給主Nginx。[3]
2.3? MySQL雙主熱備
雙機(jī)熱備特指基于高可用系統(tǒng)中的兩臺服務(wù)器的熱備(或高可用),因兩機(jī)高可用在國內(nèi)使用較多,故得名雙機(jī)熱備,雙機(jī)高可用按工作中的切換方式分為:主-備方式(Active-Standby方式)和雙主機(jī)方式(Active-Active方式),主-備方式即指的是一臺服務(wù)器處于某種業(yè)務(wù)的激活狀態(tài)(即Active狀態(tài)),另一臺服務(wù)器處于該業(yè)務(wù)的備用狀態(tài)(即Standby狀態(tài))。而雙主機(jī)方式即指兩種不同業(yè)務(wù)分別在兩臺服務(wù)器上互為主備狀態(tài)(即Active-Standby和Standby-Active狀態(tài))[4]。
MySQL的雙主熱備原理如圖2所示。圖中的左右Master是同一個(gè)Master。
2.4? Mycat
目前,Mycat是國內(nèi)最活躍的、性能最好的開源數(shù)據(jù)庫中間件。Mycat可以創(chuàng)建面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集群。
基于以上介紹的技術(shù),我們搭建如圖3所示的Nginx下的高并發(fā)Web架構(gòu)圖。在圖3的架構(gòu)中,Mycat處于應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間,作為應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器的橋梁,對用戶的數(shù)據(jù)庫操作請求進(jìn)行處理,并且配置了讀寫分離,以提高電商系統(tǒng)中查詢?yōu)橹鞯臄?shù)據(jù)庫的讀性能。
根據(jù)圖2原理,在圖3的架構(gòu)中,搭建以主MySQL數(shù)據(jù)庫集群node5和node6、備MySQL數(shù)據(jù)庫集群node7和node8為數(shù)據(jù)庫的雙主從熱備架構(gòu),且根據(jù)電商系統(tǒng)的某些大表,設(shè)計(jì)了以讀為主的MyISAM和以寫為主的InnoDB兩種引擎,以提高讀寫效率,如果是小表,只使用InnoDB引擎,并且在Mycat中配置全局表,以實(shí)現(xiàn)跨節(jié)點(diǎn)join。[5]
3? 不同服務(wù)器架構(gòu)及比較
3.1? 單Web服務(wù)器架構(gòu)
平時(shí)我們使用單Web服務(wù)器(如圖4所示)也就是使用一個(gè)Tomcat服務(wù)器來開發(fā)Web項(xiàng)目。單個(gè)的Tomcat服務(wù)器,如果沒有配置,默認(rèn)的最大并發(fā)數(shù)是200。通過測試,Tomcat7.0最大并發(fā)數(shù)250為性能完美的拐點(diǎn),超過該并發(fā)數(shù)后,系統(tǒng)明顯變慢,操作延遲,性能變差,丟包數(shù)增多,當(dāng)并發(fā)數(shù)達(dá)到600時(shí)候,系統(tǒng)幾乎不能使用,出現(xiàn)假死狀態(tài),很顯然這種架構(gòu)不適合具有大并發(fā)特性的電商網(wǎng)站。
本文作者做了兩個(gè)測試,第一個(gè)測試是做并發(fā)登錄測試,測試的條件是:數(shù)據(jù)表記錄數(shù)為1000000,線程數(shù)為300的情況,使用虛擬機(jī)進(jìn)行測試,在此種條件下,得到并發(fā)數(shù)為50、100、150、300的聚合報(bào)告,并對測試數(shù)據(jù)匯總,將一些關(guān)鍵數(shù)據(jù)提取到表1中,由表1可以看出,隨著并發(fā)數(shù)的增加,服務(wù)器內(nèi)存消耗越來越大,當(dāng)并發(fā)數(shù)為150、300的時(shí)候,內(nèi)存占用很高。
由表2可見,當(dāng)數(shù)據(jù)表記錄數(shù)是1000000,并發(fā)數(shù)是100情況下,查詢沒有出錯(cuò);而當(dāng)并發(fā)數(shù)為120時(shí),已經(jīng)出現(xiàn)15.83%的出錯(cuò),平均查詢時(shí)間為2676毫秒(近3秒);當(dāng)并發(fā)數(shù)達(dá)到150時(shí),出錯(cuò)率為32.67%,平均耗時(shí)2755毫秒,出錯(cuò)率太高,就數(shù)據(jù)庫來說,這樣的性能已經(jīng)不滿足電商網(wǎng)站的要求。
3.2? Nginx+Keepalived+Tomcat+Mycat架構(gòu)
為了模擬一個(gè)中型的電商系統(tǒng),本文使用8臺虛擬機(jī)搭建LAMP高可用集群架構(gòu)。虛擬機(jī)服務(wù)器的IP地址分配和安裝軟件如表3所示,圖3的服務(wù)器集群就是基于表3而來的。
圖3中的node1和node2作為主備Nginx服務(wù)器,可以解決單點(diǎn)故障[6]問題。當(dāng)主Nginx出現(xiàn)故障,備Nginx服務(wù)器即刻可以接管主Nginx的工作。Nginx將客戶端發(fā)來的請求根據(jù)某種算法發(fā)送到后端動態(tài)Web服務(wù)器TomcatX,Tomcat處理完用戶的動態(tài)請求,將響應(yīng)通過Nginx服務(wù)器返回給客戶端,當(dāng)業(yè)務(wù)邏輯需要訪問數(shù)據(jù)庫服務(wù)器時(shí),通過Nginx訪問中間件Mycat,對數(shù)據(jù)表進(jìn)行處理。Mycat中配置了讀寫分離,以提高數(shù)據(jù)表的讀寫性能。
在圖3架構(gòu)下通過分別對系統(tǒng)并發(fā)操作和單獨(dú)對數(shù)據(jù)庫進(jìn)行測試發(fā)現(xiàn),數(shù)據(jù)庫中的數(shù)據(jù)量越大,系統(tǒng)的讀功能越強(qiáng),查詢時(shí)間越快,而寫時(shí)間稍微慢,原因是配置的雙主備數(shù)據(jù)庫架構(gòu)的影響。
4? 結(jié)? 論
圖3的Nginx+Keepalived+Mycat后端服務(wù)器集群架構(gòu),既解決了Web系統(tǒng)的單點(diǎn)故障問題,也解決了高并發(fā)問題,適于中小型高并發(fā)系統(tǒng),但對于淘寶天貓這樣的系統(tǒng)來說,這樣的架構(gòu)還是不適合大型電商系統(tǒng),由于上下行數(shù)據(jù)都是通過Nginx服務(wù)器傳輸,當(dāng)數(shù)據(jù)量很大的情況下,Nginx服務(wù)器是整個(gè)架構(gòu)的數(shù)據(jù)傳輸瓶頸,如何解決該問題,作者將在后續(xù)研究中再討論。
參考文獻(xiàn):
[1] 百度百科.服務(wù)器集群 [EB/OL].https://baike.baidu.com/item/服務(wù)器集群/5309783,2019-05-21.
[2] Nginx. nginx documentation [EB/OL].http://nginx.org/en/docs/,2019-03-31.
[3] Keepalived.What is Keepalived? [EB/OL].http://www.keepalived.org/index.html,2019-05-21.
[4] 百度百科.雙機(jī)熱備 [EB/OL].https://baike.baidu.com/item/雙機(jī)熱備/2394182,2019-05-21.
[5] MyCAT官網(wǎng).什么是MYCAT [EB/OL].http://www.mycat.io,2019-03-31.
[6] 百度百科.單點(diǎn)故障 [EB/OL].https://baike.baidu.com/item/單點(diǎn)故障/3570893,2019-05-21.
作者簡介:劉金秀(1967.01-),女,漢族,湖南湘潭人,本科,碩士,高級工程師,研究方向:軟件工程;陳怡華(1994.10-),女,漢族,廣東汕頭人,管理人員,研究方向:教學(xué)管理;谷長樂(1992.02-),男,漢族,湖南衡陽人,管理人員,研究方向:思想政治教育。