一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?
一、互联网概况
随着互联网的发展,技术的演进,如今的互联网环境,单体服务已经难以支撑我们现在的互联网流量压力。一个系统从单体服务逐渐发展成为集群架构,再慢慢的演变成分布式微服务架构,分布式微服务几乎已经无所不在出现在我们所见的大型互联网应用系统中。一个大型互联网应用系统基本上面临以下的技术问题:
高并发,大流量访问
Google 日均 PV 数 35 亿,日均 IP 访问数 3 亿
微信在线用户数 10 亿
天猫双十一活动一天交易额 3000 亿。
高可用
系统 7×24 小时不间断服务。大型互联网站的宕机事件通常会成为新闻焦点。
海量数据,需要存储、管理海量数据。
Facebook 每周上传的照片数目接近 10 亿
百度收录的网页数目有数百亿
Google 有近百万台服务器为全球用户提供服务
用户分布广泛,网络情况复杂
许多大型互联网都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别。在国内,有各个运营商网络互通难的问题。而中美光缆的数次故障,也让一些对国外用户依赖较大的网站不得不考虑在海外建立数据中心。
安全环境恶劣
由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几乎每天都会遇到黑客攻击情况。2011 年国内多个重要网站泄露用户密码,让普通用户也直面一次互联网安全问题。
需求快速变更,发布频繁
和传统软件的版本发布频率不同,互联网产品为快速适应市场,满足用户需求,其产品发布频率也是极高的。Office 的产品版本以年为单位发布,而一般大型网站的产品每周都有新版本发布上线,至于中小型网站的发布就更频繁了,有时候一天会发布几十次。
二、互联网服务器技术架构
由于互联网的发展,服务器设计需要解决的问题:
高性能
性能是互联网的一个重要指标,除非是没得选择,否则用户无法忍受一个响应缓慢的应
用。一个打开缓慢应用会导致严重的用户流失,很多时候系统性能问题是系统架构升级
优化的触发器。可以说性能是互联网系统架构设计的一个重要方面,任何架构设计方案
都必须考虑可能会带来的性能问题。
也正是因为性能问题几乎无处不在,所以优化网站性能的手段也非常多,从用户端到数
据库,从代码到机房部署,影响用户请求的所有环节都可以进行性能优化。
高可用
因为互联网分布式系统使用的服务器硬件通常是普通的商用服务器,这些服务器的设计
目标本身并不保证高可用,也就是说,很有可能会出现服务器硬件故障,也就是俗称的
服务器宕机。大型互联网系统通常都会有上万台服务器,每天都必定会有一些服务器宕
机,因此系统高可用架构设计的前提是必然会出现服务器宕机,而高可用设计的目标就
是当服务器宕机的时候,服务或者应用依然可用。。
可伸缩
大型互联网应用通过集群的方式将多台服务器组成一个整体共同提供服务。所谓伸缩性
是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增
长的数据存储需求。
衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添
加新的服务器。加入新的服务器后是否可以提供和原来的服务器无差别的服务。集群中
可容纳的总的服务器数量是否有限制。
目前服务器架构的演变,最终大概形成以下服务器架构:
主要使用到的技术有:
垂直扩展
垂直扩展通过提升单机处理能力扩展性能,包括提升硬件性能、提升单机架构等等措施。在预算允许的情况下,垂直扩展是最简单最靠谱的提升手段
水平扩展
水平扩展通过增加服务器数量扩充系统性能。当垂直扩展达到物理瓶颈时,我们只能通过水平扩展提升性能。水平扩展是互联网公司最常用的手段,但也对系统架构提出了更高的要求,小公司还是得审慎采用
DNS
DNS 是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换。它能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。当查询(域名) IP 时,路由或 ISP 提供连接 DNS 服务器的信息,在一些全球布局的互联网服务中,DNS 可以帮助用户连接到就近部署服务器。
CDN
内容分发网络是一个全球性的代理服务器分布式网络,它从靠近用户的位置提供内容。通常,网页的 HTML、CSS、JS、图片和视频等静态内容由 CDN 提供。
将内容存储在 CDN 上可以从两个方面来提供性能:
从靠近用户的数据中心提供资源
通过 CDN 获取的资源,减少消耗服务器计算资源
负载均衡
负载均衡器将传入的请求分发到不同的应用服务器和数据库等计算资源中。负载均衡器的效用在于:
防止请求进入不好的服务器
防止资源过载
帮助消除单一的故障点
负载均衡器还能帮助水平扩展,提高性能和可用性。
反向代理
反向代理是一种可以集中调用内部资源的服务;它为用户提供了一个统一接口的 web 服务器。来自客户 端的请求先被反向代理服务器转发到可响应请求的服务上,然后代理再把该服务的响应结果返回给客户端。 反向代理的好处是:
隐藏后端服务器的信息,屏蔽黑名单中的 IP,限制每个客户端的连接数。
客户端只能看到反向代理服务器的 IP,这使你可以增减服务器或者修改它们的配置。
此外,还可以做加密、压缩、缓存等操作提供性能或安全性。
微服务
微服务将一个大型应用拆分成一些列可以独立部署的小型的、模块化的服务。各个模块的服务又可以通过上面提到的负载均衡器或是反向代理进一步扩展为服务集群,提升服务的吞吐率。每个服务被运行在一个独立的容器中,通过明确定义的通讯机制互相调用,共同实现业务目标。这样可以减少各模块之间重复性的功能开发。
数据库技术
数据库还可以做进一步的拆分提升读写性能:
主从复制
联合
分片
NoSQL
缓存
缓存是将一些未更改的数据存放在更高速读取的硬件设备上,用于减少服务器和数据库的负载。系统经过分层后,每一层都可以有缓存,如:
客户端缓存:像端浏览器里就有内存级缓存、cookie、local storage、indexDB 等等。
CDN:上面提到的 CDN,在全球边缘站点分发静态资源,这也是一种缓存。
反向代理 & 负载均衡,无论是软硬件的设备都自带缓存
内存缓存:这个就比较多了,服务本身就可以在内存里缓存,还有一些专门的内存级缓存应用如 Redis、memcached 等等
数据库缓存:如 DB 里的查询级别的缓存、对象缓存等等
异步消息队列
有 RabbitMQ、Amazon SQS、RocketMQ 等等专用服务来托管异步消息,解耦不同应用。
评论