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

July 31, 2013
作者:星爷
出处:http://lxWei.github.io/posts/e8-af-bb-e3-80-8a-e5-a4-a7-e8-a7-84-e6-a8-a1web-e6-9c-8d-e5-8a-a1-e5-bc-80-e5-8f-91-e6-8a-80-e6-9c-af-e3-80-8b.html
声明:转载请注明作者及出处。

问:大规模web服务环境中,由于I/O负载问题,服务器变得很慢,怎么办? 答:加服务器!!!

如果你的答案跟上边一样,那么,极度推荐你读读这本书。

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服务以及其它很多方面应用越来越广,这应该是很重要的一部分,但全书介绍较少,可能是由于本书起源的原因,但还是感觉很遗憾。