标题：大规模Web服务开发技术
图书信息
大规模Web服务开发技术  [日]伊藤直也, 田中慎司编著
李剑 译
ISBN 978-7-121-13884-3  
2011年7月出版
定价：59.00元
16开
356页
内 容 简 介
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——考虑局部性的分布式􀁘.............................. 75
根据访问模式分割成“岛”——考虑局部性的分布式􀁙... 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