大型网站技术架构

大型网站技术架构小结

如何开发一个性能好、可用性高、伸缩性好、易扩展且安全的网站,应该从哪些方面入手,是一个有趣的挑战。

1. 通用的网站架构模式

  • 分层
    将网站划分为应用层、服务层、数据层。每层的功能不同
    好处是:可以将一个庞大的系统切分为不同的部分,便于分工合作开发和维护;各层之间具有一定的独立性,只要维持调用不变,各层可以根据具体问题独立的做出改变。
    挑战:必须合理的规划层次边界和接口,在开发过程中应该严格的遵守分层架构的约束。
  • 分割
    分层是横向的切分,分割是纵向的切分。如在应用层做分割,可以将购物、论坛、搜索、广告分割成不同的应用,由独立的团队负责,部署在不同的服务器上。
  • 分布式
    通过远程调用,可以将切分后的模块部署在多台不同的机器上。
    优点:可以有更多的计算机完成相同的功能,比如使用集群完成分割出来的订单功能。
    缺点:给编码带来了复杂性,如单机事务变分布式事务、单机缓存变分布式缓存。还对数据一致性带来了要求,以及网络延迟可能会造成调用的时间损耗。
  • 集群
    集群的作用简单来说就是提高可用性和,至少两台机器,如果一台宕机了,另外一台可以立即补上。
  • 缓存
    提高性能一个方法是让数据在最前的位置就可以返回,利用缓存就是一个很好的选择,缓存多是将数据存储在高速运行介质上。常用如CDN(内容分发网络):将静态资源部署在最近的服务器上,客户端请求时直接从上面拿。反向代理:反向代理也可以缓存静态资源、热点资源等。本地缓存:即应用服务器本地缓存着热点数据,应用程序可以在本机内存中直接访问数据,而无需访问数据库。
  • 分布式缓存
    大型网站的数量十分的庞大,需要集群做分布式缓存,应用程序通过网络通信访问缓存数据。
  • 异步
    将一个业务分为多个阶段,每个阶段之间通过共享数据的方式异步执行,可以提高总的运行速度。生产者消费者就是一个典型的异步,中间件有消息队列,作用包括提高系统可用性、加快网站响应速度、消除并发访问高峰。
  • 冗余备份
    确保数据不丢失
  • 自动化
    提高开发部署效率
  • 安全
    常用加密、认证等方式保证安全,还有例如敏感词过滤、垃圾信息过滤这一类防护。

2. 性能

提高网站的性能需要考虑哪些点?我们通常用这样几个关键词来评估性能,响应时间、并发数、吞吐量(qps/tps/hps)。

1. 如何排查性能瓶颈?

问: 假设,有一个url请求,很长时间无响应,如何排查原因呢?
逐步排查,使用开发者工具查看是静态资源加载慢还是后台接口调用慢,如果是后者,先排查网络问题。然后再从应用层开始排查,分析哪个环节响应时间不合理、超过预期;检查监控数据,分析内存、磁盘、网络和cpu,以及代码和架构。一般顺序包括查看链路监控,服务器性能监控、方法调用优化。

web前端性能优化

浏览器访问优化、CDN加速、反向代理

应用服务器优化

分布式缓存、异步(流量消峰、整体并发)、使用集群(并发处理请求)、代码优化(线程池、对象池、多线程)

数据库优化

数据库调优相关

3. 可用性

网站的高可用性是根基,如果一个网站频频宕机是任何人都接受不了的。现代大型网站一般都会分层、分割,所以整体可用性的前提是每个模块的可用性。

1. 高可用性的应用

应用层
  • 关键词:无状态性,结点无状态才方便作失效转移,无状态指的是不保存上下文数据,每次仅仅根据请求做相应的业务逻辑处理,多个服务实例之间完全对等。既然每个节点是无状态的,那么面对多个节点组成的集群,我们就可以用负载均衡来分发请求,一旦其中一个结点宕机了,心跳失去连接就将这个节点剔除。
  • 对于应用层来说,很多模块都是用户直接接触的模块,那么就需要session保存用户状态,对于分布式服务来说就需要分布式session。实现分布式session有几种手段。1.session复制:效率低但方法简单,不适合有大量节点的集群。2.利用负载均衡的ip hash将来自同一个ip的请求打到同一台机器上:如果这个机器挂了,那么session也就丢失,不符合高可用的要求。3.利用cookie记录session:用户关闭cookie就没法用了…然后每次响应都要传递cookie,影响性能。4.session认证中心:用一个专门的模块管理分布式session,其他节点需要使用RPC调用的方式请求session。
服务层

服务层一般都是可复用的基础公共模块。

  • 分级管理,分核心和非核心,提供不对等的资源。遇到流量高峰时关闭一些低优先级的服务,
  • 超时设置,由于服务器宕机、线程死锁等原因可能导致应用程序对服务端的调用失去响应。进而导致用户请求长时间得不到响应,有了超时就有了反馈,调用者可以实现相关策略
  • 异步调用,分阶段调用
  • 服务降级,高峰期关停非核心服务,
  • 幂等性设计,多次重复调用和调用一次的结果是一样的。
数据层
数据节点可用性

数据集群是有状态的,所以在做失效转移的时候就要考虑数据一致性了。提到数据一致性不得不提分布式的基础理论CAP(在面试蘑菇街的时候面试官问了我这个问题,我给他解释了一遍CAP各自代表什么,但是他强调我没有解释CAP理论的核心,后来才知道CAP理论说的是一个分布式系统无法同时满足一致性、数据可用性、分区耐受性这三个条件,其实我知道这个内容,但是没get到这个就是CAP的核心~)

具体来说,数据一致性又可以分为数据强一致:物理存储中的数据总是一致的,数据用户一致:在用户访问时通过纠错和验证保证用户看到的是一致的,实际各个副本数据可能不一致。数据最终一致性:经过一段时间每个节点上的副本最终达到一致。

数据备份

分数据冷备和数据热备,这一部分后面会单独再写点东西

未完待续