《大规模Web服务开发技术》伊藤直也 | PDF下载|ePub下载
类别: 计算机
内容简介 · · · · · ·
Hatena是日本最大的Web服务提供商之一,它提供的服务包括关键字(类似于维基百科)、博客、相册等。《大规模Web服务开发技术》由伊藤直也、田中慎司所著,内容主要来自Hatena为学生们举行的暑期实习的课程,内容涵盖广泛,介绍了性能优化、分布式、算法、系统架构等各个方面,甚至还介绍了硬件的经济成本,是运维工程师们必不可少的参考书。书中还包括几个算法实习课题,介绍了压缩算法、全文搜索等算法的实现方法,对于打算靠Web创业的人不失为一本很不错的参考书。
作者简介 · · · · · ·
伊藤直也(Naoya Ito)
Hatena株式会社董事兼CTO。合著作有《BlogHacks(0‘Reilly Japan)、《“24小时365天”服务器/基础设施的支撑技术》(技术评论社)。曾获情报处理学会主办的“Software Japan 2009”的Software JapanAward奖,以及“乐天Technical Conference 2008”的Technology Award银奖。
田中慎司(Shinji Tanaka)
Hatena株式会社董事,信息学博士。合著有《“24小时365天”服务器/基础设施的支撑技术》(技术评论社)一书,还主持过多本著作的翻译。支撑着Hatena服务器的是由600多台服务器构成的系统,现在这一系统的性能及设备运维由他全权负责。
目录 · · · · · ·
目 录
第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的创建方法——逆向索引的创建方法 200
小结 210
Postings的创建方法——逆向索引的创建方法 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
· · · · · ·
第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的创建方法——逆向索引的创建方法 200
小结 210
Postings的创建方法——逆向索引的创建方法 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
· · · · · ·
发表回复
要发表评论,您必须先登录。