大規模Web服務開發技術

大規模Web服務開發技術

《大規模Web服務開發技術》是電子工業出版社2011年7月出版的圖書,作者是伊藤直也、田中慎司。該書講述了Web服務開發技術方面的知識。

內容簡介

Hatena 是日本最大的Web 服務提供商之一,它提供的服務包括關鍵字(類似於維基百科)、部落格、相冊等。本書的內容主要來自Hatena 為學生們舉行的暑期實習的課程,內容涵蓋廣泛,介紹了性能最佳化、分散式、算法、系統架構等各個方面,甚至還介紹了硬體的經濟成本,是運維工程師們必不可少的參考書。該書中包括幾個算法實習課題,介紹了壓縮算法、全文搜尋等算法的實現方法,對於打算靠Web 創業的人不失為一本很不錯的參考書。

譯者序

去年 8 月份,fcicq 向我推薦了《大規模Web 服務開發技術》這本書。當時這本書剛剛出版,在日本著實火了一段時間。後來到網上一查,發現我以前在日本的同事也寫了一篇部落格推薦這本書,看樣子這本書已成為Web 技術人員人手必備的參考讀物了。

後來博文視點的策劃編輯張春雨找到我,希望我翻譯這本書。我在日本工作期間,就對日本的IT 技術十分佩服,尤其是Web 相關技術,很多知名的技術大牛,如伊藤直也、小飼彈等

都寫過許多深入研究技術的文章,見解也相當獨到。而在日本的書店裡,Web 技術的書籍也是琳琅滿目,其中不乏珍品。因此我很想找個機會把日本的技術書籍帶到中國來。於是,與張編輯一拍即合,當即接下了這本書的翻譯任務。

正如這本書的前言裡所說,這本書的內容主要來自Hatena株式會為學生們舉行的暑期實習課程,因此其形式也是以講義為主,風格和一般的技術讀物略有不同。其內容涵蓋範圍也很廣,從性能最佳化、分散式,到算法、系統架構,甚至還介紹了硬體的經濟成本。最吸引人的就是書中的幾個實習課題,介紹了壓縮算法、全文搜尋等算法的實現方法。

在翻譯該書時,我想到了以前做網站開發時的幾件事。

第一件就是性能最佳化的重要性。當時我們開發了一個類似於RSS 閱讀器的網站,其中有個推薦功能,可以根據訪問量、收藏人數等對文章進行社會化推薦。由於計算量很大,因此只能寫成批處理放到夜間執行,但執行效率實在不堪忍受——40 萬的數據量,計算一次就要3 個小時。後來我們對SQL 語句進行了最佳化,使得計算時間從3 小時一下子減少到了20 分鐘。

第二件就是維護工作的辛苦程度。網站對 Web 伺服器採用了分散式,將請求分散到32 台伺服器上。每次版本更新,都要制定嚴密的更新計畫,先改變負載均衡器設定,然後停掉一半伺服器,更新代碼,再然後逐台測試;之後再切換負載均衡器以更新另一半伺服器並測試。更新都是在深夜進行的,每次更新都會持續到凌晨3 點多才能下班。

第三件就是不可知事件的應對策略。這本書里提到了Yahoo!攻擊,這正是我們當年親身經歷過的。當時晚上9 點多,我們突然收到了大量報警郵件,報告相冊服務的負載過高。一看伺服器已經幾乎無法訪問了。調查之後發現,一名博主引用了相冊中的圖片,而這篇文章又被Yahoo!上的一篇新聞引用。於是來自Yahoo!的巨大流量湧入我們的相冊伺服器,導致服務中止。後來,我們改變了相冊服務的架構,並增加了快取機制,以避免這類事件再次發生。

對於運維高手來說,解決這些問題應該是輕車熟路了,但當時我們的團隊沒有類似的經驗,只能自己慢慢摸索解決方法。而Hatena 株式會的技術專家們將他們的運維經驗寫成了書,使我們有幸分享這些寶貴的經驗和知識。如果當時我們有這樣一本書,這幾個問題也就迎刃而解了。願這本書能對廣大網站運維人員(特別是初涉該領域的新手們)有所幫助。

李 劍

2011 年2 月27 日

前言

