內容簡介
《大型分散式網站架構設計與實踐》主要介紹了大型分散式網站架構所涉及的一些技術細節,包括SOA架構的實現、網際網路安全架構、構建分散式網站所依賴的基礎設施、系統穩定性保障和海量數據分析等內容;深入地講述了大型分散式網站架構設計的核心原理,並通過一些架構設計的典型案例,幫助讀者了解大型分散式網站設計的一些常見場景及遇到的問題。
作者結合自己在阿里巴巴及淘寶網的實際工作經歷展開論述。《大型分散式網站架構設計與實踐》既可供初學者學習,幫助讀者了解大型分散式網站的架構,以及解決問題的思路和方法,也可供業界同行參考,給日常工作帶來啟發。
作者簡介
陳康賢 ,淘寶花名龍隆,淘寶技術部資深研發工程師,長期在在淘寶分散式環境下耳濡目染,在分散式系統架構設計、高並發系統設計、系統穩定性保障等領域積累了較為豐富的實踐經驗。曾在程式設計師上發表過《漫談基於http協定的SOA架構》《淺析HTTP平台的安全穩定性架構》兩篇文章,對基於HTTP協定的SOA架構有深入研究,在排查解決線上問題和故障方面有豐富的實踐經驗,擅於利用數據分析解決實際問題,對新技術有濃厚的興趣。
名家推薦
2008年,TB網隨著訪問量/數據量的巨增,以及開發人員的增長,原有的架構體系已經無法支撐,於是在那一年TB網將系統改造為了一個大型分散式的網站。作者目前就職於阿里集團,清晰地看到了目前TB這個大型分散式網站的架構體系,這個架構體系其實是非常多方面的技術的融合,要掌握好最重要的首先是看清全貌,但這也是最難的。本書向大家展示了一個大型分散式網站需要的技術的全貌。
——阿里巴巴集團資深技術專家 林昊(畢玄)
筆者通過大量的實踐來分析分散式網站設計過程中常見的難題並逐步給予解答,通過本書可以對分散式網站設計進行一個系統性學習,值得一閱!
——聚划算技術部高級技術專家 劉國華(索尼)
當下有規模的網站,都採用分散式的架構實現。那么網站如何做到分散式,以及有哪些基礎的分散式系統,都是我們的架構師和開發人員想去了解的,而相關的安全問題,以及穩定性、性能、套用的線上問題定位分析等方面的問題也很重要,本書能夠比較全面地給讀者帶來這些相關知識的一個全貌,能夠讓從業人員對於這些知識有一個比較全面的了解。而康賢也是一個一直奮戰在一線的技術人員,親身經歷的總結會顯得更加實戰和珍貴。
——TB技術部總監 曾憲傑(華黎)
目錄
第1章 面向服務的體系架構(SOA) 1
本章主要介紹和解決以下問題,這些也是全書的基礎:
HTTP協定的工作方式與HTTP網路協定棧的結構。
如何實現基於HTTP協定和TCP協定的RPC調用,它們之間有何差別,分別適應何種場景。
如何實現服務的動態註冊和路由,以及軟負載均衡的實現。
1.1 基於TCP協定的RPC 3
1.1.1 RPC名詞解釋 3
1.1.2 對象的序列化 4
1.1.3 基於TCP協定實現RPC 6
1.2 基於HTTP協定的RPC 9
1.2.1 HTTP協定棧 9
1.2.2 HTTP請求與回響 15
1.2.3 通過HttpClient傳送HTTP請求 16
1.2.4 使用HTTP協定的優勢 17
1.2.5 JSON和XML 18
1.2.6 RESTful和RPC 20
1.2.7 基於HTTP協定的RPC的實現 22
1.3 服務的路由和負載均衡 30
1.3.1 服務化的演變 30
1.3.2 負載均衡算法 33
1.3.3 動態配置規則 39
1.3.4 ZooKeeper介紹與環境搭建 40
1.3.5 ZooKeeper API使用簡介 43
1.3.6 zkClient的使用 47
1.3.7 路由和負載均衡的實現 50
1.4 HTTP服務網關 54
第2章 分散式系統基礎設施 58
本章主要介紹和解決如下問題:
分散式快取memcache的使用及分散式策略,包括Hash算法的選擇。
常見的分散式系統存儲解決方案,包括MySQL的分散式擴展、HBase的API及使用場景、Redis的使用等。
如何使用分散式訊息系統ActiveMQ來降低系統之間的耦合度,以及進行套用間的通信。
垂直化的搜尋引擎在分散式系統中的使用,包括搜尋引擎的基本原理、Lucene詳細的使用介紹,以及基於Lucene的開源搜尋引擎工具Solr的使用。
2.1 分散式快取 60
2.1.1 memcache簡介及安裝 60
2.1.2 memcache API與分散式 64
2.1.3 分散式session 69
2.2 持久化存儲 71
2.2.1 MySQL擴展 72
2.2.2 HBase 80
2.2.3 Redis 91
2.3 訊息系統 95
2.3.1 ActiveMQ & JMS 96
2.4 垂直化搜尋引擎 104
2.4.1 Lucene簡介 105
2.4.2 Lucene的使用 108
2.4.3 Solr 119
2.5 其他基礎設施 125
第3章 網際網路安全架構 126
本章主要介紹和解決如下問題:
常見的Web攻擊手段和防禦方法,如XSS、CRSF、SQL注入等。
常見的一些安全算法,如數字摘要、對稱加密、非對稱加密、數字簽名、數字證書等。
如何採用摘要認證方式防止信息篡改、通過數字簽名驗證通信雙方的合法性,以及通過HTTPS協定保障通信過程中數據不被第三方監聽和截獲。
在開放平台體系下,OAuth協定如何保障ISV對數據的訪問是經過授權的合法行為。
3.1 常見的Web攻擊手段 128
3.1.1 XSS攻擊 128
3.1.2 CRSF攻擊 130
3.1.3 SQL注入攻擊 133
3.1.4 檔案上傳漏洞 139
3.1.5 DDoS攻擊 146
3.1.6 其他攻擊手段 149
3.2 常用的安全算法 149
3.2.1 數字摘要 149
3.2.2 對稱加密算法 155
3.2.3 非對稱加密算法 158
3.2.4 數字簽名 162
3.2.5 數字證書 166
3.3 摘要認證 185
3.3.1 為什麼需要認證 185
3.3.2 摘要認證的原理 187
3.3.3 摘要認證的實現 188
3.4 簽名認證 192
3.4.1 簽名認證的原理 192
3.4.2 簽名認證的實現 193
3.5 HTTPS協定 200
3.5.1 HTTPS協定原理 200
3.5.2 SSL/TLS 201
3.5.3 部署HTTPS Web 208
3.6 OAuth協定 215
3.6.1 OAuth的介紹 215
3.6.2 OAuth授權過程 216
第4章 系統穩定性 218
本章主要介紹和解決如下問題:
常用的線上日誌分析命令的使用和日誌分析腳本的編寫,如cat、grep、wc、less等命令的使用,以及awk、shell腳本的編寫。
如何進行集群的監控,包括監控指標的定義、心跳檢測、容量評估等。
如何保障高並發系統的穩定運行,如採用流量控制、依賴管理、服務分級、開關等策略,以及介紹如何設計高並發系統。
如何最佳化套用的性能,包括前端最佳化、Java程式最佳化、資料庫查詢最佳化等。
如何進行Java套用故障的線上排查,包括一系列排查工具的使用,以及一些實際案例的介紹等。
4.1 線上日誌分析 220
4.1.1 日誌分析常用命令 220
4.1.2 日誌分析腳本 230
4.2 集群監控 239
4.2.1 監控指標 239
4.2.2 心跳檢測 247
4.2.3 容量評估及套用水位 252
4.3 流量控制 255
4.3.1 流量控制實施 255
4.3.2 服務穩定性 260
4.3.3 高並發系統設計 265
4.4 性能最佳化 277
4.4.1 如何尋找性能瓶頸 277
4.4.2 性能測試工具 285
4.4.3 性能最佳化措施 292
4.5 Java套用故障的排查 314
4.5.1 常用的工具 314
4.5.2 典型案例分析 331
第5章 數據分析 337
本章主要介紹和解決如下問題:
分散式系統中日誌收集系統的架構。
如何通過Storm進行實時的流式數據分析。
如何通過Hadoop進行離線數據分析,通過Hive建立數據倉庫。
如何將關係型資料庫中存儲的數據導入HDFS,以及從HDFS中將數據導入關係型資料庫。
如何將分析好的數據通過圖形展示給用戶。
5.1 日誌收集 339
5.1.1 inotify機制 339
5.1.2 ActiveMQ-CPP 343
5.1.3 架構和存儲 359
5.1.4 Chukwa 362
5.2 離線數據分析 369
5.2.1 Hadoop項目簡介 370
5.2.2 Hadoop環境搭建 374
5.2.3 MapReduce編寫 384
5.2.4 Hive使用 389
5.3 流式數據分析 403
5.3.1 Storm的介紹 404
5.3.2 安裝部署Storm 407
5.3.3 Storm的使用 418
5.4 數據同步 422
5.4.1 離線數據同步 423
5.4.2 實時數據同步 429
5.5 數據報表 431
5.5.1 數據報表能提供什麼 431
5.5.2 報表工具Highcharts 432
參考文獻 445
序言
在大型網站架構的演變過程中,集中式的架構設計出於對系統的可擴展性、可維護性以及成本等多方面因素的考慮,逐漸被放棄,轉而採用分散式的架構設計。分散式架構的核心思想是採用大量廉價的PC Server,構建一個低成本、高可用、高可擴展、高吞吐的集群系統,以支撐海量的用戶訪問和數據存儲,理論上具備無限的擴展能力。分散式系統的設計,是一門複雜的學問,它涉及到通信協定、遠程調用,服務治理,系統安全、存儲、搜尋、監控、穩定性保障、性能最佳化、數據分析、數據挖掘等各個領域,對任何一個領域的深入挖掘,都能夠編寫一本篇幅不亞於本書的專門書籍。本書結合作者在阿里巴巴及TB網的實際工作經歷,重點介紹大型分散式系統的架構設計,同時,為避免過度專注於理論而使得內容顯得空洞,作者穿插介紹了很多實踐的案例,儘量讓每一個關鍵的技術點都落到實處,相信能夠幫助讀者更好地理解本書的內容。
內容大綱
全書共5章,章與章之間幾乎是相互獨立的,沒有必然的前後依賴關係,因此,讀者可以從任何一個感興趣的專題開始閱讀,但是,每一章的各個小節之間的內容是相互關聯的,因此,最好按照原文的先後順序閱讀。
第1章主要介紹企業內部SOA(Service Oriented Architecture,即面向服務的體系結構)架構的實現,包括HTTP協定的工作原理,基於TCP協定和基於HTTP協定的RPC實現,如何實現服務的路由和負載均衡,HTTP服務網關的架構。
第2章主要介紹如何保障網際網路通信的安全性,包括一些常見攻擊手段的介紹;常見的安全算法,如數字摘要、對稱加密、非對稱加密、數字簽名、數字證書的原理和使用;常用通信認證方式,包括摘要認證、簽名認證,以及基於HTTPS協定的安全通信;另外還介紹了通過OAuth協定的授權過程。
第3章介紹一些分散式系統所依賴的基礎設施,包括分散式快取,持久化存儲。持久化存儲又涵蓋了傳統的關係型資料庫MmySQL,以及近年來開始流行NOSQL資料庫如HBase、Redis,訊息系統及垂直化搜尋引擎等。
第4章介紹如何保障系統運行的穩定性,包括線上日誌分析、集群監控、流量控制、性能最佳化,以及常用的Java套用故障排查工具和典型案例。
第5章介紹如何對海量數據進行分析,包括數據的採集、離線數據分析、流式數據分析、不同數據源間的數據同步和數據報表等。
本書並不假設讀者在Java領域有很深的技術水平,但是,結合作者本人的工作經驗和使用習慣,書中的大部分案例代碼均採用Java來編寫,並且運行在Linux環境之上,因此,讀者最好對Java環境下的編程有一定的了解,並且熟悉Linux環境下的基本操作,以便能夠更加順利地閱讀本書。
致謝
首先,要感謝我的家人,特別是我的妻子,在我占用大量周末、休假的時間進行寫作的時候,能夠給予極大的寬容、支持和理解,並對我悉心照顧且承擔起了全部的家務,讓我能夠全身心地投入到寫作之中,而無須操心一些家庭瑣事,沒有你的支持和鼓勵,這本書是無法完成的。
同時,要感謝阿里巴巴及TB網,給我提供了合適的環境和平台,使自己的技能能夠得以施展,並且,身處在一群業界的技術大牛中間,也得到了很多學習和成長的機會。,另外,還要感謝我的主管飛悅對於寫作開明的態度,以及一直以來的鼓勵與支持,並在日常的工作中給予我的很多幫助。
最後,還要感謝博文視點的編輯們,本書能夠這么快出版,離不開他們的敬業精神和一絲不苟的工作態度。
感悟
一年多以前,在接到編輯約稿即將開始動筆之前,自己曾信心滿滿地認為,應該能夠比較順利地完成這本書,因為寫的內容自己都比較熟悉,而且平時工作當中也有一些筆記積累,不是從零開始的。但當真正開始寫了以後才知道,理解領悟和用文字表達出來完全是兩個層面的事情,日常工作中一些很普遍很常見的設計思路,可能是由一次次失敗和挫折得到的經驗教訓演變而來。很多時候我們只知道how,而忽略了what和why,要解釋清楚what、why、how,甚至是why not,並沒有想像中的那么容易。當然,通過寫作的過程,自己也將這些知識點從頭到尾梳理了一遍,對這些知識的認識和理解也更加深入和全面。每次重新回過頭來審閱書稿時,都會覺得某些知識點講述得還不夠透徹,需要進行補充,抑或是感覺對某些知識點的敘述不夠清晰和有條理,還能夠有更好的表述方式。但是,書不能一直寫下去,在本書完稿之時,自己並沒有想像中那樣的興奮或者放鬆,寫作時的那種“戰戰兢兢,如履薄冰”的感覺,依然縈繞在心頭,每一次落筆,都擔心會不會因為自己的疏忽或者理解上的偏差,從而誤導讀者。由於時間的因素和寫作水平的限制,書中難免會有錯誤和疏漏之處,懇請讀者批評和指正。
陳康賢
2014年5月於杭州