本文分类:
读书笔记

本文总结了李智慧的《大型网站技术架构:核心原理与案例分析》一书的主要内容。

演化

大型网站系统特点

大型网站架构演化过程

  1. 初始阶段网站架构:使用一台服务器,应用程序、数据库、文件等所有资源都集中在一台服务器上。
  2. 应用和数据服务分离:随着业务的发展,单台服务器不再适应业务的发展,需要将应用和数据分离,分离后整个网站使用三台服务器:应用服务器、文件服务器与数据库服务器。
  3. 使用缓存改善网站性能:大部分的业务都集中在一小部分数据上,将这部分数据缓存起来可以减少数据库访问压力,提高网站的数据访问速度。
  4. 使用应用服务器集群改善网站并发处理能力:通过负载均衡调度器,将用户访问分发到集群中的某台服务器上,能够降低应用服务器的负载,并实现系统的可伸缩性。
  5. 数据库读写分离:应用服务器在写数据时访问主数据库,主数据库通过主从复制机制将数据同步到从数据库,应用服务器读取数据时通过从数据库读取,改善了数据库的负载压力。
  6. 使用反向代理和CDN加速网站响应:CDN和反向代理的基本原理都是缓存,目的都是尽早返回数据给用户,一方面加快用户访问速度,另一方面也减轻后端服务器的负载压力。
  7. 使用分布式文件系统和分布式数据库系统:当网站规模发展到一定的程度后,需要使用分布式数据库和分布式文件系统。
  8. 使用NoSQL和搜索引擎:对于某些特定的数据存储和检索的需求,可以采用非关系数据库(如NoSQL)和非数据库查询技术(如搜索引擎)。
  9. 业务拆分:通过分而治之的手段将整个网站业务分成不同的产品线,分归不同的业务团队负责,各个应用之间可以通过超链接建立关系,也可以通过消息队列进行数据分发。
  10. 分布式服务:随着业务拆分的粒度越来越小,可以将不同应用系统中都需要执行的公共业务操作(如用户管理、商品管理等)提取出来独立部署,对外提供公共服务。
  11. 云计算:将大型网站架构技术应用到自身业务以外,并将计算能力作为一种基础资源出售,满足中小网站对计算资源的弹性需求。

大型网站的设计误区

网站的价值在于为用户提供价值,大型网站架构技术的核心价值在于能够随网站所需灵活应对,是业务的发展成就了技术的发展。大型网站不是从无到有一步就搭建好的,而是能够伴随小型网站业务的渐进发展慢慢地演化成一个大型网站。当网站还很小的时候,应该专注于为用户提供好的服务来创建价值,而不是一开始就追求网站架构。

网站技术是为了业务而存在,脱离网站的实际情况,一味追随大公司的解决方案,或者一味追求新技术,都是不可取的。企图用技术解决所有问题也是不可取的,技术是用来解决业务问题的,而业务问题,也可以通过业务的手段去解决。实际运营过程中,应该优化业务,综合业务和技术来提高用户体验,最终的目的是更好地为用户提供价值。

模式

模式描述了重复发生的问题及其解决方案的核心,模式的关键在于可重复性。为了解决大型网站面临的一系列问题与挑战,大型互联网公司在实践中提出了许多解决方案,这些解决方案又被更多网站重复使用,从而逐渐形成大型网站架构模式。

拆分

拆分采用分而治之的思想,将一个复杂的软件系统切分成不同的部分。拆分可以从水平和垂直两个维度进行,水平维度的拆分称为分层,垂直维度的拆分称为分隔,对服务层来讲,水平拆分就是将可复用的服务抽取出来独立部署,垂直拆分就是将一个大应用拆分成多个小应用,分层和分割的主要目的是为了能够分布式部署。

冗余

冗余是提高可用性的主要手段,应用服务器可以使用集群和负载均衡,数据库可以通过主从分离实现热备份,还应该定期冷备份。为了抵御地震、海啸等不可抗力导致的网站完全瘫痪,还可以在异地建立灾备数据中心。

缓存

