发展历程
网站的发展和生物一样,都会经历不同的阶段,通过不断的成长而塑造成一个成熟的个体。也就是说大型网站不是生来就有的,也是跟随着公司业务的发展,不断推进的。毕竟网站是公司业务的载体,而不是主体,这和纯技术公司有很大的不同。李老师说的好,"是业务成就了技术,是事业成就了人"。在实际的设计中,一定谨记沟通的重要性,不能为了技术而技术,有时候合理的沟通,通过业务流程合理的改变可以解决很多技术无法解决的问题,比如12306网站通过分时段销售,排队等策略很好的解决了春运购票高峰的问题。接下来,以时间为序简单介绍一下大型网站野蛮生长的发展历程。
- 初始阶段:比如常见lamp,再Linux环境中,使用php构建网站,mysql数据库,部署在apache上。
- 应用服务和数据服务分离:随着业务的发展,越来越多的uv导致性能下降,越来越多的数据导致存储空间不足,因此需要将系统分为3个部分,分别是数据库服务器(内存和硬盘空间大),应用服务器(更强大CPU),文件服务器(图片等静态资源,更大的硬盘容量)。
- 使用缓存改善性能:网站访问也遵循”28定律“,比如网上购物,大家都会集中浏览成交数高、评价良好的少数商品。既然业务访问集中在小部分数据上,就可以将这部分数据缓存起来,减少数据库的压力,提高网站性能。以物理上来划分,缓存可以分为本地缓存和缓存在分布式缓存服务器上的远程缓存,前者高效但空间小,后者容量理论上可以无限扩展。
- 使用应用服务器集群改善网站并发能力:在使用缓存后,数据访问压力减小,但单一应用服务器能处理的并发请求仍然有限,因此需要构建应用服务器集群,通过负载均衡服务器来分发请求。
- 数据库的读写分离:虽然之前增加了缓存,但部分的读操作(未命中)和全部的写操作还是要访问数据库,当规模进一步增加时,数据库依然会成为瓶颈,因此可以通过数据库主从热备的方式来实现数据库的读写分离,通过主数据进行写操作,从数据库进行读操作。
- 使用反向代理和CDN加速网站响应:随着业务版图的进一步扩展,用户分布越来越广泛,不同地区访问网站时速度差别会很大。而访问延迟和用户流失率正相关,因此需要通过CDN和反向代理等手段,为用户提供更好的服务。两者的基础都是缓存,CDN部署在网络提供商的机房,当用户访问时可以从距离最近的机房获取数据,反向代理部署在网站中心机房,访问首先由反向代理服务器处理,如果缓存中有客户所需数据,直接返回即可。
- 使用分布式文件系统和分布式数据库系统:分布式数据库时网站数据库拆分的最后手段,只有在单表数据规模特别大时才使用,通常应该采用业务分库,既简单也合理。分布式文件系统比较常见,比如Hadoop的基础HDFS。
- 使用NoSQL和搜索引擎:NoSql和搜索引擎技术具有可伸缩的分布式特性,应用服务器可以通过统一的数据访问磨矿访问各种数据,减轻应用程序管理数据源的麻烦。
- 业务拆分:对于大型网站,分而治之是最棒的手段,比如电商网站,可以将商铺、订单、买家、卖家、支付等拆分为不同的产品线,归属不同业务团队。每个应用独立部署维护(docker),应用间通过链接建立关系,相互间可以通过消息队列进行通信,以构建完整系统。
- 分布式服务:到了这个阶段,就需要搭建企业内部的SOA体系,不同的业务线提供不同的服务,共同组建闭环系统,最后附上一张比较完整的架构图。
大型网站的特点
- 高并发,大流量:2016百度主页的日均PV达到31.2亿次,独立IP达到3.9亿个;淘宝2016年双11的成交额为1027亿元;截止2016,QQ最大的同时在线用户数达到2.59亿人。
- 高可用:系统7*24不间断服务,大型网站宕机或被黑客攻击均会成为热点新闻,并往往会给公司和用户带来较大损失。
- 海量数据:比如百度收录数百亿网站,Facebook每周上传数十亿照片,而各大网站的用户埋点数据每月都以PB级增长,而大数据也成了当下最热门的职业方向。
- 用户分布广泛,网络情况复杂:大型互联网公司都是为全球服务的,不同国家网络运行商之间互通困难,因此需要建立分布式的数据中心。
- 安全环境恶劣:互联网安全可以说是互联网面临的最大问题,基于其的各类违法犯罪行为带来的影响非常巨大,比如移动支付的安全,紧密关联人们的生活。
- 需求快速变更,发布频繁:这部分可以说对程序员的影响最大,比如创业公司,其移动端App至少每周一个小版本,一月一个大版本,迭代的非常快,程序员也就需要经常加班,非常辛苦了。此外,过去很多外包公司的运作节奏已无法满足当前环境,大量企业都开始注重自身的技术团队了。
- 渐进式发展:这点的理解是关键,不然很容易走近误区,在技术上盲目跟随大公司,使用高成本解决方案。这部分和个人找对象一样,适合的才是最好的,阿里巴巴也是从马云的客厅中慢慢做起来的,初期的网站可能你都会觉得简陋。
Tip: 当前的云服务已经发展的比较成熟,在公司发展的前中期,完全可以基于云平台来搭建网站,基于业务足够的支撑。所谓云服务最初就是将大型网站在非高峰时的闲置资源整合起来,作为商品卖给用户。
架构模式
为了达到高性能、高可用、易伸缩、可扩展、安全等技术架构目标,不同网站对此进行了各自的实践,通过不断归纳总结,得到了可重复使用的网站架构模式。
- 分层:这是最基本的架构模式,从横向维度切分系统,最常见的三层为应用层、服务层和数据层。
- 分割:从纵向维度分割系统,比如大型游戏网站,可以分割为首页、论坛、搜索、广告等不同模块。
- 分布式:之前的分层和分割的主要目的是为了切分后模块可以分布式部署,通过接口调用协同工作,可以很好的解决高并发的问题,但也会带来一些问题,比如网络对性能造成影响,大量服务器的维护管理、难以保证数据一致性和事务控制。常见的分布式方案包括分布式应用和服务、分布式静态资源、分布式数据和存储、分布式计算、分布式配置&锁&文件系统等。
- 集群:分布式解决了模块分解的问题,但对于用户集中访问的模块,还需要将独立部署的服务器集群化,通过负载均衡设备共同对外服务。
- 缓存:常见的缓存方案包括CDN、反向代理、本地缓存、分布式缓存等。其使用前提是数据访问热点不均衡;数据在某个时间段内有效,不会很快过期。
- 异步:软件发展的一个重要目标就是降低耦合性,除了之前提到的分层、分割和分布外,异步也是重要手段,其通过将业务操作分为多个阶段,每个阶段间通过数据共享的方式异步执行。其具体实现方式包括读写数据库,使用消息队列或缓存服务器等方式。最终达到提高系统可用性、加快响应速度和消除并发访问高峰的目的。
- 冗余:网站需要7*24不间断运行,但服务器随时可能会故障,因此需要通过冗余实现高可用,最简单的通过2个服务器的集群来支持高可用。数据库除了定期备份实现冷备份外,还需要为支持业务的高可用而对数据库进行主从分离,实时同步实现热备份。
- 自动化:当下网站的自动化架构主要集中在发布运维方面,发布日可以说是每个程序员最紧张的日子,会出现各种各样的问题,而发布工程自动化可以有效减少故障。该过程包括自动化代码管理、自动化测试、自动化安全监测(静态安全扫描)、自动化部署,其中自动化部署是实践的最彻底的。此外还需要对网站进行自动化监控,比如点评比较有名的cat系统,自动化报警,自动化失效转移&恢复,自动化降级(拒绝部分请求将系统负载降至安全水平),自动化分配资源等。
- 安全:互联网的开发特性决定了其将一直面临巨大的安全挑战,网站在安全方面也积累了很多模式,比如通过密码和手机校验码进行身份认证;登录、交易等关键操作需要对通信进行加密(Https);用户敏感数据的加密处理;为防止机器人程序使用DDos攻击而使用验证码识别;对于常见XSS攻击、SQL注入,进行编码处理;对于垃圾信息、敏感信息进行过滤;对于交易转账等重要操作根据交易模式和信息进行风险控制。
架构要素
通常来说,网站系统设计最重要的几个特性包括性能、可用性、伸缩性、扩展性和安全性等5大属性。
- 性能:在实际工作中,经常会遇到性能问题,需要针对不同情形做出正确的选择。对于Browser端,可以通过缓存、页面压缩、合理布局页面,使用CDN,反向代理缓存热点文件等方式进行优化。对于Server端,可以使用本地或分布式缓存来减小数据库压力,通过异步操作来缓解高峰时的压力,并可以通过集群的方式提高整体性能。
- 可用性:一般大型知名网站的可用性均可以达到4个9,即可用性超过99.99%,实现高可用的主要手段就是冗余,此外需要保证软件的质量,可以通过预发布验证、自动化测试、发布、灰度发布等手段来减少和减轻故障。
- 伸缩性:指通过不断向集群中添加服务器来缓解不断上升的并发访问压力和不断增长的数据存储需求,比如NoSQL数据库,其天然就对伸缩性有很好的支持。
- 扩展性:可扩展性主要是通过分布式服务来实现,不同业务构建自身的服务,通过SOA治理中心统一管理,任何新的业务需求很容易增加到系统中。
- 安全性:衡量安全性的标准就是针对现存和潜在的各类攻击是否有可行的应对方案。
架构师故事
架构师领导艺术
- 关注人而不是产品:坚信一群优秀的人做一件他们热爱的事,一定能获得成功。而作为领导,寻找一个值得共同奋斗的目标,营造一个让大家最大限度发挥自我价值的工作氛围则是重中之重。
- 发掘人的优秀:发掘人的优先远比发掘优秀的人更有意义。
- 共享美好蓝图:蓝图应该是简单、清晰易于表述的,在项目过程中,架构师一定要保持对蓝图的关注,发现偏差时一定要及时纠正,不然只能是越走越偏。
- 学会妥协:记得很多书上都提到过妥协,比如“学会妥协是成熟的标志”,“谈判是一门妥协的艺术”等,充分体现了“妥协”的重要性。无论是架构方案与业务需求的冲突,又或者是与技术细节实现的冲突,一定静下心仔细思考利弊,做好充分沟通,才能做出合适的架构。
- 成就他人:我们活着的目的就是在成就自己,而在此过程中也需要不断成就他人,从古至今单打独斗都是很难成就大业的,只有相互抬庄才能将事业越做越大。
职场攻略:发现问题,寻找突破;提出问题(指出问题而不是批评别人;给老板提封闭式问题,给下属提开放性问题),寻求支持;解决问题,达成绩效(在解决我的问题前先解决你的问题;学会搁置部分问题)。
参考资料
- 李智慧. 大型网站技术架构[M]. 北京:电子工业出版社, 2013.