1. wiki的簡介
有人認為,Wiki系統屬於一種人類知識網格系統,可以在Web的基礎上對Wiki文本進行瀏覽、創建、更改,而且創建、更改、發布的代價遠比HTML文本小;同時Wiki系統還支持面向社群的協作式寫作,為協作式寫作提供必要幫助;最後,Wiki的寫作者自然構成了一個社群,Wiki系統為這個社群提供簡單的交流工具。與其它超文本系統相比,Wiki有使用方便及開放的特點,所以Wiki系統可以幫助我們在一個社群內共享某領域的知識。
由於WiKi可以調動最廣大的網民的群體智慧參與網路創造和互動,它是web2.0的一種典型應用,是知識社會條件下創新2.0的一種典型形式。它也為教師和學生的知識共享提供了高效的平台,實現了快速廣泛的信息整合。
Wiki的架構
GeoDNS
這個GeoDNS可能比較新奇,實際上原理很簡單,GeoDNS是一個為BIND寫的40行的小程序,可以讓DNS解析的時候考慮地域因素——讓用戶能夠訪問離他地域最近的Web伺服器。
LVS
LVS 是一個開源的軟體,可以實現 Linux平台下的簡單負載均衡。主要由負載調度器、伺服器池和共享存儲構成。可喜的是,這是一款為數不多的中國人自己編寫的開源軟體(章文嵩發起);可惜的是,LVS目前僅支持Linux。
Squid
Squid大家可能都比較熟悉,Squid是一種用來緩沖Internet數據的軟體。尤其適合像維基這樣的遍布全球,數據中心卻很集中的站點使用。在維基中,Squid緩存分為兩組,一組是文檔內容(多為壓縮的HTML頁面),另一組為媒體內容,主要包括圖片等大一點的靜態文件。目前總計有55台Squid伺服器在維基運行,維基正在准備添加另外的20台。根據維基披露的資料,其中每一台伺服器每秒要處理1000~2500 個http請求,每台伺服器承受100Mb/s~250Mb/s的流量,每台伺服器負責1.4~3.2萬個連接,每台Squid伺服器分配出40GB作為緩存空間。硬體方面,這些Squid伺服器每台都有4塊硬碟,8GB內存。
維基媒體平台
維基所有的項目都運行在維基媒體平台上,這是一個遵守GPL的開源軟體,以PHP寫成。維基本身在使用,但很多別的機構也使用了該軟體平台。在所有125台應用伺服器上都安裝了維基媒體平台,還有40台應用伺服器馬上就要上線,這些應用伺服器都採用了兩顆四核的CPU。這些媒體平台都由一個中心控制台控制,維基可以通過該平台部署某個應用到數百台機器上,非常方便。維基媒體平台非常注重緩存,多數緩存都放在Memcached中。
CDN
維基在美國、荷蘭和韓國分別設有群集,維基CDN會根據來訪IP位置的不同選擇指向最近的群集。
數據存儲
元數據,比如文章修改歷史,文章的鏈接和用戶資料等內容被存放於主資料庫;正文存於外部存儲;用戶上傳的圖片等信息則單獨存放於圖片伺服器。
主資料庫伺服器一共有15台,配置為內存4GB~16GB,6塊73~146GB的硬碟和雙CPU。資料庫中除了有一個主資料庫,還有許多復制的從資料庫,這些主從資料庫並不是按照伺服器個數來劃分的,資料庫都是跨伺服器運行的。
2. web開發都要具備哪些必備能力
一,html,css能力
1,了解階段,知道html標簽是干什麼用的,通過網路和手冊能自主的寫一些html,知道css是怎麼回事,能在html中寫一些簡單的style等
2,熟悉階段,能利用css來能設計一些簡單的布局,可以將css單獨的寫成文件,熟悉css的語法規則,以及繼承性等
3,很熟悉階段,能夠設計出很好的CSS,並且管理好這些CSS文件,盡量減少冗餘代碼。知道如何寫出有利於搜索引擎搜索的代碼,例如:title,h1,h2權重比較高的。等
二,js能力
如果提高用戶體驗,是一個網站能留住人的重要標志。這個就要用到JS了
1,了解階段,了解JS的基本語法,知道如何去調試這些程序,能寫一些簡單function等
2,熟悉階段,對JS的語法,函數,正則等已經熟悉了,能利用js來寫一些特效,並且發 現用JS寫特效,是比較累人的一件事,開始嘗試jquery,prototype,並對jquery,prototype基本語法有所解,個人反對不學 JS,直接入手jquery,prototype這樣的JS框架。
3,很熟悉階段,在框架的幫助下,能熟練的用OOP的思想的來寫代碼,而不是一個個 function累加,熟練運用jquery,prototype的ajax,或者是網上一些ajax框架,如(ajaxrequest),不在直接寫 active控制項了。能夠利用網路資源,來完成各種特效。
三,最關鍵的php能力
1,了解階段,您能寫一些代碼,因為那是在手冊和google的幫助下,您才完成的。變數亂定義,N多函數不知道,做起事來很慢,想到什麼寫什麼,代碼寫的比較亂,後期維護很麻煩。
2,熟悉階段,經常查函數,手冊估計也看過一,二遍了,常用的函數基本上您都了解了。後 期維護給您帶來了不少痛苦,您開始發現自己的代碼有很多不足,開始思考如果改進自己的代碼,如何站在項目的角度來規劃自己的代碼,而不是想到什麼寫什麼, 知道如何來減少冗餘代碼,使您的代碼清晰,知道什麼樣的代碼寫出來讓人看著舒服,基本的代碼規范,已經形成。為了提高自己,會特意的去一些技術性的論壇, 學習研究。
3,很熟悉階段,這個階段,我想您已經從面向過程進入了面向對象。個人覺得面向對象的最大好處就是,能使整個項目功能化,模塊化, 後期維護,改版,升級就很方便了。沒有面向對象的時候,不也一樣開發嗎.這個時期,您已經研究過了一種或者幾種框架,結合自己的實際項目經驗,在腦子里已 經能形成自己的一個框架,這個框架是最適合你的。並且能夠將這個框架運用到實際的開發中去,以提高自己的開發效率,並且能夠優化性能!
四,資料庫能力
用php來做項目的話,用mysql是最多的了,其次是pgsql。因為他們二個是免費的。哈哈,以mysql為例
1,了解階段,知道mysql是什麼,能寫一些簡單的sql語句,能設計簡單的表,知道如何使用資料庫管理工具(如:phpmyadmin)
2,熟悉階段,知道如何才能寫出高效率的sql語句,了解索引原理,知道如何創建索引, 會寫一些儲存過程,觸發器等,能通過各種手段來分析,測試資料庫,例如:利用mysqlslap來進行壓力測試,通來explain來分析sql語句,通 過開啟慢查詢來分析哪些sql語句真正影響mysql的運行,能利用dbdesigner4,mysql workbench為設計資料庫,能在命令狀態下,查詢,分析mysql環境變數,來分析mysql的運行狀態等等
3,很熟悉階段,對於各有種存儲引擎的原理非常熟悉,知道通過修改配置文件來,使存儲引 擎達到最優化,知道如何來優化資料庫的最大連接數,知道怎麼樣來優化mysql的I/o瓶頸,為了項目的需要,向mysql資料庫增加存儲引擎或者插件, 知道如何搭建資料庫集群,並監控資料庫的運行狀態等等
五,apache等能力
個人覺得,到目錄為止,跑php的話用apache的人還是最多,前段時間好多網站在吵NGINX有多麼多麼的好,能比apache好10倍,我覺得還是親自嘗試一下比較好。以apache為例
1,了解階段,不管是linux下,還是windows下,能夠安裝配置apache,知道如何添加php添模,如果面試官問你,apache為什麼能解釋php代碼,你怎麼回答呢。對apache的基本配置有所了解,對於啟動中遇到的問題能夠解決等
2,熟悉階段,知道如何向apache中添加新的模塊,如果如何進行url重寫,防盜鏈,進行IP限制等
3,很熟悉階段,知道如何利用apache來緩存圖片,能利用apache來做負載均衡,並且知道利用ab命令來進行壓力,通過工具對日誌分析,經過分析來對apache進行優化,知道如何搭建多個虛擬主機;對apahce的常用模塊都有實際操作經驗等
對apache進行監控和維護,一般是運維人員或者是項目經理來做的,個人覺得最好還是了解一點,因為這樣您才不會那麼容易被忽悠,對於自己將來的轉型也是非常有必要的。
六,linux系統
為什麼要掌握linux系統呢?用php寫的網站大多數運行在linux或者 freebsd下的,掌握linux系統對自己將來的發展還是比較有好處的。,在linux下,不用擔心中毒的問題,linux下的病毒很少,也不用擔 心,XX和XXX掃描你的硬碟了。哈哈
1,熟悉階段,會裝linux系統,對系統的常用命令能夠熟練運用等
2,運用階段,在linux系統下,能夠安裝配置apache,php,mysql,svn,memcache,squid,lvs等一些web項目必要的工具,能夠通過日誌分析其狀態等。對shell要有所了解,並能夠寫一些簡單的shell腳本等
七,溝通能力
這一點非常重要,並且被越來越多的人所忽視,其實做程序員挺杯具的,根電腦打交道的時間 是最多,也許是因為這樣吧,溝通的時候,是比較費勁的,也有可能是被程序的嚴謹性束縛了大腦,說出來的話,太專業,可能其他人聽不懂得。所以平時多和他人 交流,特別是根非技術人員多溝通,多站在對方的角度來思想問題,這樣的話,我想溝通起來會容易很多。
3. 分布式Web伺服器架構
最開始,由於某些想法,於是在互聯網上搭建了一個網站,這個時候甚至有可能主機都是租借的,但由於這篇文章我們只關注架構的演變歷程,因此就假設這個時候已經是託管了一台主機,並且有一定的帶寬了,這個時候由於網站具備了一定的特色,吸引了部分人訪問,逐漸你發現系統的壓力越來越高,響應速度越來越慢,而這個時候比較明顯的是資料庫和應用互相影響,應用出問題了,資料庫也很容易出現問題,而資料庫出問題的時候,應用也容易出問題,於是進入了第一步演變階段:將應用和資料庫從物理上分離,變成了兩台機器,這個時候技術上沒有什麼新的要求,但你發現確實起到效果了,系統又恢復到以前的響應速度了,並且支撐住了更高的流量,並且不會因為資料庫和應用形成互相的影響。
這一步架構演變對技術上的知識體系基本沒有要求。
架構演變第二步:增加頁面緩存
好景不長,隨著訪問的人越來越多,你發現響應速度又開始變慢了,查找原因,發現是訪問資料庫的操作太多,導致數據連接競爭激烈,所以響應變慢,但資料庫連接又不能開太多,否則資料庫機器壓力會很高,因此考慮採用緩存機制來減少資料庫連接資源的競爭和對資料庫讀的壓力,這個時候首先也許會選擇採用squid 等類似的機制來將系統中相對靜態的頁面(例如一兩天才會有更新的頁面)進行緩存(當然,也可以採用將頁面靜態化的方案),這樣程序上可以不做修改,就能夠很好的減少對webserver的壓力以及減少資料庫連接資源的競爭,OK,於是開始採用squid來做相對靜態的頁面的緩存。
前端頁面緩存技術,例如squid,如想用好的話還得深入掌握下squid的實現方式以及緩存的失效演算法等。
架構演變第三步:增加頁面片段緩存
增加了squid做緩存後,整體系統的速度確實是提升了,webserver的壓力也開始下降了,但隨著訪問量的增加,發現系統又開始變的有些慢了,在嘗到了squid之類的動態緩存帶來的好處後,開始想能不能讓現在那些動態頁面里相對靜態的部分也緩存起來呢,因此考慮採用類似ESI之類的頁面片段緩存策略,OK,於是開始採用ESI來做動態頁面中相對靜態的片段部分的緩存。
這一步涉及到了這些知識體系:
頁面片段緩存技術,例如ESI等,想用好的話同樣需要掌握ESI的實現方式等;
架構演變第四步:數據緩存
在採用ESI之類的技術再次提高了系統的緩存效果後,系統的壓力確實進一步降低了,但同樣,隨著訪問量的增加,系統還是開始變慢,經過查找,可能會發現系統中存在一些重復獲取數據信息的地方,像獲取用戶信息等,這個時候開始考慮是不是可以將這些數據信息也緩存起來呢,於是將這些數據緩存到本地內存,改變完畢後,完全符合預期,系統的響應速度又恢復了,資料庫的壓力也再度降低了不少。
這一步涉及到了這些知識體系:
緩存技術,包括像Map數據結構、緩存演算法、所選用的框架本身的實現機制等。
架構演變第五步: 增加webserver
好景不長,發現隨著系統訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一台webserver,這也是為了同時解決可用性的問題,避免單台的webserver down機的話就沒法使用了,在做了這些考慮後,決定增加一台webserver,增加一台webserver時,會碰到一些問題,典型的有:
1、如何讓訪問分配到這兩台機器上,這個時候通常會考慮的方案是Apache自帶的負載均衡方案,或LVS這類的軟體負載均衡方案;
2、如何保持狀態信息的同步,例如用戶session等,這個時候會考慮的方案有寫入資料庫、寫入存儲、cookie或同步session信息等機制等;
3、如何保持數據緩存信息的同步,例如之前緩存的用戶數據等,這個時候通常會考慮的機制有緩存同步或分布式緩存;
4、如何讓上傳文件這些類似的功能繼續正常,這個時候通常會考慮的機制是使用共享文件系統或存儲等;
在解決了這些問題後,終於是把webserver增加為了兩台,系統終於是又恢復到了以往的速度。
這一步涉及到了這些知識體系:
負載均衡技術(包括但不限於硬體負載均衡、軟體負載均衡、負載演算法、linux轉發協議、所選用的技術的實現細節等)、主備技術(包括但不限於 ARP欺騙、linux heart-beat等)、狀態信息或緩存同步技術(包括但不限於Cookie技術、UDP協議、狀態信息廣播、所選用的緩存同步技術的實現細節等)、共享文件技術(包括但不限於NFS等)、存儲技術(包括但不限於存儲設備等)。
架構演變第六步:分庫
享受了一段時間的系統訪問量高速增長的幸福後,發現系統又開始變慢了,這次又是什麼狀況呢,經過查找,發現資料庫寫入、更新的這些操作的部分資料庫連接的資源競爭非常激烈,導致了系統變慢,這下怎麼辦呢,此時可選的方案有資料庫集群和分庫策略,集群方面像有些資料庫支持的並不是很好,因此分庫會成為比較普遍的策略,分庫也就意味著要對原有程序進行修改,一通修改實現分庫後,不錯,目標達到了,系統恢復甚至速度比以前還快了。
這一步涉及到了這些知識體系:
這一步更多的是需要從業務上做合理的劃分,以實現分庫,具體技術細節上沒有其他的要求;
但同時隨著數據量的增大和分庫的進行,在資料庫的設計、調優以及維護上需要做的更好,因此對這些方面的技術還是提出了很高的要求的。
架構演變第七步:分表、DAL和分布式緩存
隨著系統的不斷運行,數據量開始大幅度增長,這個時候發現分庫後查詢仍然會有些慢,於是按照分庫的思想開始做分表的工作,當然,這不可避免的會需要對程序進行一些修改,也許在這個時候就會發現應用自己要關心分庫分表的規則等,還是有些復雜的,於是萌生能否增加一個通用的框架來實現分庫分表的數據訪問,這個在ebay的架構中對應的就是DAL,這個演變的過程相對而言需要花費較長的時間,當然,也有可能這個通用的框架會等到分表做完後才開始做,同時,在這個階段可能會發現之前的緩存同步方案出現問題,因為數據量太大,導致現在不太可能將緩存存在本地,然後同步的方式,需要採用分布式緩存方案了,於是,又是一通考察和折磨,終於是將大量的數據緩存轉移到分布式緩存上了。
這一步涉及到了這些知識體系:
分表更多的同樣是業務上的劃分,技術上涉及到的會有動態hash演算法、consistent hash演算法等;
DAL涉及到比較多的復雜技術,例如資料庫連接的管理(超時、異常)、資料庫操作的控制(超時、異常)、分庫分表規則的封裝等;
架構演變第八步:增加更多的webserver
在做完分庫分表這些工作後,資料庫上的壓力已經降到比較低了,又開始過著每天看著訪問量暴增的幸福生活了,突然有一天,發現系統的訪問又開始有變慢的趨勢了,這個時候首先查看資料庫,壓力一切正常,之後查看webserver,發現apache阻塞了很多的請求,而應用伺服器對每個請求也是比較快的,看來是請求數太高導致需要排隊等待,響應速度變慢,這還好辦,一般來說,這個時候也會有些錢了,於是添加一些webserver伺服器,在這個添加 webserver伺服器的過程,有可能會出現幾種挑戰:
1、Apache的軟負載或LVS軟負載等無法承擔巨大的web訪問量(請求連接數、網路流量等)的調度了,這個時候如果經費允許的話,會採取的方案是購買硬體負載,例如F5、Netsclar、Athelon之類的,如經費不允許的話,會採取的方案是將應用從邏輯上做一定的分類,然後分散到不同的軟負載集群中;
2、原有的一些狀態信息同步、文件共享等方案可能會出現瓶頸,需要進行改進,也許這個時候會根據情況編寫符合網站業務需求的分布式文件系統等;
在做完這些工作後,開始進入一個看似完美的無限伸縮的時代,當網站流量增加時,應對的解決方案就是不斷的添加webserver。
這一步涉及到了這些知識體系:
到了這一步,隨著機器數的不斷增長、數據量的不斷增長和對系統可用性的要求越來越高,這個時候要求對所採用的技術都要有更為深入的理解,並需要根據網站的需求來做更加定製性質的產品。
架構演變第九步:數據讀寫分離和廉價存儲方案
突然有一天,發現這個完美的時代也要結束了,資料庫的噩夢又一次出現在眼前了,由於添加的webserver太多了,導致資料庫連接的資源還是不夠用,而這個時候又已經分庫分表了,開始分析資料庫的壓力狀況,可能會發現資料庫的讀寫比很高,這個時候通常會想到數據讀寫分離的方案,當然,這個方案要實現並不容易,另外,可能會發現一些數據存儲在資料庫上有些浪費,或者說過於佔用資料庫資源,因此在這個階段可能會形成的架構演變是實現數據讀寫分離,同時編寫一些更為廉價的存儲方案,例如BigTable這種。
這一步涉及到了這些知識體系:
數據讀寫分離要求對資料庫的復制、standby等策略有深入的掌握和理解,同時會要求具備自行實現的技術;
廉價存儲方案要求對OS的文件存儲有深入的掌握和理解,同時要求對採用的語言在文件這塊的實現有深入的掌握。
架構演變第十步:進入大型分布式應用時代和廉價伺服器群夢想時代
經過上面這個漫長而痛苦的過程,終於是再度迎來了完美的時代,不斷的增加webserver就可以支撐越來越高的訪問量了,對於大型網站而言,人氣的重要毋庸置疑,隨著人氣的越來越高,各種各樣的功能需求也開始爆發性的增長,這個時候突然發現,原來部署在webserver上的那個web應用已經非常龐大了,當多個團隊都開始對其進行改動時,可真是相當的不方便,復用性也相當糟糕,基本是每個團隊都做了或多或少重復的事情,而且部署和維護也是相當的麻煩,因為龐大的應用包在N台機器上復制、啟動都需要耗費不少的時間,出問題的時候也不是很好查,另外一個更糟糕的狀況是很有可能會出現某個應用上的bug就導致了全站都不可用,還有其他的像調優不好操作(因為機器上部署的應用什麼都要做,根本就無法進行針對性的調優)等因素,根據這樣的分析,開始痛下決心,將系統根據職責進行拆分,於是一個大型的分布式應用就誕生了,通常,這個步驟需要耗費相當長的時間,因為會碰到很多的挑戰:
1、拆成分布式後需要提供一個高性能、穩定的通信框架,並且需要支持多種不同的通信和遠程調用方式;
2、將一個龐大的應用拆分需要耗費很長的時間,需要進行業務的整理和系統依賴關系的控制等;
3、如何運維(依賴管理、運行狀況管理、錯誤追蹤、調優、監控和報警等)好這個龐大的分布式應用。
經過這一步,差不多系統的架構進入相對穩定的階段,同時也能開始採用大量的廉價機器來支撐著巨大的訪問量和數據量,結合這套架構以及這么多次演變過程吸取的經驗來採用其他各種各樣的方法來支撐著越來越高的訪問量。
這一步涉及到了這些知識體系:
這一步涉及的知識體系非常的多,要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬體級、操作系統級以及所採用的語言的實現都有清楚的理解。
運維這塊涉及的知識體系也非常的多,多數情況下需要掌握分布式並行計算、報表、監控技術以及規則策略等等。
說起來確實不怎麼費力,整個網站架構的經典演變過程都和上面比較的類似,當然,每步採取的方案,演變的步驟有可能有不同,另外,由於網站的業務不同,會有不同的專業技術的需求,這篇blog更多的是從架構的角度來講解演變的過程,當然,其中還有很多的技術也未在此提及,像資料庫集群、數據挖掘、搜索等,但在真實的演變過程中還會藉助像提升硬體配置、網路環境、改造操作系統、CDN鏡像等來支撐更大的流量,因此在真實的發展過程中還會有很多的不同,另外一個大型網站要做到的遠遠不僅僅上面這些,還有像安全、運維、運營、服務、存儲等,要做好一個大型的網站真的很不容易
4. 如何配置Web伺服器實現負載均衡
網路的負載均衡是一種動態均衡技術,通過一些工具實時地分析數據包,掌握網路中的數據流量狀況,把任務合理均衡地分配出去。這種技術基於現有網路結構,提供了一種擴展伺服器帶寬和增加伺服器吞吐量的廉價有效的方法,加強了網路數據處理能力,提高了網路的靈活性和可用性。
以四台伺服器為例實現負載均衡:
安裝配置LVS
1. 安裝前准備:
(1)首先說明,LVS並不要求集群中的伺服器規格劃一,相反,可以根據伺服器的不同配置和負載狀況,調整負載分配策略,充分利用集群環境中的每一台伺服器。如下表:
Srv Eth0 Eth0:0 Eth1 Eth1:0
vs1 10.0.0.1 10.0.0.2 192.168.10.1 192.168.10.254
vsbak 10.0.0.3 192.168.10.102
real1 192.168.10.100
real2 192.168.10.101
其中,10.0.0.2是允許用戶訪問的IP。
(2)這4台伺服器中,vs1作為虛擬伺服器(即負載平衡伺服器),負責將用戶的訪問請求轉發到集群內部的real1,real2,然後由real1,real2分別處理。
Client為客戶端測試機器,可以為任意操作系統。
(3)所有OS為redhat6.2,其中vs1 和vsbak 的核心是2.2.19, 而且patch過ipvs的包, 所有real
server的Subnet mask 都是24位, vs1和vsbak 的10.0.0. 網段是24 位。
2.理解LVS中的相關術語
(1) ipvsadm :ipvsadm是LVS的一個用戶界面。在負載均衡器上編譯、安裝ipvsadm。
(2) 調度演算法: LVS的負載均衡器有以下幾種調度規則:Round-robin,簡稱rr;weighted
Round-robin,簡稱wrr;每個新的連接被輪流指派到每個物理伺服器。Least-connected,簡稱lc;weighted
Least-connected,簡稱wlc,每個新的連接被分配到負擔最小的伺服器。
(3) Persistent client
connection,簡稱pcc,(持續的客戶端連接,內核2.2.10版以後才支持)。所有來自同一個IP的客戶端將一直連接到同一個物理伺服器。超時時間被設置為360秒。Pcc是為https和cookie服務設置的。在這處調度規則下,第一次連接後,所有以後來自相同客戶端的連接(包括來自其它埠)將會發送到相同的物理伺服器。但這也會帶來一個問題,因為大約有25%的Internet
可能具有相同的IP地址。
(4) Persistent port
connection調度演算法:在內核2.2.12版以後,pcc功能已從一個調度演算法(你可以選擇不同的調度演算法:rr、wrr、lc、wlc、pcc)演變成為了一個開關選項(你可以讓rr、
wrr、lc、wlc具備pcc的屬性)。在設置時,如果你沒有選擇調度演算法時,ipvsadm將默認為wlc演算法。 在Persistent port
connection(ppc)演算法下,連接的指派是基於埠的,例如,來自相同終端的80埠與443埠的請求,將被分配到不同的物理伺服器上。不幸的是,如果你需要在的網站上採用cookies時將出問題,因為http是使用80埠,然而cookies需要使用443埠,這種方法下,很可能會出現cookies不正常的情況。
(5)Load Node Feature of Linux Director:讓Load balancer 也可以處理users 請求。
(6)IPVS connection synchronization。
(7)ARP Problem of LVS/TUN and LVS/DR:這個問題只在LVS/DR,LVS/TUN 時存在。
3. 配置實例
(1) 需要的軟體包和包的安裝:
I. piranha-gui-0.4.12-2*.rpm (GUI介面cluster設定工具);
II. piranha-0.4.12-2*.rpm;
III. ipchains-1.3.9-6lp*.rpm (架設NAT)。
取得套件或mount到光碟,進入RPMS目錄進行安裝:
# rpm -Uvh piranha*
# rpm -Uvh ipchains*
(2) real server群:
真正提供服務的server(如web
server),在NAT形式下是以內部虛擬網域的形式,設定如同一般虛擬網域中Client端使用網域:192.168.10.0/24
架設方式同一般使用虛擬IP之區域網絡。
a. 設網卡IP
real1 :192.168.10.100/24
real2 :192.168.10.101/24
b.每台server均將default gateway指向192.168.10.254。
192.168.10.254為該網域唯一對外之信道,設定在virtual server上,使該網域進出均需通過virtual server 。
c.每台server均開啟httpd功能供web server服務,可以在各real server上放置不同內容之網頁,可由瀏覽器觀察其對各real
server讀取網頁的情形。
d.每台server都開啟rstatd、sshd、rwalld、ruser、rsh、rsync,並且從Vserver上面拿到相同的lvs.conf文件。
(3) virtual server:
作用在導引封包的對外主機,專職負責封包的轉送,不提供服務,但因為在NAT型式下必須對進出封包進行改寫,所以負擔亦重。
a.IP設置:
對外eth0:IP:10.0.0.1 eth0:0 :10.0.0.2
對內eth1:192.168.10.1 eth1:0 :192.168.10.254
NAT形式下僅virtual server有真實IP,real server群則為透過virtual server.
b.設定NAT功能
# echo 1 >; /proc/sys/net/ipv4/ip_forward
# echo 1 >; /proc/sys/net/ipv4/ip_always_defrag
# ipchains -P forward MASQ
c.設定piranha 進入X-window中 (也可以直接編輯/etc/lvs.cf )
a).執行面板系統piranha
b).設定「整體配置」(Global Settings) 主LVS伺服器主機IP:10.0.0.2, 選定網路地址翻譯(預設) NAT路徑名稱:
192.168.10.254, NAT 路徑裝置: eth1:0
c).設定虛擬伺服器(Virtual Servers) 添加編輯虛擬伺服器部分:(Virtual
Server)名稱:(任意取名);應用:http;協議: tcp;連接:80;地址:10.0..0.2;裝置:eth0:0; 重入時間:180
(預設);服務延時:10 (預設);載入監控工具:ruptime (預設);調度策略:Weighted least-connections; 持續性:0
(預設); 持續性屏蔽: 255.255.255.255 (預設); 按下激活:實時伺服器部分:(Real Servers); 添加編輯:名字:(任意取名);
地址: 192.168.10.100; 權重:1 (預設) 按下激活
另一架real server同上,地址:192.168.10.101。
d). 控制/監控(Controls/Monitoring)
控制:piranha功能的激活與停止,上述內容設定完成後即可按開始鍵激活piranha.監控器:顯示ipvsadm設定之routing table內容
可立即更新或定時更新。
(4)備援主機的設定(HA)
單一virtual server的cluster架構virtual server 負擔較大,提供另一主機擔任備援,可避免virtual
server的故障而使對外服務工作終止;備份主機隨時處於預備狀態與virtual server相互偵測
a.備份主機:
eth0: IP 10.0.0.3
eth1: IP 192.168.10.102 同樣需安裝piranha,ipvsadm,ipchains等套件
b.開啟NAT功能(同上面所述)。
c.在virtual server(10.0.0.2)主機上設定。
a).執行piranha冗餘度 ;
b).按下「激活冗餘度」;
冗餘LVS伺服器IP: 10.0.0.3;HEARTBEAT間隔(秒數): 2 (預設)
假定在…秒後進入DEAD狀態: 5 (預設);HEARTBEAT連接埠: 539 (預設)
c).按下「套用」;
d).至「控制/監控」頁,按下「在當前執行層添加PULSE DEAMON」 ,按下「開始」;
e).在監控器按下「自動更新」,這樣可由窗口中看到ipvsadm所設定的routing table,並且動態顯示real
server聯機情形,若real server故障,該主機亦會從監視窗口中消失。
d.激活備份主機之pulse daemon (執行# /etc/rc.d/init.d/pulse start)。
至此,HA功能已經激活,備份主機及virtual server由pulse daemon定時相互探詢,一但virtual
server故障,備份主機立刻激活代替;至virtual server 正常上線後隨即將工作交還virtual server。
LVS測試
經過了上面的配置步驟,現在可以測試LVS了,步驟如下:
1. 分別在vs1,real1,real2上運行/etc/lvs/rc.lvs_dr。注意,real1,real2上面的/etc/lvs
目錄是vs2輸出的。如果您的NFS配置沒有成功,也可以把vs1上/etc/lvs/rc.lvs_dr復制到real1,real2上,然後分別運行。確保real1,real2上面的apache已經啟動並且允許telnet。
2. 測試Telnet:從client運行telnet 10.0.0.2,
如果登錄後看到如下輸出就說明集群已經開始工作了:(假設以guest用戶身份登錄)
[guest@real1 guest]$——說明已經登錄到伺服器real1上。
再開啟一個telnet窗口,登錄後會發現系統提示變為:
[guest@real2 guest]$——說明已經登錄到伺服器real2上。
3. 測試http:從client運行iexplore http://10.0.0.2
因為在real1 和real2 上面的測試頁不同,所以登錄幾次之後,顯示出的頁面也會有所不同,這樣說明real server 已經在正常工作了。
5. LVS+Nginx+DNS+web伺服器組成的反向代理解析流程是什麼
這個架構我完全無法理解,為毛要2台lvs,一般2台lvs是為了分流或高可用,好吧我暫時這么理解他的意圖,1台nginx是作為反向代理,簡單理解就是在客戶端看來伺服器端就是一台機器,防止其他人員了解你的後端架構和處理流程,nginx也可以減輕web的資源消耗主要是內存和io,也可以配置當成日誌伺服器,減輕web的壓力,但是他後端就一台web啊,用這個架構為毛啊,好吧我暫時理解為他是為了以後方便拓展架構;1台dns伺服器,為毛啊,無法理解,如果只是為了網站本身需要完全可以自解析,直接寫hosts不是更方便,好吧,其實架設dns伺服器是個好習慣,但是在資源有限的前提下,我認為不如把dns換成web,資源利用率更高;lvs和nginx都有負載均衡的作用,小架構1台nginx完全可以搞定,2台lvs純屬浪費;至於123456的問題,nginx配置,推薦《決戰nginx》高性能web伺服器詳解與運維;至於架構原理,推薦《構建高可用linux伺服器》余洪春
簡單說下流程:正常應該是,客戶端包先到lvs,lvs做了高可用,lvs分發給nginx,nginx查詢dns後分發給web
6. lvs 一台轉發 兩台web 最近發現兩台很慢 於是把其中一台給撤了 跑的比兩台都快!!這是啥情況
檢查一下lvs上面的轉發速度和資源使用量
7. 美團面試題:如何設計負載均衡架構支撐千萬級用戶的高並發訪問
1.1 負載均衡介紹
1.1.1 負載均衡的妙用
1.1.2 為什麼要用lvs
那為什麼要用lvs呢?
ü 簡單一句話,當並發超過了Nginx上限,就可以使用LVS了。
ü 日1000-2000W PV或並發請求1萬以下都可以考慮用Nginx。
ü 大型門戶網站,電商網站需要用到LVS。
1.2 LVS介紹
LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統,可以在UNIX/LINUX平台下實現負載均衡集群功能。該項目在1998年5月由章文嵩博士組織成立,是 中國國內最早出現的自由軟體項目之一 。
1.2.1 相關參考資料
LVS官網: http://www.linuxvirtualserver.org/index.html
相關中文資料
1.2.2 LVS內核模塊ip_vs介紹
ü LVS無需安裝
ü 安裝的是管理工具,第一種叫ipvsadm,第二種叫keepalive
ü ipvsadm是通過命令行管理,而keepalive讀取配置文件管理
ü 後面我們會用Shell腳本實現keepalive的功能
1.3 LVS集群搭建
1.3.1 集群環境說明
主機說明
web環境說明
web伺服器的搭建參照:
Tomcat:
http://www.cnblogs.com/clsn/p/7904611.html
Nginx:
http://www.cnblogs.com/clsn/p/7750615.html
1.3.2 安裝ipvsadm管理工具
安裝管理工具
查看當前LVS狀態,順便激活LVS內核模塊。
查看系統的LVS模塊。
1.3.3 LVS集群搭建
命令集 :
檢查結果 :
ipvsadm參數說明: (更多參照 man ipvsadm)
1.3.4 在web瀏覽器配置操作
命令集 :
至此LVS集群配置完畢 !
1.3.5 進行訪問測試
瀏覽器訪問:
命令行測試:
抓包查看結果:
arp解析查看:
1.4 負載均衡(LVS)相關名詞
術語說明:
1.4.1 LVS集群的工作模式--DR直接路由模式
DR模式是通過改寫請求報文的目標MAC地址,將請求發給真實伺服器的,而真實伺服器將響應後的處理結果直接返回給客戶端用戶。
DR技術可極大地提高集群系統的伸縮性。但要求調度器LB與真實伺服器RS都有一塊物理網卡連在同一物理網段上,即必須在同一區域網環境。
DR直接路由模式說明:
a)通過在調度器LB上修改數據包的目的MAC地址實現轉發。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
b)請求的報文經過調度器,而RS響應處理後的報文無需經過調度器LB,因此,並發訪問量大時使用效率很高,比Nginx代理模式強於此處。
c)因DR模式是通過MAC地址的改寫機制實現轉發的,因此,所有RS節點和調度器LB只能在同一個區域網中。需要注意RS節點的VIP的綁定(lo:vip/32)和ARP抑制問題。
d)強調一下:RS節點的默認網關不需要是調度器LB的DIP,而應該直接是IDC機房分配的上級路由器的IP(這是RS帶有外網IP地址的情況),理論上講,只要RS可以出網即可,不需要必須配置外網IP,但走自己的網關,那網關就成為瓶頸了。
e)由於DR模式的調度器僅進行了目的MAC地址的改寫,因此,調度器LB無法改變請求報文的目的埠。LVS DR模式的辦公室在二層數據鏈路層(MAC),NAT模式則工作在三層網路層(IP)和四層傳輸層(埠)。
f)當前,調度器LB支持幾乎所有UNIX、Linux系統,但不支持windows系統。真實伺服器RS節點可以是windows系統。
g)總之,DR模式效率很高,但是配置也較麻煩。因此,訪問量不是特別大的公司可以用haproxy/Nginx取代之。這符合運維的原則:簡單、易用、高效。日1000-2000W PV或並發請求1萬以下都可以考慮用haproxy/Nginx(LVS的NAT模式)
h)直接對外的訪問業務,例如web服務做RS節點,RS最好用公網IP地址。如果不直接對外的業務,例如:MySQL,存儲系統RS節點,最好只用內部IP地址。
DR的實現原理和數據包的改變
(a) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP
(b) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(c) IPVS比對數據包請求的服務是否為集群服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,然後將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址
(d) 由於DS和RS在同一個網路中,所以是通過二層來傳輸。POSTROUTING鏈檢查目標MAC地址為RIP的MAC地址,那麼此時數據包將會發至Real Server。
(e) RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之後,將響應報文通過lo介面傳送給eth0網卡然後向外發出。 此時的源IP地址為VIP,目標IP為CIP
(f) 響應報文最終送達至客戶端
1.5 在web端的操作有什麼含義?
1.5.1 RealServer為什麼要在lo介面上配置VIP?
既然要讓RS能夠處理目標地址為vip的IP包,首先必須要讓RS能接收到這個包。
在lo上配置vip能夠完成接收包並將結果返回client。
1.5.2 在eth0網卡上配置VIP可以嗎?
不可以,將VIP設置在eth0網卡上,會影響RS的arp請求,造成整體LVS集群arp緩存表紊亂,以至於整個負載均衡集群都不能正常工作。
1.5.3 為什麼要抑制ARP響應?
① arp協議說明
為了提高IP轉換MAC的效率,系統會將解析結果保存下來,這個結果叫做ARP緩存。
ARP緩存表是把雙刃劍
ARP廣播進行新的地址解析
測試命令
windows查看arp -a
③arp_announce和arp_ignore詳解
lvs在DR模式下需要關閉arp功能
arp_announce
對網路介面上,本地IP地址的發出的,ARP回應,作出相應級別的限制:
確定不同程度的限制,宣布對來自本地源IP地址發出Arp請求的介面
arp_ignore 定義
對目標地定義對目標地址為本地IP的ARP詢問不同的應答模式0
抑制RS端arp前的廣播情況
抑制RS端arp後廣播情況
1.6 LVS集群的工作模式
DR(Direct Routing)直接路由模式
NAT(Network Address Translation)
TUN(Tunneling)隧道模式
FULLNAT(Full Network Address Translation)
1.6.1 LVS集群的工作模式--NAT
通過網路地址轉換,調度器LB重寫請求報文的目標地址,根據預設的調度演算法,將請求分派給後端的真實伺服器,真實伺服器的響應報文處理之後,返回時必須要通過調度器,經過調度器時報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。
收費站模式---來去都要經過LB負載均衡器。
NAT方式的實現原理和數據包的改變
(a). 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP
(b). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(c). IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為後端伺服器IP,然後將數據包發至POSTROUTING鏈。 此時報文的源IP為CIP,目標IP為RIP
(d). POSTROUTING鏈通過選路,將數據包發送給Real Server
(e). Real Server比對發現目標為自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP為RIP,目標IP為CIP
(f). Director Server在響應客戶端前,此時會將源IP地址修改為自己的VIP地址,然後響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP
LVS-NAT模型的特性
l RS應該使用私有地址,RS的網關必須指向DIP
l DIP和RIP必須在同一個網段內
l 請求和響應報文都需要經過Director Server,高負載場景中,Director Server易成為性能瓶頸
l 支持埠映射
l RS可以使用任意操作系統
l 缺陷:對Director Server壓力會比較大,請求和響應都需經過director server
1.6.2 LVS集群的工作模式--隧道模式TUN
採用NAT技術時,由於請求和響應的報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成為瓶頸。
為了解決這個問題,調度器把請求的報文通過IP隧道(相當於ipip或ipsec )轉發至真實伺服器,而真實伺服器將響應處理後直接返回給客戶端用戶,這樣調度器就只處理請求的入站報文。
由於一般網路服務應答數據比請求報文大很多,採用 VS/TUN技術後,集群系統的最大吞吐量可以提高10倍。
VS/TUN工作流程,它的連接調度和管理與VS/NAT中的一樣,只是它的報文轉發方法不同。
調度器根據各個伺服器的負載情況,連接數多少,動態地選擇一台伺服器,將原請求的報文封裝在另一個IP報文中,再將封裝後的IP報文轉發給選出的真實伺服器。
真實伺服器收到報文後,先將收到的報文解封獲得原來目標地址為VIP地址的報文, 伺服器發現VIP地址被配置在本地的IP隧道設備上(此處要人為配置),所以就處理這個請求,然後根據路由表將響應報文直接返回給客戶。
TUN原理和數據包的改變
(a) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP 。
(b) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(c) IPVS比對數據包請求的服務是否為集群服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然後發至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP
(d) POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸)。 此時源IP為DIP,目標IP為RIP
(e) RS接收到報文後發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裡面還有一層IP首部,而且目標是自己的lo介面VIP,那麼此時RS開始處理此請求,處理完成之後,通過lo介面送給eth0網卡,然後向外傳遞。 此時的源IP地址為VIP,目標IP為CIP
(f) 響應報文最終送達至客戶端
LVS-Tun模型特性
1.6.3 LVS集群的工作模式--FULLNAT
LVS的DR和NAT模式要求RS和LVS在同一個vlan中,導致部署成本過高;TUNNEL模式雖然可以跨vlan,但RealServer上需要部署ipip隧道模塊等,網路拓撲上需要連通外網,較復雜,不易運維。
為了解決上述問題,開發出FULLNAT
該模式和NAT模式的區別是:數據包進入時,除了做DNAT,還做SNAT(用戶ip->內網ip)
從而實現LVS-RealServer間可以跨vlan通訊,RealServer只需要連接到內網。類比地鐵站多個閘機。
1.7 IPVS調度器實現了如下八種負載調度演算法:
a) 輪詢(Round Robin)RR
調度器通過"輪叫"調度演算法將外部請求按順序輪流分配到集群中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接數和系統負載。
b) 加權輪叫(Weighted Round Robin)WRR
調度器通過"加權輪叫"調度演算法根據真實伺服器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的伺服器處理更多的訪問流量。
調度器可以自動問詢真實伺服器的負載情況,並動態地調整其權值。
c) 最少鏈接(Least Connections) LC
調度器通過"最少連接"調度演算法動態地將網路請求調度到已建立的鏈接數最少的伺服器上。
如果集群系統的真實伺服器具有相近的系統性能,採用"最小連接"調度演算法可以較好地均衡負載。
d) 加權最少鏈接(Weighted Least Connections) Wlc
在集群系統中的伺服器性能差異較大的情況下,調度器採用"加權最少鏈接"調度演算法優化負載均衡性能,具有較高權值的伺服器將承受較大比例的活動連接負載。調度器可以自動問詢真實伺服器的負載情況,並動態地調整其權值。
e) 基於局部性的最少鏈接(Locality-Based Least Connections) Lblc
"基於局部性的最少鏈接" 調度演算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。
該演算法根據請求的目標IP地址找出該目標IP地址最近使用的伺服器,若該伺服器 是可用的且沒有超載,將請求發送到該伺服器。
若伺服器不存在,或者該伺服器超載且有伺服器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務 器,將請求發送到該伺服器。
f) 帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
"帶復制的基於局部性最少鏈接"調度演算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。
它與LBLC演算法的不同之處是它要維護從一個 目標IP地址到一組伺服器的映射,而LBLC演算法維護從一個目標IP地址到一台伺服器的映射。
該演算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小連接"原則從伺服器組中選出一台伺服器,若伺服器沒有超載,將請求發送到該伺服器。
若伺服器超載,則按"最小連接"原則從這個集群中選出一 台伺服器,將該伺服器加入到伺服器組中,將請求發送到該伺服器。
同時,當該伺服器組有一段時間沒有被修改,將最忙的伺服器從伺服器組中刪除,以降低復制的 程度。
g) 目標地址散列(Destination Hashing) Dh
"目標地址散列"調度演算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求發送到該伺服器,否則返回空。
h) 源地址散列(Source Hashing)SH
"源地址散列"調度演算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的伺服器。
若該伺服器是可用的且未超載,將請求發送到該伺服器,否則返回空。
1.8 LVS+Keepalived方案實現
1.8.1 keepalived功能
1. 添加VIP
2. 添加LVS配置
3. 高可用(VIP漂移)
4. web伺服器 健康 檢查
1.8.2 在負載器安裝Keepalived軟體
# 檢查軟體是否安裝
1.8.3 修改配置文件
lb03上keepalied配置文件
lb04的Keepalied配置文件
keepalived persistence_timeout參數意義 LVS Persistence 參數的作用
http://blog.csdn.net/nimasike/article/details/53911363
1.8.4 啟動keepalived服務
1.8.5 在web伺服器上進行配置
注意:web伺服器上的配置為臨時生效,可以將其寫入rc.local文件,注意文件的執行許可權。
使用curl命令進行測試
至此keepalived+lvs配置完畢
1.9 常見LVS負載均衡高可用解決方案
Ø 開發類似keepalived的腳本,早期的辦法,現在不推薦使用。
Ø heartbeat+lvs+ldirectord腳本配置方案,復雜不易控制,不推薦使用
Ø RedHat工具piranha,一個web界面配置LVS。
Ø LVS-DR+keepalived方案,推薦最優方案,簡單、易用、高效。
1.9.1 lvs排錯思路