缓存除了可以加快数据访问速度,还可以减轻后端应用和数据存储的压力。使用缓存有两个前提条件,一是存在热点数据,二是数据不会很快过期。缓存是改善软件性能的第一手段,在计算机系统中,缓存无处不在,CPU中有高速缓存,浏览器端有缓存,DNS服务器也有缓存,CDN本质上是缓存,反向代理也可以提供缓存,应用服务器可以有本地缓存,缓存数据量较大时还可以使用分布式缓存。合理使用缓存需注意以下几点:

异步

异步架构是典型的生产者消费者模式,它解耦了生产者与消费者,提高了系统的扩展性。通常使用消息队列实现异步,既能提高网站访问速度,消除并发访问高峰,而且一定程度上能提高系统可用性。

自动化

自动化主要集中在发布运维方面,在开发-测试-发布过程中可以应用自动化版本控制、自动化测试、自动化代码扫描和自动化部署。在生产环境中可以应用自动化监控、自动化报警、自动化失效转移、自动化失效恢复、自动化降级以及自动化分配资源。

安全

互联网的开放性使得网站面临巨大的安全挑战,目前在安全架构方面已经积累了很多模式,网站应该积极应用这些优秀实践。

要素

性能

性能是网站架构设计的一个重要方面,衡量网站性能有一系列指标,重要的有响应时间RT、并发数、吞吐量(每秒事务数TPS、每秒查询数QPS)、系统性能计数器(系统负载、内存、CPU、I/O)等。性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。如果性能测试结果不能满足设计或业务需求,那么就需要寻找系统瓶颈,分而治之,逐步优化。优化性能的手段非常多,从用户浏览器到数据库,影响用户请求的所有环节都可以进行性能优化。

前端性能优化

应用服务器性能优化

存储性能优化

补充说明

  1. 使用多线程要注意线程安全,解决线程安全的主要手段有:使用不可变对象;将对象设计为无状态对象;使用局部对象;并发访问资源时使用锁。
  2. 系统运行时,要尽量减少那些开销很大的系统资源的创建和销毁,从编程角度,资源复用主要有两种模式:单例(Singleton)和对象池(Object Pool)。

可用性

可用性(Availability),指系统能够有效访问的特性。网站可用性通常用年度可用性来度量。实现网站高可用架构的主要手段是:数据和服务的冗余备份以及失效转移。系统的高可用不仅要考虑硬件故障引起的宕机,也好考虑系统升级发布引起的宕机。

应用层的高可用

将应用服务器的状态分类,分为无状态的应用服务器和有状态的Session服务器,通过负载均衡进行无状态服务的失效转移。

服务层的高可用

除了通过负载均衡进行无状态服务的失效转移,其他手段还有分级管理、超时设置、异步调用、服务降级,以及服务幂等性设计。

数据层的高可用

数据是网站最宝贵的物质资产,高可用的数据有如下几层含义:(1)数据持久性,保证数据在任何情况下都不丢失;(2)数据可访问性,部分数据故障后,切换到备份数据;(3)数据一致性,数据在多个副本中是否一致。保证数据高可用的主要手段有数据备份和失效转移,数据备份有冷备份和热备份两种。

缓存的高可用

整个系统共享一个分布式缓存集群,单独的应用和产品不再部署自己的缓存服务器,只需要向共享缓存集群申请资源即可。

软件质量保证

网站运行监控

监控的第一步是数据采集,需要采集的监控数据有:

采集到的监控数据,除了用于性能评估、集群伸缩性预测等,还可以根据实时运行情况进行风险提示。

Session管理

伸缩性

伸缩性(Scalability),指系统能够通过增加(或减少)自身资源规模的方式增强(或减少)自己计算事务的能力,即不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力。衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添加新的服务器,加入新的服务器后是否可以提供和原来的服务器无差别的服务,集群中可容纳的总的服务器数量是否有限制。

网站的伸缩性架构首先根据功能进行物理分离,然后将单一的功能集群部署。前者表现为不同的服务器部署不同的服务,提供不同的功能。后者表现为集群内的多台服务器部署为相同的服务,提现相同的功能。单一功能的集群伸缩性又有如下三种:

应用服务器集群的伸缩性

将应用服务器设计成无状态的,然后使用负载均衡开实现伸缩性,同时也能提高网站的可用性。

缓存服务器集群的伸缩性

缓存集群伸缩性设计的主要目标是让新上线的缓存服务器对整个分布式缓存集群影响最小,通常使用一致性Hash算法。