自己開發的 Web 服務,以後規模增大時系統能否承受得起?從事Web 開發的諸位中很多人都有這個顧慮吧,或者是系統每天都會陷入困境,如何才能打破這種狀況?面對成長起來的Web 服務,整日愁眉苦臉的人一定存在吧。

我也有過完全相同的經歷。

Hatena 網站,月訪問人次1500 萬,而我們參與了規模如此龐大的系統的開發和運營。1000 台伺服器分擔負載,100 多萬用戶不停地發表部落格或收藏社會化書籤,數據量每天都在激增,伺服器資源頻頻告急。技術人員為了上GB、上TB 的數據量絞盡腦汁。即便如此,流量的波濤也從未平息過。

曾幾何時,Hatena 的團隊尚未成熟,面對規模日益增大的系統束手無策。龐大的數據和巨大的流量湧來,伺服器宕機、服務停止。趕緊深夜跑過去重啟伺服器,覺得總算能穩定了,清晨回家之後,發現伺服器又宕機了,這種事情也曾面對過。

怎樣才能制服大規模服務這頭野獸?本書凝聚了 Hatena 的技術人員在反覆試驗中得到的技術和訣竅——即大規模服務技術的地圖和指南。

本書是開發、運營大規模服務的技術者的入門書。Web 服務在不斷成長,當它的數據規模變大,處理起來也就不再易如反掌了,此時,怎樣做才是正確的?為了避免系統宕機,寫代碼時應該注意什麼?設計高可擴展性(scalability)的系統時應該記住哪些要點?這些都是本書的內容。

Hatena 每年夏天都舉辦面向學生的、以就業體驗為目的的實習活動(Hatena Summer Intern)。這些實習活動會讓學生參與到Hatena 的系統開發中。我們把開發經驗很少的學生們與正式員工同樣看待,讓他們獲得大規模系統開發的成功經驗,這就是Hatena 之道。那么,我們希望學生們在開發之前知道什麼呢?正是我們歷經坎坷學到的大規模服務的開發和運維的知識。

通過實習計畫,Hatena 的大規模服務技術的培訓方法也有了體系。本書就是以實習課程為基礎,試圖來說明大規模服務技術。

本書的內容從作業系統和計算機的原理開始,介紹資料庫的分散式方法、實用算法在系統中的套用、能支撐海量數據的搜尋引擎的原理,以及統觀系統全局的基礎設施設計的知識等多個方面。

這是擁有 1500 萬用戶的Hatena 才能傳達的真實的、實踐性的技術和現場感。缺乏經驗的學生們在短短几天的培訓中學到大規模服務開發所需的知識,在本書中得以系統化。本書融匯了這些知識,努力做到妙趣橫生、百讀不厭,並讓讀者學到真正的知識。

希望本書能成為從事 Web 服務開發的所有工程師們的得力助手和工具。

2010 年6 月

Hatena 株式會CTO 伊藤直也

作品目錄

第 1 章大規模 Web 服務的開發定位——掌握整體..............2

第0 課本書的起源——本書講述的範圍................................... 3

從事大規模Web 服務開發——面向大學生的Hatena 實習... 3

本書講述的內容........................................................................ 3

本書不講述的內容.................................................................... 5

致今後從事大規模Web 服務的人........................................... 5

第1 課大規模服務和小規模服務................................................. 6

Hatena 的服務規模................................................................... 6

Hatena 是大規模,Google、Facebook 是超大規模................ 8

小規模服務和大規模服務的區別............................................ 9

應對大規模數據量.................................................................. 11

第2 課持續增長的服務和大規模化的障礙............................ 13

Web 服務的困難...................................................................... 13

Hatena 的成長經歷................................................................. 13

系統增長戰略——最小化開端、預見變化的管理和設計... 17

第3 課服務開發現場...................................................................... 18

Hatena 的技術團隊體制.......................................................... 18

Hatena 的溝通方式................................................................. 19

服務開發的實際狀況.............................................................. 19

開發所用的工具...................................................................... 21

總結......................................................................................... 23

第2 章大規模數據處理入門

——記憶體和磁碟、Web 應用程式和負載..................24

第4 課 Hatena Bookmark 的數據規模....................................... 25

