读《大规模Web服务开发技术》



读《大规模Web服务开发技术》

1. 适读人群

如书的前言所言,这本书的内容主要来自Hatena株式会社为学生们举行的暑期实习课程,因此,形式以讲义为主,风格与一般技术读物不同。全书内容甚广,涵盖性能优化、分布式、算法、系统架构、硬件以及经济成本等,同时,书中使用了大量Hatena的实例,实战性超强。

同时,本书来源于为学生举办的暑期实习课程,也就限定了本书并不会讲太多高深的知识,所以,本书更多的是面向几乎没有大规模web服务开发经验的学生,内容较为浅显,不适合经验丰富的大规模web服务开发人员,但对缺乏经验的学生来说确实难得的好书,使学生在几天时间内学到系统的大规模服务开发所需知识。

一句话:这本书极度适合本人这种没有大规模web开发经验而又有志向这方面发展的菜鸟学生。本书扉页所书"Web开发人员必读"并没有言过其实。

2. 大规模数据处理难点

本书在介绍大规模web服务开发定位后,首先介绍了大规模数据处理难点内存和磁盘,可扩展性的要点。指出了大规模Web服务中的核心问题――内存和磁盘的速度差异,同时,这也是考虑可扩展性的重点。

既然要考虑可扩展性,就要考虑是scale out还是scale up,现在普遍采用的是scale out,即横向扩展。扩展需要考虑两个要点――I/O负载和CPU负载,在大规模Web服务中,应用程序主要进行计算,包括接受HTTP请求、查询数据库,将查询结果加工成HTML并发送给客户端等,基本只消耗CPU;相反,数据库服务器需要相对较多的I/O操作。对于应用服务器,采用负载均衡器(load balancer)可以比较容易的实现扩展;但是,对于数据库服务器来说,数据库的可扩展性就相当困难了,大规模环境下产生I/O负载的服务器本来就很难分散,再加上频繁的磁盘I/O,很容易导致服务器变慢,这就是问题的本质。

3. 大规模数据处理基础知识

本书主要讨论了三点

  1. 操作系统的缓存。

  2. 以分布式为前提的RDBMS的使用。

  3. 大规模环境中算法和数据结构的使用。

3.1 操作系统的缓存

究其原因,还是磁盘太慢。内存的速度是磁盘的105-106倍,所以,可以考虑使用内存以减少磁盘磁盘访问。这时候,操作系统很配合的提供了缓存机制,比如Linux的页面缓存机制等,所以,一个有效方法产生了――增加内存以减少访问磁盘,从而降低I/O负载,再说,现在的内存已经白菜价了,加内存已经不是难事(本人实习时所用测试机都是128G内存),但对于经济状况不好的公司,还是要注意下经济成本,呵呵…

但是,即使增加内存也不一定能全部缓存,这时候就要扩展到多台服务器了,但是,单纯增加服务器数量并不能解决问题,这时,就要利用局部性原理了,利用局部性进行分区(Partitioning),实现分布式。

3.2 以分布式为前提的RDBMS的使用――数据库的横向扩展

首先,结合上面所讲,要灵活应用操作系统的缓存,尽量保持数据量小于物理内存,同时,还要主要表结构的设计,当数据量大了以后,每个字段多占一个字节最后产生的数据量也可能上G,这时候可以考虑一些表的分割等,而这部分在数据库课程上可没有学过。

其次,一定要注意索引。在MySQL中,索引不仅改善复杂度,而且,由于索引针对磁盘结构进行优化,能改善磁盘的寻道次数。

最后,是数据库的分布式。MySQL提供了replication功能,使用master/slave架构,slave接受查询请求,master结构更新请求,各slave进行polling,将master写入的内容更新到自身。这种情况下,slave机器可以扩展,但是,master却无法扩展,考虑到web应用程序90%以上都是查询操作,写操作较少的特点,master很少成为瓶颈。但是,偶然也会有应用进行较多的写操作,这时候,就要对表进行分割了,或者不再使用RDBMS。表的分割也会带来一些不良后果,如运维困难,故障率上升等。