存储服务器集群的伸缩性

存储服务器必须保证数据的可靠存储,任何情况下都必须保证数据的可用性和正确性。关系数据库集群的伸缩性有数据复制、数据分库和数据分片,关系数据库集群虽然支持数据复制、主从热备等机制,但是很难做到大规模集群的可伸缩性,关系数据库集群的伸缩性方案必须在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群。NoSQL通过放弃关系数据库的两大重要基础:以关系代数为基础的结构化查询语言(SQL)和事务的一致性保证(ACID)来强化高可用性和伸缩性,NoSQL集群先天就是为海量数据而生,因此其对伸缩性的支持通常都非常好。

负载均衡

负载均衡技术:

负载均衡算法:

扩展性

扩展性(Extensibiltiy)指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。快速响应需求变化是网站可扩展架构的主要的目的。衡量网站架构扩展性的主要标准就是在网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。

模块化

可扩展架构的核心思想是模块化,并在此基础之上降低模块间的耦合。软件架构师最大的价值在于具有将一个大系统切分成N个低耦合的子模块的能力,这些子模块包含横向的业务模块和纵向的基础技术模块。这种能力一部分源自专业的技术和经验,还有一部分源自架构师对业务场景的理解、对人性的把握、甚至对世界的认知。

分隔和分层是模块化设计的主要手段,模块通过分布式部署的方式,独立的模块部署在独立的服务器(集群)上,从物理上分离模块之间的耦合关系,进一步降低耦合性从而提高复用性。模块分布式部署以后,具体的聚合方式有分布式消息队列和分布式服务两种。

消息队列不仅能够降低模块间的耦合,而且能够实现对并发访问量的削峰填谷。分布式服务框架通过拆分独立的服务和应用,从接口层面降低系统耦合性,分布式服务框架能够提供的特性有服务注册和发现、负载均衡、失效转移、高效的远程通信、整合异构系统、对应用最小侵入、服务版本管理和实时监控。

可扩展的数据结构

指使用NoSQL来实现数据结构的扩展。

利用开放平台建设网站生态圈

大型网站把内部的服务封装成一些调用接口开放出去,供外部的第三方开发者使用,第三方开发者利用这些开放的接口开发应用程序(APP)或者网站,为更多的用户提供价值,网站、用户、第三方开发者相互依赖,形成一个网站的生态圈,既为用户提供更多的价值,也提高了网站和第三方开发者的竞争能力和盈利能力。提供开放接口的平台称为开放平台,其架构包含如下几个方面:

安全性

网站的安全架构就是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。衡量网站安全架构的标准就是针对现存和潜在的各种攻击与窃密手段是否有可靠的应对策略。绝对的安全是不存在的,要通过提高攻击门槛来提高网站的相对安全性。

常见网站攻击与防御

其他防御措施

  1. 配置错误跳转页面,并且任何页面不要打印异常信息,避免黑客恶意窥探系统信息;
  2. 发布前去除Html注释;
  3. 上传的文件类型设置白名单,避免上传可执行程序;
  4. 使用Web应用防火墙;
  5. 对网站进行安全漏洞扫描;
  6. 通过密码和手机校验码进行身份认证;
  7. 登录、交易等操作需要对网络通信进行加密;
  8. 对网站服务器上存储的敏感数据如用户信息等进行加密处理;
  9. 为防止机器人程序滥用网络资源攻击网站,网站使用验证码进行识别;
  10. 对于常见的用于攻击网站的XSS攻击、SQL注入、进行编码转换等相应处理;
  11. 对于垃圾信息、敏感信息进行过滤;
  12. 对交易转账等重要操作根据交易模式和交易信息进行风险控制。

信息加密及密钥管理

信息加密要点:

信息加密的前提是保证密钥安全,改善密钥安全性的措施:

信息过滤与反垃圾

常用的信息过滤和反垃圾手段有:

风控

机器自动风控和人工审核结合,机器自动风控的主要手段有规则引擎和统计模型两种。规则引擎通过判断某些指标是否满足一定的条件来识别风险,实现简单,但需要不断调整规则和修改代码,规则较多时容易出现冲突,规则越多越难维护,性能也越差。统计模型基于机器学习和数据挖掘分类算法,经过充分训练的统计模型,实时性更好,并具有一定的预测性。

