这篇是读《大型网站技术架构》后的一些总结和个人理解。
1.模式
“模式”词我们应该是很熟悉的, 我们最常见和最常用到的就是设计模式了。那如何来解释“模式”这个词呢?
个人理解:在相似场景下可复用的解决方案。
两个比较关键的点:1.相似场景 2.可复用方案
2.网站架构模式
2.1 分层(横向)
分层主要是将系统进行横向切割。例如我们一般把系统分为应用层,服务层,数据层。进一步地,我们还可以继续在大的层次下划分小的层次。
分层的思想属于逻辑上的划分,在物理部署中,我们可以把不同的层次部署到同一台机器上或者部署到不同的机器上。
那么为什么我们还要在架构中进行分层,它的意义到底在哪?不着急,继续往下看。
2.2 分割(纵向)
分割主要是把大粒度的服务/功能模块进行细粒度的划分,它一般在某一层次上进行分割。这个也好理解,当网站趋向于复杂化,其中的功能和服务模块也不断增多,而其中的模块耦合也在不断地上升。为了更好地实现高内聚低耦合,功能的职责单一化,我们可以把不同的功能和服务模块独立提取出来(分割),进行分布式的部署,这样能够有效提高网站的并发能力和扩展能力。
解释到这,我们应该能大体明白网站为什么要分层、分割了。把网站的功能和服务模块切分为较细的粒度,并且每个模块都相对独立,使得网站的整体架构更加清晰,便于扩展。当然它的意义不仅仅于此,或者说它的意义才刚刚开始。
2.3 分布式
分布式是把不同的服务和功能部署到不同的物理机器上,通过远程调用来实现相互之间的协同工作。分布式意味着有更多的物理机加入到系统中,使得网站瓶颈不再出现于单台物理机的计算和资源能力。分布式也意味着庞大系统中的工程团队有了更加明确的任务,使得系统形成了模块化的部署,避免了过去庞大系统遇到的一些麻烦:
- 编译、部署困难,整体系统的编译是一个很漫长的过程,多则数个小数;如果编译数小时后发现项目编译失败,可想工程师的心情…(⊙o⊙)…而分布式后,每个服务可以进行单独的部署,那部署起来会轻松很多
- 负责的代码管理,试想想一个开发了N多年的系统代码,你能很快了解分布式的益处
- 数据库连接,分布式将数据库访问服务单独部署起来,各个上层应用不直接连接服务器,而是使用数据访问的服务,消除了各个应用和数据库直接庞大的连接关系,减轻了数据库的连接负担
- 系统业务扩展困难,这个不用多说,对于一个庞大系统的业务扩展,如果不进行横纵向的分割和分布式部署,开发难度可想而知
一个事物的产生总会带来两面性,分布式当然也不例外,也带来了一些麻烦:
- 分布式的服务调用需要通过网络,而网络的响应速度制约着整体系统的响应速度–>异步
- 物理机增多,宕机概率增大–>服务重复部署
- 数据一致性问题–>zookeeper,分布式锁
- 单点登录–>Session共享
系统架构后面的一些模式就是为了解决分布式产生的问题而出现的,例如后面要说的集群。
2.4 集群
集群主要是多台物理机部署相同的模块/服务,通过负载均衡对外提供统一服务。那为什么在上面我说集群是为解决分布式的问题产生的?为了解决什么问题?是的,分布式部署的宕机问题,这是个很严重的问题。一旦服务宕机,网站的可用性就会降低,要是宕机的是核心服务,那基本上就等于网站不可用了,老板很生气,后果很严重啊。那如何解决?把相同的服务部署多台,也就是形成集群,然后通过负载均衡器对外提供统一服务。网站整体的可用性得到了提升,并且网站的并发量也大幅提升。其实网站的并发量不能说是集群带来的好处,它也可能成为服务形成集群的直接动力。随着整个网站业务的发展,访问量会不断加大,这时系统需要较高的并发能力,所以为了避免单台物理服务造成的系统瓶颈,把服务集群化。
2.5 缓存
《大型网站技术架构》书中
缓存是将数据存放在距离计算最近的位置以加快处理速度(此处的距离应该是逻辑的距离)
我理解的缓存是:能够加快处理速度的数据存放点
我们一般理解的缓存就是物理机中的内存,其实缓存的概念相对宽泛,可能不仅仅是内存。例如,操作系统为了平衡CPU处理速度和写入内存之间的差距,在中间加入CPU高速缓存,它实质上也是为了加快处理速度的,但它不是在内存中。
在网站架构中缓存几乎无处不在:
- CDN
- 反向代理
- 本地缓存(应用服务器中存放的缓存数据)
- 分布式缓存
缓存的使用需要注意一些问题:1. 缓存的场景,读远大于写;2. 缓存淘汰;3. 缓存的雪崩效应(Not 血崩)
在这简单讲一下雪崩效应:如果在系统中扩展新的缓存节点,需要将原有数据重新进行hash分配到各节点中;当这个情况发生在一个高并发的场景下,就会导致大量的请求无法命中缓存,直接去读取数据库,缓存的一部分目的就是成为数据库的挡箭牌,现在挡箭牌不起作用了,数据库服务离game over就不远了。NB的工程师们当然不愿意看到这种情况的发生,所有就有了一致性Hash的出现。
2.6 异步
异步架构是为了什么?在我看来,异步本身的作用有解耦和提高响应速度。消息传递不再是一个同步的过程,用户的请求和服务的调用进行了分离。异步在网站架构中一个最重要的应用就是消息队列,消息队列是一个生产者消费者模式,这样的结构把请求和服务解耦。它还有一些很好的特性:
- 提高系统可用性,服务的故障不会导致用户请求的丢失。
- 加快响应速度
- 流量削峰,当并发量猛然升高时,请求都进入消息队列,并不会使消费者服务器负载猛然增高,发生宕机问题。所以它成为了消费者服务器的挡箭牌,起到了消除并发高峰的作用。
2.7 冗余
冗余主要是为了保证网站的可用性和可靠性。主要指的是数据的冗余备份,包括冷备份和热备份。
2.8 自动化
网站的理想化状态,一切自动化:
- 自动化发布
- 自动化代码管理
- 自动化测试
- 自动化安全测试
- 自动化部署
- 自动化监控
- 自动化报警
- 自动化失效转移
- 自动化降级
- 自动化资源分配
其中的一部分自动化,现在的大型网站可以完成,但是还有一些自动化还需要不断地进行探索。
2.9 安全
安全:防攻击(XSS攻击,SQL注入等),防数据泄露,防垃圾信息,内部业务的安全性。
参考:
- 特别感谢《大型网站技术架构》