缓存、异步、集群和分布式等架构模式的实践

337

缓存,极大提升数据读写能力,实现系统性能、可用性、并发能力提高,同时也节约了计算、网络资源。异步,解决同步处理带来一系列问题,实现并行方式处理、系统解耦、流量削峰填谷,实现高性能、高可用、可伸缩、最终一致性的架构。负载均衡(Load Balance),将流量负载分布到多个服务器来提高服务、应用、数据库等的性能和可靠性,是实现服务器集群和分布式高可用架构的关键组件。

缓存架构模式(分布式缓存)

1. Cache 定义

存储在计算机上的一个原始数据复制集,以便于访问 。--

Wikipedia

  • Cache:缓存,加快取用的速度,偏重于读。为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。
  • Buffer:缓冲,缓和冲击,偏重于写。把突发打数量较小规模I/O整理成平稳的小数量较大规模I/O, 实现流量整形。

2. 缓存分类

  • 硬件和基础系统

    i) CPU缓存

    ii) 操作系统缓存

    iii) 数据库缓存

    iv) JVM编译缓存

  • 应用层

attachments-2020-12-xE2PZYO75fe3f3ff92d24.jpg

i) 客户端/浏览器缓存

ii) CDN缓存

iii) 代理与反向代理缓存

iv) 应用程序本地对象缓存

存储在共享内存,同一台机器的多个进程可访问,作为独立应用和应用程序部署在同一个服务器上。需考虑分布式集群中缓存的数据同步问题,因为每一个应用服务器有自己独立的缓存服务器。

attachments-2020-12-pnONowfn5fe3f40a5a154.jpg

v) 分布式对象缓存

可使用缓存客户端,通过协议访问缓存服务集群。集群中缓存映射服务节点,一般使用“带虚拟节点一致性哈希算法”来实现。

attachments-2020-12-g0nhIk0p5fe3f4140f61a.jpg

attachments-2020-12-ehLGff7F5fe3f41af181b.jpg

3. 缓存关键指标

缓存命中率:能多少次重用同一个缓存响应业务请求

影响因素:

  • 缓存键集合大小:键数量越少,缓存的效率越高
  • 缓存可使用内存空间:物理上能缓存的对象越多,缓存命中率就越高
  • 缓存对象生存时间:TTL, 对象缓存的时间越长,缓存对象被重用的可能性就越高

4. 缓存策略

  • Read-through 通读缓存

客户端连接缓存,如果缓存存在就返回,没命中代理连接到实际数据。

比如:代理缓存,反向代理缓存,CDN缓存

  • Cache-aside 旁路缓存

客户端访问缓存,如存在就返回,如不存在或已过期客户端会连接数据源,缓存起来并返回。缓存通常是key-value存储。

5. 为什么能提升和优化性能

  • 缓存数据来自内存,比磁盘上速度更快
  • 缓存是最终结果,无需计算,减少CPU资源消耗
  • 降低数据库、磁盘、网络的负载压力,减少I/O资源
  • 技术简单、性能提升显著、应用场景多

6. 合理使用缓存

  • 频繁修改数据:陡增系统负担
  • 没有热点的访问:不遵循二八定律,大部分数据访问不是集中在小部分的数据上
  • 不能容忍数据不一致与脏读
  • 缓存雪崩:数据库不能承受较大的压力而宕机,导致整个网站不可用。发生故障,甚至不能简单的重启缓存服务器和数据库服务器来恢复服务
  • 缓存预热:缓存预加载warm up, 对于一些元数据信息,可以启动时加载数据库中的数据到缓存进行预热
  • 缓存穿透:如果不夸当的业务或恶意攻击持续高并发的请求某个不存在的缓存数据,所有请求会落在数据库上,造成很大压力,甚至崩溃。一般是将不存在的数据缓存起来value值为null,并设置一个较短的失效时间。

7. Redis

  • Redis支持复杂的数据结构,支付多路复用异步I/O高性能,支持主从复制高可用,原生集群与share nothing集群模式
  • Redis集群预分好16384个桶,放一个key-value时,根据CRC16(key) mod 16384, 决定key放到哪个桶中
  • redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster负责维护slot与服务器的映射关系
  • 客户端与redis节点直连,所有redis节点彼此互联

异步架构模式(消息队列)

1. 同步调用 VS 异步调用

attachments-2020-12-SHgkrwth5fe3f42dedeed.jpg

2. 消息队列

attachments-2020-12-rPFvJWUm5fe3f435791cf.jpg

两个模式

  • 点对点模型:生产者生产一个消息只能被一个消费者消费
  • 发布订阅模式:生产者生产一个消息可被多个消费者进行订阅消费

优点

  • 实现异步处理,提升性能

  • 有更好的伸缩性

  • 流量的削峰填谷

  • 失败隔离和自我修复

  • 解耦

    3. 事件驱动架构 EDA

attachments-2020-12-w5UP5Jb65fe3f446c31d8.jpgattachments-2020-12-51WJnNeu5fe3f44d23384.jpg

4. MQ产品

  • RabbitMQ:Erlang语言开发,性能好,社区活跃
  • ActiveMQ:Java语言开发,跨平台
  • RocketMQ:阿里出品,Java开发,性能好,可靠性高
  • Kafka:LinkedIn出品,Scala开发,分布式伸缩性会比较好

集群和分布式架构模式(负载均衡)

负载均衡有两个重要的需关注点:如何选择哪个服务节点,就是路由算法;选择好的节点如何连接进行服务分发,就是服务分发。

1. 服务分发

  • HTTP重定向负载均衡:性能和安全性差,已淘汰
  • DNS负载均衡:7层负载,结合其他方式组合多层负载
  • 反向代理负载均衡:7层负载,可使用软件实现。如Ngnix
  • IP负载均衡:4层负载,IP数据包进行修改源和目标IP,请求和响应的流量都需经过负载服务器
  • 数据链路层负载均衡:4层负载,响应的流量无需经过负载服务器

2. 算法

  • 轮询:依次分发

  • 加权轮询:可配置权重

  • 随机:随机分配

  • 最少连接:记录连接数,分发到最少的连接服务器

  • 源地址散列:源IP进行Hash,实现会话粘滞

    3. session管理

服务器高可用架构设计基于无状态的特性,但业务总是有状态,比如用户登录状态。在分布式集群环境中,session管理有如下几种:

  • session复制:节点多时,复制成本过高,性能较差
  • session绑定:业务迭代快时,可用性不够
  • cookie记录session:通过前端的cookie与服务器认证系统
  • session服务器:通过共享的sesion服务器集群进行管理,把有状态的服务与无状态服务进行分离

原文:xie.infoq.cn/article/322…