案例

淘宝网的架构演化案例分析

业务推动技术的发展

维基百科的高性能架构设计

几个容易忽略的缓存使用策略:

海量分布式存储系统Doris的

在系统架构层面,其高可用手段主要是服务器热备,数据多份存储。正常情况下,写入数据需要同时向两台服务器写入,读取则可以从任意一台服务器读取。对于一个分布式存储系统,可能出现的故障分为以下三类:

网购秒杀系统架构设计案例分析

秒杀不是正常的业务流程,只是网站营销的一个附加活动,这个活动时间短,并发访问量大,且带来突增的网络及服务器带宽需求。设计要点如下:

几个问题:

大型网站典型故障案例分析

大型网站的架构师最有价值的地方不在于他掌握了多少技术,而在于他经历的多少故障。以下是一些经验:

架构师

架构师是软件企业的重要角色,称职的架构师是公司的宝贵财富。对于公司,架构师引领公司的技术方向,架构师的眼界和高度决定了公司的技术方向;对于技术团队,架构师的决策和技术方案影响开发工程师的开发模式和开发量。对于工程师,架构师作为项目组最资深的专业技术人员,工程师能够从架构师身上看到自己的未来。

架构师领导艺术

架构师领导艺术的核心是关注人而不是产品。寻找一个值得共同奋斗的目标,发掘每个人的优秀潜能,营造一个所有人都能最大限度发挥自我价值的工作氛围。

发掘人的优秀

发掘人的优秀比发掘优秀的人更有意义。是事情成就了人,而不是人成就了事,指望优秀的人来帮自己成事,不如做成一件事让自己和参与的人都变得优秀。

共享美好的蓝图

蓝图是团队共同奋斗的目标。架构师要和项目组全体成员共同描绘一个蓝图,并保持对目标蓝图的关注,对任何偏离蓝图的设计和决定保持警惕。

共同参与架构

让项目参与者对架构充分争论,大家越是觉得自己是项目架构的重要贡献者,就越愿意承担责任,越愿意共同维护架构和改善软件。

学会妥协

对于不同的意见,应坦率分享自己的设计思路,让别人理解自己的想法并努力理解别人的想法,求同存异。

成就他人

做成一个项目不但要给客户创造价值,为公司盈利,还要让项目成员的知识技能和业务水平都能获得成长。

谈谈蓝图

  1. 蓝图应该是整个团队能够认同的,必要的变更要经过大家讨论,并且需要重新获得大家的认同;
  2. 蓝图应该是能够表述清楚的:产品要做什么,不做什么,要达到什么业务目标,都需要描述清楚;
  3. 蓝图应该是形象的:产品能为用户创造什么价值,能实现什么样的市场目标,产品最终会长什么样,都需要形象的想象出来;
  4. 蓝图应该是简单的:不管是内部还是外部沟通,都能一句话说明白:我们在做什么;
  5. 蓝图应该是可见的:蓝图应写在软架构设计文档的首页,写在邮件的签名档,写在内部即时通讯群的公告上。

架构师职场攻略

发现问题,寻求突破

问题 = 体验 - 期望,当体验不能满足期望时就会觉得出了问题。消除问题要么改善体验,要么降低期望。降低期望只是回避问题,直面期望和体验间的差距才能发现问题,才会找到突破口。

提出问题,寻求支持

要想寻求支持,就必须让问题的拥有者知道问题的所在。问题的拥有者就是出了问题后那个需要负责的人。

解决问题,达成绩效

在解决我的问题之前,先解决你的问题,解决你的问题的同时,顺带解决我的问题。

职场小技巧

  1. 新员工最需要做的是融入团队,而不是证明自己;
  2. 把“我的问题”表述成“我们的问题”;
  3. 给上司提封闭式问题,目的是寻求支持(如:A和B那个方案好),给下属提开放性问题,目的是启发他思考(如:你觉得该怎么办);
  4. 提出问题而不批评人;
  5. 用赞同的方式提出问题;
  6. 对不靠谱的方案适当逃避,比如“这个idea非常好,改天我们开个会…”,可能在一段时间以后提出的人自己就意识到方案不可行。
本文来自 [时光记 - 王智超的个人空间](www.hiwzc.com),转载请注明出处。