以Hatena Bookmark 為例介紹大規模數據........................... 25

Hatena Bookmark 的數據規模................................................ 25

針對大規模數據的查詢——處理大規模數據的感覺........... 26

第5 課大規模數據處理的難點——記憶體和磁碟....................28

為何處理大規模數據如此困難——因為無法在記憶體中

計算 ..........................................................................................28

記憶體和磁碟的速度差異——記憶體要快105~106 倍...............28

為何磁碟這么慢?——記憶體和磁碟.......................................29

作業系統層的加速處理..........................................................31

傳輸速度和匯流排的速度差異...................................................31

第6 課可擴展性的要點..................................................................37

擴展和可擴展性......................................................................37

可擴展性的要點——CPU 負載和I/O 負載...........................38

Web 應用程式和負載的關係..................................................38

資料庫的可擴展性很難保證...................................................39

第7 課處理大規模數據的基礎知識...........................................44

面向程式設計師的大規模數據的基礎...........................................44

處理大規模數據的三個重點——寫程式的技巧...................44

處理大規模數據之前的三大前提知識——程式開發的

底層基礎 ..................................................................................45

第3 章作業系統的快取和分散式

——高效處理大規模數據的原理.................................50

第8 課作業系統的快取機制........................................................51

在理解作業系統快取的基礎上編寫應用程式——頁面

快取 ..........................................................................................51

虛擬記憶體機制..........................................................................52

Linux 頁面快取原理................................................................54

VFS...........................................................................................56

Linux 以頁面為單位快取磁碟................................................57

記憶體空閒時就快取——通過sar 確認.....................................59

增加記憶體降低I/O 負載...........................................................60

頁面快取是透明的..................................................................61

第9 課降低 I/O 負載的策略.........................................................67

以快取為前提的降低I/O 負載的策略...................................67

擴展到多台伺服器——無法全部快取的情況.......................68

單純增加數量無法保證可擴展性...........................................69

第10 課利用局部性的分散式...................................................... 74

什麼是利用局部性的分散式?............................................ 74

Partitioning——考慮局部性的分散式X.............................. 75

根據訪問模式分割成“島”——考慮局部性的分散式Y... 78

以頁面快取為前提的基本套用規則.................................... 79

第4 章資料庫的橫向擴展策略

——以分散式為基礎的MySQL 套用.........................82

第11 課正確套用索引

——分散式MySQL 套用的大前提............................ 83

分散式MySQL 套用的三大要點........................................ 83

靈活套用作業系統快取.................................................... 83

索引的重點——B 樹............................................................ 86

索引的效果........................................................................... 89

確認索引是否有效的方法——explain 命令........................ 92

第12 課 MySQL 的分散式

——以擴展為前提的系統設計.................................... 95

MySQL 的replication 功能.................................................. 95

master/slave 的特徵——對參照系進行擴展,更新類

不擴展 ................................................................................... 96

第13 課 MySQL 的橫向擴展和Partitioning ............................ 99

MySQL 的橫向擴展策略..................................................... 99

關於Partitioning(表分割)的補充.................................... 99

以Partitioning 為前提的設計............................................... 99

避免JOIN——利用where…in…......................................... 102

Partitioning 的代價............................................................. 103

第2~4 章的小結............................................................... 107

第5 章大規模數據處理“實踐”入門

——應用程式開發的重點.............................................108

第14 課特殊用途索引——處理大規模數據........................ 109

索引和系統架構——超過RDBMS 的處理能力時........... 109

特殊用途索引——使用調優後的數據結構.......................111

第15 課理論聯繫實踐..................................................................115

探尋必須的技術條件..........................................................115

第2~5 章小結....................................................................117

第6 章壓縮編程

——考慮數據大小和I/O 加速之間的關係.............118

第16 課[課題]以緊湊、簡潔方式保存整數數據..............119

以緊湊方式保存整數數據..................................................119

出題意圖——解決該課題有什麼好處?...........................119

課題所用檔案的內容..........................................................121

第17 課可變位元組碼和速度的感覺...........................................122

可變位元組碼——用緊湊格式保存整數數據.......................122

可變位元組碼的偽代碼..........................................................123

用“差”存儲已排序整數..................................................126

(補充)壓縮的基礎........................................................126

