《大型分布式网站架构设计与实践》试读随笔

大型分布式网站架构中,涉及到众多的技术与知识要点,虽然才疏学浅,但也来谈谈我对它的认识:

(一)当我们在讨论大型分布式网站前,我们首先应该对什么是大型分布式网站有一定明确的认识或者说定义。相较传统网站而言,大型分布式网站有其自身特点及架构关注项:

(1)数据量大:需要存储或是处理的数据量大,需要有大量的服务器提供服务;

(2)访问量大:拥有大流量的访问,用户并发访问高,在很小的单位时间内有很高的客户访问数;

(3)可用性高:要达到持续不间断地服务,不会因为宕机而造成用户使用受阻;

(4)安全性高:对网站的各种资料、信息要有很高的防范措施,不能因安全漏洞或是操作失当造成重要数据的泄露或丢失;

(5)灵敏度高:展现出良好的性能与反应速度,并且及时变更需求,满足客户所需;

(6)扩展性好:新上线的产品与原有的产品是一种弱藕合关系,有新的产品上线时,不需要改动或是仅仅是少量的改动就可以实现;

(7)伸缩性强:当数据量变大或是服务增多时,可以快速在原有的集群中添加新的服务器。

(二)对大型分布式网站有一个概要性认识后,如果直接谈论大型分布式网站的架构,会让人有一种空中楼阁的感觉。了解一下大型分布式网站是如何演化的,在演化过程中出现哪些问题,应用哪些技术解决,这样一步一步走来,可能会更让人觉得踏实:

(1)建站之初,所有的应用程序、数据库以及其它相关的文档都架设在一台服务器上,这样的架设完全可以满足初期的要求;

(2)随着业务的扩展,访问量变大,单台服务器的负载持续增大,数据存储空间显得越来越不足。最好的解决方案就是适时地对应用与数据进行分离。分离之后,应用服务器、数据库服务器、文档服务器之间相对独立,从原来的一台服务器变成多台服务器;

(3)为了改善网站性能,对一些数据进行缓存,进一步提高网站的整体访问速度;

(4)单一应用服务器已经很难再满足新的访问需求,这时应用服务器集群方案闪亮登场,同时通过负载均衡服务器来完成服务器集群的调度与分发,再一次完美解决网站瓶颈;

(5)为了解决网站访问延迟的问题,使用CDN与反向代理,再次利用缓存方式解决访问瓶颈;

(6)大部分数据读多写少,为了缓解数据库的压力,用数据库读写分离的方案来解决;

(7)读写分离后,仍然无法解决数据访问的问题,利用垂直拆分与水平拆分的方案来处理;

(8)虽然经过上述步骤,性能有所改进,但是业务需求的增长,原有的数据访问方式又满足不了现状,此时需要将数据库服务器与文档服务器也进行集群;

(9)业务复杂度越来越高,单纯的关系型数据库已经不能承担全部的数据存储的要求,NoSQL向我们走来;

(10)异构数据源的使用,加大了数据检索的难度,检索搜索引擎技术得到应用;

(11)伴随网站的不断深化与发展,CDN服务器、反向代理服务器、NoSQL服务器、消息队列服务器等等都慢慢发展与集群;

(12)在整个网站的发展过程中,日志系统、自动化运维系统、监控系统、离线计算系统与实时计算系统也在逐步建成与完善。

(三)讲述完大型分布式网站的演化,我们对于在演化进程中应用到的各种缓存技术做一下梳理:

(1)前端缓存;

(2)页面缓存;

(3)页面静态化;

(4)页面局部缓存;

(5)反向代理服务器缓存。

本书试读章节中介绍了memcached前端缓存,而且讲述此知识点时,作者不是仅仅罗列memcached的用法,还专门提到了“一致性Hash算法”,让读者深入了解原理,这是书中的一个亮点。

(四)我们对分布式集群下的Session的处理也进行一下梳理:

(1)SessionSticky模式:负载均衡器每次转发请发都会指向同一台服务器上;