3.3 大规模环境中算法和数据结构的使用

前两点主要是运维方面,这点主要是应用程序开发。开发过程中要注意数据结构的选择和算法,如特殊用途的索引、压缩编程等。本书在这里结合Hatena介绍了大量例子,包括Hatena关键字链接技术、文章分类技术和全文搜索技术等,理论结合实际,可以深究。

4. 大规模数据处理的服务器/基础设施

大规模数据处理的服务器/基础设施要注意三个重点

  1. 低成本、高效率;

  2. 重视可扩展性、响应性方面的设计;

  3. 基础设置要重视开发速度,应为服务提供灵活的资源。

4.1 可扩展性

大规模的Web服务无法在一台服务器上运行,所以,各层都需要能灵活扩展。应用服务器可以很容易地扩展,读操作多的分布式可以较容易扩展,写操作多的分布式扩展较难。

在进行扩展时,需要用到一些工具,掌握系统的负载,如平均负载(load average)、内存和CPU相关信息,再根据用途进行调优。

4.2 冗余性

应用程序服务器的冗余性跟可扩展性思路相同,基本就是增加服务器,服务器增加后,即使一两台停机,也能保证充分的处理能力。这里需要负载均衡器实现失败转移(Failover)让故障服务器自动下线、失败恢复(Failback)让恢复正常的服务器再次上线。

对于数据库服务器,同样需要增加树立,master和slave都需要冗余化,master的冗余化比较困难,可以考虑使用Multi-master等方式。

对于存储服务器,主要保存图像等媒体文件等,可以采用一些分布式的文件系统。

4.3 系统稳定性

为了保证系统稳定性,有多个方面需要权衡,如资源利用率、速度等,同时,保持系统的冗余性也有助于系统稳定性。

系统的不稳定性因素有很多,如功能增加、内存泄露、用户访问方式、数据量增加、硬件故障等。为了维护系统稳定,需要维持适当余量,如CPU和内存的使用上限设置为70%;还要消灭不稳定性因素,如降低SQL负载,减少内存泄露和发生异常行为时的自律控制等。

4.4 提高效率

使用虚拟化技术能提高主机的及程度,提高整体资源利用率。引入虚拟化技术可带来良好的扩展性、性价比和高可用性,现在主要的虚拟化技术包括VMWare、Xen、Virtual PC和Parallels等。对于CPU空闲的机器,可添加Web服务器;对I/O空闲的,可添加数据库服务器;对内存空闲的,可添加缓存服务器;同时,要避免资源消耗倾向相同且负载较高的同类服务器在一起组合,有效提高硬件资源利用率。

虚拟化也会带来一些性能损耗,如CPU、内存、I/O,特别是网络性能会下降一半左右。所以,虚拟化技术并不是万能的。

4.5 硬件

由于摩尔定律,处理器性能提升迅速,同时,内存和硬盘成本下降。可以以虚拟化为前提,有效利用廉价硬件。现在,也可以考虑SSD。

4.6 Web服务增长限制

对于web服务的增长并不是无限的,如超过1Gbps(路由器性能来看约30万pps)是PC路由器的极限,超过500台主机会带来子网极限,全球化时代,一个数据中心是不够的。

5. 其它技术

最后,本书简单介绍了构建Web服务所需实践技术,如作业队列系统、存储方式选择、缓存系统以及计算集群等。这部分介绍较简单,只做了解。

6. 写在最后

本书对云计算、大数据处理如Hadoop等介绍较少,而云计算、大数据等在当今大规模Web服务以及其它很多方面应用越来越广,这应该是很重要的一部分,但全书介绍较少,可能是由于本书起源的原因,但还是感觉很遗憾。


Read full article from 读《大规模Web服务开发技术》


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts