互联网的标准技术架构如下图所示:
SQL 即通常所说的关系数据,关系数据不可能完全被抛弃,NoSQL是Not Only SQL,即 NoSQL 是 SQL 的补充。
一般情况下互联网行业都是用 MySQL、PostgreSQL ,这类开源数据库的特点是开源免费;缺点是性能比商业数据库要差一些。随着业务发展,性能要求越来越高,必然要将数据拆分到多个数据库实例才能满足业务的性能需求。
数据库拆分满足了性能的要求,但带来了复杂度的问题:数据如何拆分、数据如何组合?这个复杂度的问题解决起来并不容易,所以流行的做法是将这部分功能独立成中间件,将分库分表做到自动化和平台化,如MySQL官方推荐的MySQL Router。
业务继续发展,规模继续扩大,SQL 服务器越来越多,导致新的复杂度问题:数据库资源使用率不高,各 SQL 集群分开维护成本越来越高。因此,一般都会在 SQL 集群上构建 SQL 存储平台,以对业务透明的形式提供资源分配、数据备份、迁移、容灾、读写分离、分库分表等一系列服务。
NoSQL 的这两个特点很好地弥补了关系数据库的不足,因此在互联网行业 NoSQL 的应用基本上是基础要求。
NoSQL 方案一般自身就提供集群的功能,因此在刚开始应用时很方便。
一般不会在开始时就考虑将 NoSQL 包装成存储平台,但如果公司发展很快,例如 Memcache 的节点有上千甚至几千时,NoSQL 存储平台就很有意义了。
NoSQL 发展到一定规模后,在集群的基础之上再实现统一存储平台,主要实现如下功能:
一般几十台 NoSQL 服务器,做存储平台收益不大;有几千台 NoSQL 服务器,NoSQL 存储平台就能够产生很大的收益。
除了关系型的业务数据,还有很多用于展示的数据。这些数据具有三个典型特征:
基本上业务在起步阶段就可以考虑做小文件统一存储,通常将小文件存储做成统一的和业务无关的平台,避免重复造轮子。
在开源方案的基础上封装一个小文件存储平台并不是太难的事情。例如,HBase、Hadoop、Hypertable、FastDFS 等都可以作为小文件存储的底层平台,只需要将这些开源方案再包装一下基本上就可以用了。
大文件主要分为两类:
在存储上和小文件有较大差别,不能直接将小文件存储系统拿来存储大文件。开源方案现在很成熟了,所以大数据存储和处理相对简单,在几个流行的开源方案中选择,例如,Hadoop、HBase、Storm、Hive 等。
随着业务发展,复杂度越来越高,系统拆分的越来越多,不同的系统由不同的小组开发。如果每个小组用不同的开发框架和技术,则会带来很多问题:
对于框架的选择,有一个总的原则:优选成熟的框架,避免盲目追逐新技术!
开发框架只是负责完成业务功能的开发,真正能够运行起来给用户提供服务,还需要服务器配合。
选择一个服务器主要和开发语言相关,例如:
Docker 不只是一个虚拟化或者容器技术,它将在很大程度上改变目前的技术形势:
服务层的主要目标是降低系统间相互关联的复杂度。
当系统数量不多的时候,一般是各系统自己管理自己的配置,但系统数量多了以后,这样的处理方式会有问题:
实现配置中心主要就是为了解决上面这些问题,将配置中心做成通用系统的好处:
当系统数量不多的时候,系统间的调用一般都是直接通过配置文件记录在各系统内部的,但当系统数量多了以后,这种方式就存在问题了。
服务中心就是为了解决跨系统依赖的“配置”和“调度”问题。服务中心的实现一般来说有两种方式:服务名字系统和服务总线系统。
相比服务名字系统,服务总线系统更进一步了:由总线系统完成调用,服务请求方都不需要直接和服务提供方交互了。
互联网业务的一个特点是“快”,这就要求很多业务处理采用异步的方式。
对比蜘蛛网架构,可以清晰地看出引入消息队列系统后的效果:
消息队列系统基本功能的实现比较简单,但要做到高性能、高可用、消息时序性、消息事务性则比较难。
业界已经有很多成熟的开源实现方案:
开源的用起来方便,但要改就很麻烦了。由于其相对比较简单,花费人力和时间重复造一个轮子,这样可以根据自己的业务特点做快速的适配开发。
除了复杂度,互联网业务发展的另外两个关键特点是“高性能”和“高可用”。设计高可用和高性能系统的时候,主要关注点在系统本身的复杂度,但是,单个系统的高可用和高性能并不等于整体业务的高可用和高性能,要从更高的角度去设计,这就是“网络”,这里强调的是站在网络层的角度整体设计架构,而不是某个具体网络的搭建。
将请求均衡地分配到多个系统上,使用负载均衡的原因:每个系统的处理能力是有限的,为了应对大容量的访问,必须使用多个系统。
例如,一台 32 核 64GB 内存的机器,性能测试数据显示每秒处理 Hello World 的 HTTP 请求不超过 2 万,实际业务机器处理 HTTP 请求每秒可能才几百 QPS,而互联网业务并发超过 1 万是比较常见的,遇到双十一、过年发红包这些极端场景,每秒可以达到几十万的请求。
DNS 是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。一般不会使用 DNS 来做机器级别的负载均衡,因为太耗费 IP 资源了。
DNS 负载均衡:
所以对于时延和故障敏感的业务,可以尝试实现 HTTP-DNS 的功能,即使用 HTTP 协议实现一个私有的 DNS 系统。
HTTP-DNS 主要应用在通过 App 提供服务的业务上,因为在 App 端可以实现灵活的服务器访问策略,如果是 Web 业务,实现起来就比较麻烦一些,因为 URL 的解析是由浏览器来完成的,只有 Javascript 的访问可以像 App 那样实现比较灵活的控制。
HTTP-DNS 的优缺点有:
Nginx、LVS、F5 用于同一地点内机器级别的负载均衡。
软件和硬件的区别就在于性能,硬件远远高于软件。
如果按照同等请求量级来计算成本的话,实际上硬件负载均衡设备可能会更便宜,例如假设每秒处理 100 万请求,用一台 F5 就够了,但用 Nginx,可能要 20 台,这样折算下来用 F5 的成本反而低。
4 层和 7 层的区别就在于协议和灵活性。
为了解决用户网络访问时的“最后一公里”效应,本质上是一种“以空间换时间”的加速策略,即将内容缓存在离用户最近的地方,用户访问的是缓存的内容,而不是站点实时的内容。
CDN 经过多年的发展,已经变成了一个很庞大的体系:分布式存储、全局负载均衡、网络重定向、流量控制等都属于 CDN 的范畴,尤其是在视频、直播等领域,如果没有 CDN,用户是不可能实现流畅观看内容的。CDN 作为网络的基础服务,独立搭建的成本巨大。
从架构上来说,单机房就是一个全局的网络单点,在发生比较大的故障或者灾害时,单机房难以保证业务的高可用。
多机房设计最核心的因素就是如何处理时延带来的影响,常见的策略有:
多中心必须以多机房为前提,但从设计的角度来看,多中心相比多机房是本质上的飞越,难度也高出一个等级。
多机房的主要目标是灾备,多中心要求每个中心都同时对外提供服务,且业务能够自动在多中心之间切换,故障后不需人工干预或者很少的人工干预就能自动恢复。
多中心设计的关键就在于“数据一致性”和“数据事务性”,这两个难点都和业务紧密相关。
互联网业务的一个典型特征就是通过互联网将众多分散的用户连接起来,因此用户管理是互联网业务必不可少的一部分。
互联网业务拆分为多个子系统,管理用户时需要要实现单点登录(SSO),实现手段较多,例如 cookie、JSONP、token 等,目前最成熟的开源方案是 CAS,架构如下:
当业务做大后,开放成为了促进业务进一步发展的手段,需要允许第三方应用接入:授权登录。现在最流行的授权登录就是 OAuth 2.0 协议,基本上已经成为了事实上的标准。
消息推送根据不同的途径,分为:
通常情况下:
主要挑战:
互联网业务场景中,用户会上传多种类型的文件数据:
为了满足用户的文件上传和存储需求,需要对用户提供文件存储和访问功能,简单来说,存储云和图片云通常的实现都是“CDN + 小文件存储”,现在有了“云”之后,直接买云服务可能是最快也是最经济的方式。
业务层面对的主要技术挑战是“复杂度”,复杂度越来越高的一个主要原因就是系统越来越庞大,业务越来越多。通过拆分,化整为零,分而治之,将整体复杂性分散到多个子业务或子系统中。
子系统太多出现另一个问题,业务的调用流程复杂,出了问题排查也会特别复杂。通过合并,高内据低耦原则,将职责关联比较强的子系统合成一个虚拟业务域,然后通过网关对外统一呈现。
运维平台核心的职责分为四大块:配置、部署、监控、应急,每个职责对应系统生命周期的一个阶段。
运维平台的核心设计要素是“四化”:标准化、平台化、自动化、可视化。
需要制定运维标准,规范配置管理、部署流程、监控指标、应急能力等,各系统按照运维标准来实现,避免不同的系统不同的处理方式。标准化是运维平台的基础,没有标准化就没有运维平台。
如果某个系统就是无法改造自己来满足运维标准,常见的做法是不改造系统,由中间方来完成规范适配。
例如,某个系统对外提供了 RESTful 接口的方式来查询当前的性能指标,而运维标准是性能数据通过日志定时上报,那么就可以写一个定时程序访问 RESTful 接口获取性能数据,然后转换为日志上报到运维平台。
传统的手工运维方式需要投入大量人力,效率低,容易出错,因此需要在运维标准化的基础上,将运维的相关操作都集成到运维平台中,通过运维平台来完成运维工作。
运维平台的好处有:
传统手工运维方式效率低下的一个主要原因就是要执行大量重复的操作,运维平台可以将这些重复操作固化下来,由系统自动完成。
例如,一次手工部署需要登录机器、上传包、解压包、备份旧系统、覆盖旧系统、启动新系统,这个过程中需要执行大量的重复或者类似的操作。
有了运维平台后,平台需要提供自动化的能力,完成上述操作,部署人员只需要在最开始单击“开始部署”按钮,系统部署完成后通知部署人员即可。
有了运维平台后,运维平台可以实时收集数据并进行初步分析,当发现数据异常时自动发出告警,无须运维人员盯着数据看,或者写一大堆“grep + awk + sed”来分析日志才能发现问题。
运维平台有非常多的数据,如果全部通过人工去查询数据再来判断,则效率很低。
尤其是在故障应急时,时间就是生命,处理问题都是争分夺秒,能减少 1 分钟的时间就可能挽回几十万元的损失,可视化的主要目的就是为了提升数据查看效率。
可视化相比简单的数据罗列,具备下面这些优点:
测试平台核心的职责就是测试,包括单元测试、集成测试、接口测试、性能测试等,都可以在测试平台完成。
测试平台的核心目的是提升测试效率,从而提升产品质量,其设计关键就是自动化。
传统的测试方式是测试人员手工执行测试用例,测试效率低,重复的工作多。通过测试平台提供的自动化能力,测试用例能够重复执行,无须人工参与,大大提升了测试效率。
为了达到“自动化”的目标,测试平台的基本架构如下图所示。
数据平台的核心职责主要包括三部分:数据管理、数据分析和数据应用。每一部分又包含更多的细分领域,详细的数据平台架构如下图所示。
数据管理包含数据采集、数据存储、数据访问和数据安全四个核心职责,是数据平台的基础功能。
数据分析包括数据统计、数据挖掘、机器学习、深度学习等几个细分领域。
数据应用很广泛,既包括在线业务,也包括离线业务。例如,推荐、广告等属于在线应用,报表、欺诈检测、异常检测等属于离线应用。
数据应用能够发挥价值的前提是需要有“大数据”,只有当数据的规模达到一定程度,基于数据的分析、挖掘才能发现有价值的规律、现象、问题等。如果数据没有达到一定规模,通常情况下做好数据统计就足够了。
管理平台的核心职责就是权限管理,无论是业务系统(例如,淘宝网)、中间件系统(例如,消息队列 Kafka),还是平台系统(例如,运维平台),都需要进行管理。如果每个系统都自己来实现权限管理,效率太低,重复工作很多,因此需要统一的管理平台来管理所有的系统的权限。
权限管理主要分为两部分:身份认证、权限控制,其基本架构如下图所示。