(2)SessionReplication模式:后端的服务器集群会对Session进行同步处理,所以对负载均衡器的要求降低;

(3)SessionManager模式:对Session进行集中的存储;

(4)CookieBased模式:顾名思义,这种模式是通过Cookie技术来传递Session。

本书试读章节中,作者提到memcached-session-manager工具,它实现基于memcached的分布式session,同时支持Sticky模式与Non-Sticky模式。

(五)下面我们再来看看大型分布式网站数据持久化方面的内容:

(1)传统关系型数据库:Mysql、Oracle、SqlServer等等都是大家耳熟能详的数据库,本书试读章节对Mysql作了专门介绍。谈起Mysql我们基本上都会谈到几点:垂直拆分(当系统扩展到一定程度时,单个库已经无法承受负载,我们可以通过对功能模块的分解来分散压力,完成垂直拆分)、水平拆分(简要言之就是通过一定的规则对表记录进行水平拆分)、同步机制(主从同步、双主互备)。不过书中好像没有谈起异构数据源的之间数据处理的一些问题,对此给我的感觉是:白璧微瑕。

(2)近年来流行的NoSQL:NoSQL这些年势头强劲,各种NoSQL如雨后春笋般出现在人们的眼前,比如:文档数据库Mongodb、列数据库Hbase、图数据库neo4j、键数据库Redis。作为传统关系型数据库的重要补充,它们在各自的舞台上发挥着重要的作用。

(六)消息系统对于减少系统藕合,提升系统效率,缓解集群压力有良好表现,本书试读章节提及ActiveMQ&JMS:

(1)JMS:全称是JavaMessageService,即Java消息服务。它支持两种消息发送与接收模型:其一,P2P模型,全称Point-to-Point,即点对点模型;其二,Pub/Sub模型,全称Publish/Subscribe,即发布订阅模型。两者的差别,前者是一对一,后者是一对多。

(2)ActiveMQ。它也有两种架构模式:其一,基于共享文件系统的Master-Slave架构;其二,基于共享数据库的Master-Slave架构。

(七)关于垂直化搜索引擎,与互联网搜索引擎不同,主要针对企业内部自有数据进行检索,本书通过Lucene来讲解:

(1)倒排索引:也称反向索引,它将文档中的词作为关键字,建立词与文档的映射关系,通过对倒排索引的检索,可以根据词快速获取包含这个词的文档列表,这对于搜索引擎来说至关重要;

(2)分词:又称切词,就是将句子或者段落进行切割,从中提取出包含固定语义的词,对此中文分词是一个难点;

(3)停止词:使用频率很高的词,如果这些词都被建到索引中进行索引的话,搜索引擎就没有任何意义了,因此停止词需要被忽略掉;

(4)排序:搜索时可能会命中许多文档,需要将相关度更大的内容排在前面,以便用户能够更快地筛选出有价值的内容;

(5)文档:文档是一系列域(Field)的组合,而文档的域则代表一系列与文档相关的内容;

(6)域:索引的每个文档中都包含一个或者多个不同名称的域,相当于数据库表中字段的概念;

(7)词:是搜索的基本单元;

(8)查询:短语查询(PhraseQuery)、前缀查询(PrefixQuery)、范围查询(包括TermRangeQuery、NumericRangeQuery等);

(9)分词器:文档在被索引之前,需要经过分词器处理,以提取关键的语义单元,建立索引,并剔除无用的信息,如停止词等,以提高查询的准确性。常用的中文分词器包括一元分词、二元分词、词库分词等。

这部分内容写得非常细致,而且配以图示,就算是新手相信也会快速了解。

还有好多关于大型网站架构的内容可以谈,不过还是到此为止吧。上面行文过程中有谈到了一些书中的内容,当完成试读章节的试读后,给我的一个感觉是:作者是非常有经验的一线工作者,书中的内容有理论有实践,图文并茂,非常赞!而且写书过程中充分考虑到不同读者的水平参差不齐,为了既让高手从中获益,又让经验不多的编码人员快速上手,作者非常用心地撰写了本书。非常期待得到此书并认真拜读!