(補充)壓縮對象是整數的情形——背景理論.............127

第18 課課題詳解及解答範例....................................................129

課題詳解..............................................................................129

(參考)pack()函式——將Perl 內部數據結構以

二進制形式輸出..................................................................131

(參考)二進制數據的read/write ...................................133

(參考)性能分析............................................................135

解答範例和思路..................................................................136

第7 章算法實用化

——從身邊的例子來看理論、研究的實踐投入....142

第19 課算法和算法評測.............................................................143

數據規模和複雜度的差異..................................................143

何謂算法?..........................................................................144

學習算法的意義——計算機資源有限,工程師的通用

語言......................................................................................145

算法評測——複雜度記法...................................................146

紙巾能摺疊幾次?——O(logn)和O(n)的差距..................148

算法和數據結構——千絲萬縷的聯繫...............................149

複雜度和常數項——評測很重要.......................................150

套用算法的實際情況——簡單就是美.............................. 151

靈活套用第三方實現——CPAN 等................................... 153

通過實例加深感受............................................................. 155

第20 課 Hatena Diary 的關鍵字連結........................................ 156

什麼是關鍵字連結? ......................................................... 156

最初的實現......................................................................... 156

出問題了!——關鍵字字典越來越大.............................. 157

用模式匹配實現關鍵字連結的問題.................................. 158

從正則表達式到Trie——改變匹配的實現方式............... 158

Aho-Corasick 算法.............................................................. 160

換成Regexp::List................................................................ 162

關鍵字連結的實現、變遷和考察...................................... 163

第21 課 Hatena Bookmark 的文章分類................................... 164

什麼是文章分類? ............................................................. 164

機器學習和大規模數據..................................................... 165

大規模數據和Web 服務——The Google Way of Science ... 166

貝葉斯過濾器的原理......................................................... 167

算法實用化之路——Hatena Bookmark 的實例................ 170

防守姿態和進攻姿態——從文檔分類功能說開去........... 171

第8 章 Hatena 關鍵字連結的實現

——理解通向套用之路..................................................176

第22 課[課題]創建Hatena 關鍵字連結............................. 177

使用Aho-Corasick 算法創建Hatena 關鍵字連結............ 177

編寫測試............................................................................. 180

第23 課解答範例和思路............................................................. 182

解答範例............................................................................. 182

第9 章挑戰全文搜尋技術

——各種各樣的大規模數據處理經驗技巧...........184

第24 課全文搜尋技術的套用範圍.......................................... 185

用Hatena 的數據創建搜尋引擎........................................ 185

Hatena Diray 的全文搜尋——搜尋服務之外的搜尋

系統..................................................................................... 185

Hatena Bookmark 的全文搜尋——滿足細節要求的系統... 187

第25 課搜尋系統的架構.............................................................190

搜尋系統所需的步驟..........................................................190

各種各樣的搜尋引擎..........................................................191

全文搜尋的種類..................................................................193

第26 課搜尋引擎的內部結構....................................................198

逆向索引的結構——Dictionary+Postings..........................198

Dictionary 的創建方法——逆向索引的創建方法1 .........200

小結......................................................................................210

Postings 的創建方法——逆向索引的創建方法2 ............211

關於評分的補充..................................................................213

參考文獻..............................................................................214

第10 章創建全文搜尋引擎

——基本部分、改進、速度和準確度的要求....216

第27 課[課題]創建Hatena Bookmark 全文搜尋..............217

開發全文搜尋引擎..............................................................217

課題內容..............................................................................217

示例數據格式和數據大小..................................................218

字典的組成——Dictionary、Postings ................................219

界面......................................................................................220

基礎部分+改進...................................................................220

以速度和準確度一決勝負..................................................221

第28 課答案範例和思路.............................................................223

解答範例..............................................................................223

indexer pl 的實現.................................................................223

searcher pl 的實現................................................................225

可以改善的地方..................................................................227

第11 章支持大規模數據處理的伺服器/基礎設施入門

—— Web 服務的後台..................................................230

第29 課企業軟體vs. Web 服務.................................................231

企業軟體vs. Web 服務——套用範圍上的差異................231

Web 服務的基礎設施——三個重點..................................233

