本书主要介绍了大型分布式网站架构所涉及的一些技术细节,包括SOA架构的实现、互联网安全架构、构建分布式网站所依赖的基础设施、系统稳定性保障和海量数据分析等内容;深入地讲述了大型分布式网站架构设计的核心原理,并通过一些架构设计的典型案例,帮助读者了解大型分布式网站设计的一些常见场景及遇到的问题。
序
大型分布式网站技术全貌
2008年,淘宝网随着访问量/数据量的巨增,以及开发人员的增长,原有的架构体系已经无法支撑,于是在那一年淘宝网将系统改造为了一个大型分布式的网站。作者目前就职于阿里集团,清晰地看到了目前淘宝这个大型分布式网站的架构体系,这个架构体系其实是非常多方面的技术的融合,要掌握好最重要的首先是看清全貌,但这也是最难的。本书向大家展示了一个大型分布式网站需要的技术的全貌。
翻看各大型网站的架构演变过程,会发现其中有一个显著的共同点是在某个阶段网站的架构体系改造为服务化的体系,也就是常说的SOA,SOA系统之间以服务的方式来进行交互,这样就保证了交互的标准性,对于一个庞大的多人开发的网站而言这至关重要,所以在实现SOA时重要的第一点是实现基本的服务方式的请求/响应,除了这点外,对于访问量巨大的网站而言,主要都是采用可水平伸缩的集群方式来支撑巨大的访问量,这会涉及在服务交互时需要做负载均衡的处理,较为简单的一种方式是采用硬件负载均衡设备,这种方式一方面会增加不少成本,另一方面会导致单点的巨大风险,因此目前各大网站多数采用软件负载的方式来实现服务的交互,如何去实现SOA是大型分布式网站的必备基础技能。
基于服务化主要是为了解决网站多元化、开发人员增加及访问量增加带来的水平伸缩问题,但数据量增长会带来更多复杂的问题,大型网站都是严重依赖缓存来提升性能的,数据量增长带来的效应就是单机会无法缓存所有的数据,需要引入分布式的缓存;数据量增长对于持久型的存储而言就更为复杂,通常会需要采用分库分表、引入NoSQL等方式来解决,对于带来的模糊查询等需求就更加复杂了,而现在的大型网站多数都有很多用户产生的数据,这也就导致了随着访问量的增长,多数情况下用户产生的数据量也会暴涨,因此数据量增长带来的这些问题也是必须学会如何去解决的。
近几年以来网站的安全形势越来越严峻,这里有一个关键的原因是多数开发在安全方面了解的知识比较少,导致开发的系统在安全上会非常欠缺考虑,但其实对于一个网站而言,安全是基本,尤其是电子商务类网站,一旦出现安全问题,很容易丧失难得建立起来的信任,因此在开发一个大型网站的时候安全的意识非常重要。
网站的稳定性是衡量一个网站的重要指标,对于一个大型网站而言,网站一两个小时不可用会引起严重的公众事件,如何去保障一个庞大的网站的稳定性,涉及不少技术知识。要保障网站的稳定性,首先最重要的是监控,要清楚地知道网站目前的运行状况、有问题的点的状况等,没有监控的网站就像是一辆没有油表的车;监控主要是帮助发现问题,在出现问题后最重要的不是去找到bug并修复,而是如何有效快速地恢复,例如最典型的有效手段是优雅降级(也就是James Hamilton那篇著名的《On Designing and Deploying Internet-Scale Services》中的Gracefully Degrade);在快速恢复了后,则需要定位出造成问题的根本原因,这需要很多经验、扎实的基本功和对各类排查工具的掌握。
对于一个大型网站而言,最宝贵的部分通常是积累下来的数据,怎样用上这些数据来提升帮助业务,除了对商业玩法的掌握外,技术上的难度也非常高,大数据技术也是近几年的热门话题,离线计算、实时流式计算等,都是现在的火热话题,涉及的技术点也非常多,对于一个大型网站的技术掌控者而言,这也是需要了解的知识点。
对于一个大型网站的架构师而言,最重要的是掌控一个网站的技术发展过程,很好地去控制每个阶段需要做什么,并确保每个阶段需要的技术布局是完善的,避免有空白点,相信本书涵盖的方方面面的知识点会给读者提供有效的帮助。
林昊(http://hellojava.info)
阿里巴巴集团资深技术专家
写于阿里巴巴西溪园区
2014年8月
前 言
在大型网站架构的演变过程中,集中式的架构设计出于对系统的可扩展性、可维护性以及成本等多方面因素的考虑,逐渐被放弃,转而采用分布式的架构设计。分布式架构的核心思想是采用大量廉价的PC Server,构建一个低成本、高可用、高可扩展、高吞吐的集群系统,以支撑海量的用户访问和数据存储,理论上具备无限的扩展能力。分布式系统的设计,是一门复杂的学问,它涉及到通信协议、远程调用,服务治理,系统安全、存储、搜索、监控、稳定性保障、性能优化、数据分析、数据挖掘等各个领域,对任何一个领域的深入挖掘,都能够编写一本篇幅不亚于本书的专门书籍。本书结合作者在阿里巴巴及淘宝网的实际工作经历,重点介绍大型分布式系统的架构设计,同时,为避免过度专注于理论而使得内容显得空洞,作者穿插介绍了很多实践的案例,尽量让每一个关键的技术点都落到实处,相信能够帮助读者更好地理解本书的内容。
内容大纲
全书共5章,章与章之间几乎是相互独立的,没有必然的前后依赖关系,因此,读者可以从任何一个感兴趣的专题开始阅读,但是,每一章的各个小节之间的内容是相互关联的,因此,最好按照原文的先后顺序阅读。
第1章主要介绍企业内部SOA(Service Oriented Architecture,即面向服务的体系结构)架构的实现,包括HTTP协议的工作原理,基于TCP协议和基于HTTP协议的RPC实现,如何实现服务的路由和负载均衡,HTTP服务网关的架构。
第2章主要介绍如何保障互联网通信的安全性,包括一些常见攻击手段的介绍;常见的安全算法,如数字摘要、对称加密、非对称加密、数字签名、数字证书的原理和使用;常用通信认证方式,包括摘要认证、签名认证,以及基于HTTPS协议的安全通信;另外还介绍了通过OAuth协议的授权过程。
第3章介绍一些分布式系统所依赖的基础设施,包括分布式缓存,持久化存储。持久化存储又涵盖了传统的关系型数据库MySQL,以及近年来开始流行NOSQL数据库如HBase、Redis,消息系统及垂直化搜索引擎等。
第4章介绍如何保障系统运行的稳定性,包括在线日志分析、集群监控、流量控制、性能优化,以及常用的Java应用故障排查工具和典型案例。
第5章介绍如何对海量数据进行分析,包括数据的采集、离线数据分析、流式数据分析、不同数据源间的数据同步和数据报表等。
本书并不假设读者在Java领域有很深的技术水平,但是,结合作者本人的工作经验和使用习惯,书中的大部分案例代码均采用Java来编写,并且运行在Linux环境之上,因此,读者最好对Java环境下的编程有一定的了解,并且熟悉Linux环境下的基本操作,以便能够更加顺利地阅读本书。
致谢
首先,要感谢我的家人,特别是我的妻子,在我占用大量周末、休假的时间进行写作的时候,能够给予极大的宽容、支持和理解,并对我悉心照顾且承担起了全部的家务,让我能够全身心地投入到写作之中,而无须操心一些家庭琐事,没有你的支持和鼓励,这本书是无法完成的。
同时,要感谢阿里巴巴及淘宝网,给我提供了合适的环境和平台,使自己的技能能够得以施展,并且,身处在一群业界的技术大牛中间,也得到了很多学习和成长的机会。,另外,还要感谢我的主管飞悦对于写作开明的态度,以及一直以来的鼓励与支持,并在日常的工作中给予我的很多帮助。
最后,还要感谢博文视点的编辑们,本书能够这么快出版,离不开他们的敬业精神和一丝不苟的工作态度。
感悟
一年多以前,在接到编辑约稿即将开始动笔之前,自己曾信心满满地认为,应该能够比较顺利地完成这本书,因为写的内容自己都比较熟悉,而且平时工作当中也有一些笔记积累,不是从零开始的。但当真正开始写了以后才知道,理解领悟和用文字表达出来完全是两个层面的事情,日常工作中一些很普遍很常见的设计思路,可能是由一次次失败和挫折得到的经验教训演变而来。很多时候我们只知道how,而忽略了what和why,要解释清楚what、why、how,甚至是why not,并没有想象中的那么容易。当然,通过写作的过程,自己也将这些知识点从头到尾梳理了一遍,对这些知识的认识和理解也更加深入和全面。每次重新回过头来审阅书稿时,都会觉得某些知识点讲述得还不够透彻,需要进行补充,抑或是感觉对某些知识点的叙述不够清晰和有条理,还能够有更好的表述方式。但是,书不能一直写下去,在本书完稿之时,自己并没有想象中那样的兴奋或者放松,写作时的那种“战战兢兢,如履薄冰”的感觉,依然萦绕在心头,每一次落笔,都担心会不会因为自己的疏忽或者理解上的偏差,从而误导读者。由于时间的因素和写作水平的限制,书中难免会有错误和疏漏之处,恳请读者批评和指正。如有任何问题或者是建议,也可以通过如下方式与作者联系:
博客:chenkangxian.iteye.com
微博:http://weibo.com/u/2322720070
陈康贤
2014年5月于杭州
分布式这个题材最近越来越火爆,相关的微服务,大数据的技术也是层出不穷,本书中最大的收获是了解了这个领域需要考虑那些问题和常见解决方法,而不是具体怎么解决问题。
这本书最大的优势应该是将大型分布式网站架构所需的全部技术都讲到了,对于架构师来说,首先就应该有这种全局意识。另外淘宝可以说是世界上最大的分布式网站,作者对这个架构体系有全面清晰的认识,并且亲自参与了其中的工作,所以书的内容很实战,也包括一些技术细节和自己的经验,实属难得。
微服务这几年很火,它的实现方式是不是也是分布式的一种或者是衍生品?