漫談大型網站架構

csdn發表於2015-12-18

  架構無處不在,《大型分散式網站架構設計與實踐》一書的作者陳康賢來分享他對大型網站架構的理解。

  以下為正文:

  大型網站架構從來都不是一個預先定義的架構,而是一個演進式的架構。很少有一個網站從建站開始,就能夠因具備大型網站的所有屬性而一成不變的,從最簡單的LAMP架構,再到基於IOE的大型集中式應用架構,再演變成時下的分散式應用架構,隨著網站使用者規模的擴大,架構也在不斷演進。從實體機到虛擬機器再到當前流行的Docker技術,從單機房到同城多機房再到異地多活,從LAMP到J2EE再到各種分散式中介軟體如服務框架、分散式訊息佇列、配置管理中介軟體、分散式資料訪問層,由簡至繁的艱難蛻變,也正是一個網站從小變大由弱變強的成長曆程,哪裡有挑戰,哪裡才會有變革,這正是作為技術人建功立業的時刻。

  規模不斷擴大,但成本不可能隨之線性增長,因此,如何利用規模效應降低資源成本,抽取公共部分,避免重複造輪子,提高開發效率和響應速度,成了必須思考的問題。技術存在的核心價值就是為了生產力的提高,當技術架構制約了生產力發展,就需要進行技術變革。當前支撐大型網站的幾大核心技術,分散式、服務化、虛擬化,其中分散式解決的是規模化帶來的問題,所謂的規模化即包括資料規模越來越大,訪問量越來越高,也包括開發團隊規模越來越大,工程程式碼規模越來越大。單機的儲存能力以及負載能力必然有限,從PC到小型機再到中型機、大型機,成本將成指數級升高,而成百上千人開發同一個工程,則導致系統臃腫,開發、釋出效率極低,網際網路將喪失了賴以生存的靈活性,回到以前傳統軟體的開發模式。通過應用垂直拆分,叢集分散式水平擴充套件,不僅使系統容量得到提升,儲存和負載將分配到大規模的廉價叢集上,以降低成本,開發效率和開發模式也得到改變。通過公共業務抽取,將誕生一批處於系統底層的基礎服務,避免相同的內容重複造輪子,提高開發效率。作為大型網站架構中最重要的中介軟體,服務化框架簡化了服務呼叫所涉及的物件序列化與反序列化,通訊協議,服務路由等操作,以及到後來誕生的一個新名詞—服務治理,去梳理服務的依賴關係、呼叫鏈路、強弱依賴等等更復雜的問題。除此之外,在架構師的武器庫中,還有眾多不同應用場景下使用的中介軟體,如訊息中介軟體、 分散式資料訪問層、配置管理中心、資料遷移工具、分散式檔案系統等等,這些都是日常系統架構中的粘合劑。大型網站的另外一個核心技術就是資源的虛擬化,從實體機到Xen、KVM再到基於LXC的輕量級虛擬化方案,再到Docker,技術的更新換代使得資源的利用率越來越高,叢集的運維、部署和管理越來越方便。另外不同的場景下如何選擇儲存也十分重要,高併發和大資料往往都不會單獨出現,到底是採用磁碟、SSD還是採用記憶體,到底是採用分散式檔案系統,關聯式資料庫,還是NOSQL,還是採用記憶體分散式快取,不同的場景下方案會大相徑庭,分散式檔案系統儲存容量幾乎可以理解為無限,但是吞吐低,關係型資料庫有嚴謹的schema以及功能強大的SQL語句,可以滿足各種複雜的查詢條件,但無奈擴充套件太麻煩,為了應對高併發讀寫訪問,master-slave、讀寫分離、分庫分表一折騰,不僅工作量大增,且查詢維度受限,還需要引入垂直化搜尋引擎來擴充套件查詢維度,NOSQL雖然能自動分割槽擴容,但無奈不支援SQL,而快取雖快,記憶體條又太貴,架構就是要不斷的權衡取捨。

  大公司之所以不如小公司響應速度快,原因在於大公司有太多積累,有時候積累多了也會成為包袱,現有的模型會使得新業務難以快速融入。當遇到問題和挫折的時候,就是思考改進和系統變革的時候,從來沒有哪個系統在設計好之後就封存程式碼永不改變的,技術永遠是不斷髮展,需求和市場也是不斷變化的,因此不要指望用一種架構滿足所有的需求,系統設計需要滿足一段時間內的可擴充套件性,但千萬不要過度設計,因為過了半年之後你回過頭來重新review,你會發現需求早已改變,這就是網際網路的快節奏。對於系統的架構來說,一段時間之內架構的演變,常常會經歷從清晰,再到模糊混亂,再重構,再清晰,然後又變得模糊的過程,市場環境總是瞬息萬變的,因此,系統的設計要遵循對擴充套件開放,對修改封閉的原則,做到這點即可方便及時的接入新流程,又能夠不影響既有的流程。從巨集觀來看,各個系統間的關係一定不是煙囪與煙囪的關係,而是猶如城市裡的高樓大廈,通過公路連線起來,因此,要提高建房子的速度,就要充分利用已有的基礎設施,已有的中介軟體,來降低系統構建的成本和風險。架構設計的幾個層次,沒有架構也是架構,專注於解決現有問題也能稱為架構,而好的架構應該是即能夠約束開發者又能夠解放開發者使其專注於功能的設計。儘量將複雜的事情變的簡單,而不要將簡單的事情變的複雜,技術從來都不是用來炫的,而是用來解決實際問題的,因此我們不需要花拳繡腿,洛克希德·馬丁公司的著名飛機設計師凱利·約翰遜所提出的KISS原則,就是最好的詮釋。風險驅動的架構理念告訴我們,避免失敗是所有工程技術的核心,架構也是技術,運用架構技術去緩解風險,避免走極端,是架構師的最根本職責。

  作者介紹:陳康賢(花名龍隆, 部落格),淘寶技術部技術專家,著有《大型分散式網站架構設計與實踐》一書,在分散式系統架構設計、高併發系統設計、系統穩定性保障等領域積累了較為豐富的實踐經驗,對新技術有濃厚的興趣 。

相關文章