Redis 现在已经十分流行,互联网几乎所有项目都会用到,在使用 Redis 时,你知道是如何保证稳定和高效的提供服务呢,它的架构演化路程是什么呢?
单机版 Redis
2010 年,Redis 1.0 版本发布,这个架构非常简单。你的业务系统可以把 Redis 作为缓存系统,从 MySQL 查询数据,接着写入到 Redis 中,之后业务系统再从 Redis 中读取这些数据。
就这样想享受 Redis 快到飞起的性能。然而,随着时间的推移,业务体谅发展起来,忽然有一天,Redis 宕机,所有的流量会打到 MySQL 上,严重的话还会压垮 MySQL。
数据持久化
于是赶紧重启 Redis,可是因为 Redis 都是把数据保存在内存中,尽管你把 Redis 重启了,之前的户数也丢失了。流量依然会打到 MySQL 上,咋办呢?
于是,2013 年,Redis 2.8 版本发布,迎来了数据持久化。我们总不能每次写数据都写磁盘,这样太慢了,于是 Redis 引入 RDB 内存快照的方式实现持久化。
定时的把当前 Redis Redis 中的数据,写到磁盘上的 RDB 文件就可以了。除了 RDB 内存快照文件做持久化以外,还支持 AOF 文件。也就是将每次写指令都写到 AOF 文件中。
主从复制
似乎经过上面的优化,你再也不担心 Redis 宕机了,即使宕机,也可以通过持久化文件快速恢复 Redis 中的数据。
可事情并没这么简单,如果一个一个实例宕机,我们是否可以部署多个 Redis 实例,并保持实时数据同步,当一个实例宕机,手动从剩下的实例提升为 master 继续提供服务实现高可用。
就这样,Redis 2.8 版本添加了主从复制功能。主从复制架构诞生了,master 处理实时读写请求,另一个叫做 slave 的节点同步 master 的数据。通过主从架构缩短不可用时间,并且还可以让 slave 节点分担一部分读请求,提升应用整体性能。
哨兵集群
有了主从复制就万无一失了么?答案是否定的。
因为我们通过人工介入来实现主从切换的,就必须要算上人的反应时间、操作时间,所以,在这期间你的业务应用依旧会受到影响。
如何把这个过程自动化?
我们可以引入一个检查员,让这个检察院实时监测 master 的健康状态,这个观察者就叫做哨兵。
2012 年,Redis 在 2.6 版本首次发布哨兵模式,直到 Redis 2.8 版本第二版才变成生产可用。
哨兵是 Redis 的一种运行模式,它专注于对 Redis 实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个 Redis 系统的可用性。结合 Redis 的 官方文档,可以知道 Redis 哨兵具备的能力有如下几个:
- 监控:持续监控 master 、slave 是否处于预期工作状态。
- 自动切换主库:当 Master 运行故障,哨兵启动自动故障恢复流程:从 slave 中选择一台作为新 master。
- 通知:让 slave 执行 replicaof ,与新的 master 同步;并且通知客户端与新 master 建立连接。
Cluster 集群
2015 年,Redis 3.0 发布,这是一个里程碑版本,新增了 Redis 集群。
使用 Redis Cluster 集群,主要解决了大数据量存储导致的各种慢问题,同时也便于横向拓展。
Redis 集群是一种分布式数据库方案,集群通过分片(sharding)来进行数据管理(「分治思想」的一种实践)。
将数据划分为 16384 的 slots,每个节点负责一部分槽位。槽位的信息存储于每个节点中。是一个无中心架构,并提供复制和故障转移功能。
展望未来
Redis 受欢迎主要原因是极高的性能以及丰富、方便使用的数据结构,这些简单好用的数据结构大幅度降低开发业务复杂度。大家都在紧贴用户需求,开发更多的数据结构。
- 2017 年,Redis 5.0 发布,该版本最大的变化,就是新增了 stream 数据类型。
- 2020 年,Redis 6.0 发布,该版本引入了网络 IO 多线程,Redis 模型主要分为网络模块和命令处理模块,作者认为正常情况下,redis 单线程模型中,网络模块往往成为瓶颈高发地;
- 2022 年,Redis 7.0 发布,该版本就是重构了 dict 结构,内存占用更小,内存成本会大大减少,RDB 版本不向下兼容。