第30 課雲 vs.自行構建基礎設施..............................................235

雲計算..................................................................................235

雲的優缺點......................................................................... 235

Hatena 套用的雲服務......................................................... 236

自行構築基礎設施的優點................................................. 237

自行構建基礎設施和垂直結合模型.................................. 239

Hatena 的服務規模............................................................. 240

Hatena Bookmark 的系統架構圖....................................... 240

第12 章保證可擴展性的必要思路

——規模擴大和系統擴展..........................................242

第31 課層和可擴展性................................................................. 243

對可擴展性的要求——一台伺服器能處理的流量極限.... 243

各層的可擴展性................................................................. 244

第32 課掌握負載進行調優........................................................ 245

掌握負載——可視化的管理界面...................................... 245

測量負載的指標——平均負載、記憶體和CPU 相關信息.... 247

根據用途進行調優——面向用戶的伺服器和面向爬蟲

的伺服器 ............................................................................. 247

應用程式伺服器、資料庫伺服器的調優策略和伺服器

數量 ..................................................................................... 249

服務規模和調優................................................................. 250

保證可擴展性..................................................................... 251

第13 章保證冗餘性和系統的穩定化

——實現100%線上率的原理..................................252

第33 課保證冗餘性...................................................................... 253

保證冗餘性——應用程式伺服器...................................... 253

保證冗餘性——資料庫伺服器.......................................... 254

保證冗餘性——存儲伺服器.............................................. 257

第34 課系統穩定化...................................................................... 261

保持系統穩定的權衡......................................................... 261

系統的不穩定因素............................................................. 262

第35 課系統穩定對策................................................................. 267

實際的系統穩定對策——維持適當餘量,消滅不穩定

因素 ..................................................................................... 267

第14 章提高效率

——提高硬體資源的使用率......................................270

第36 課虛擬化技術......................................................................271

引入虛擬化技術..................................................................271

虛擬化技術的效果..............................................................272

虛擬伺服器的構建策略......................................................273

總結虛擬化的優勢..............................................................275

虛擬化和運營——通過伺服器管理工具在運營上發揮

虛擬化的優勢......................................................................276

虛擬化的注意點..................................................................277

第37 課硬體和提高效率

——實現低成本的關鍵技術........................................280

提高處理器性能..................................................................280

記憶體和硬碟成本下降..........................................................281

有效利用廉價硬體——以虛擬化為前提的硬體套用.......282

SSD ......................................................................................284

第15 章 Web 服務和網路

——通過網路看服務增長...........................................288

第38 課網路的分界點..................................................................289

服務增長和網路的分界點..................................................289

1Gbps 的極限——PC 路由器的極限.................................289

500 台主機的極限——子網、ARP 表的極限...................290

網路架構的層次化..............................................................291

全球化..................................................................................292

第39 課挑戰更高的極限.............................................................295

超越10Gbps 的世界...........................................................295

Hatena 的基礎設施——第11~15 章的總結.....................296

第16 章特別篇 當前構建Web 服務需要的實踐技術

——應對大規模Web 服務須知...............................298

特別篇第1 課作業佇列系統TheSchwartz、Gearman .......299

Web 服務和請求......................................................299

作業佇列系統入門...................................................299

Hatena 的作業佇列系統..........................................300

通過日誌進行分析.................................................. 302

特別篇第2 課存儲方式的選擇RDBMS 還是

key-value 存儲..................................................... 303

如何保存不斷增加的數據...................................... 303

選擇存儲系統的前提條件...................................... 304

存儲系統的種類...................................................... 305

RDBMS.................................................................... 305

分散式key-value 存儲............................................ 308

分散式檔案系統...................................................... 310

其他存儲.................................................................. 312

存儲系統的選擇策略.............................................. 314

特別篇第3 課快取系統——Squid、Varnish......................... 315

Web 應用程式負載與代理/快取系統..................... 315

Squid——基本結構................................................. 317

Varnish...................................................................... 321

特別篇第4 課計算集群——Hadoop........................................ 323

大量日誌數據的並行處理 ...................................... 323

MapReduce 計算模型.............................................. 323

Hadoop ..................................................................... 325

索引..................................................................................................327

相關詞條

熱門詞條

聯絡我們