(七)Redis高可用
欢迎访问(七)Redis高可用 - 一打木 (taitres.com)
AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失)。
不过,由于数据都是存储在一台服务器上,会出现单点故障。解决的最好办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服务器依然可以继续提供服务。
多台服务器要保存同一份数据,这些服务器之间的数据如何保持一致性?
主从复制
主从服务器之间采用的是「读写分离」的方式。
主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读。
第一次同步
第一阶段:建立链接、协商同步
第一次同步,主服务器还不知道从服务器,响应全量复制方式
第二阶段:主服务器同步数据给从服务器
主服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器。
从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件
第三阶段:主服务器发送新写操作命令给从服务器
主服务器将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,以同步主服务器生成RDB快照之后的操作
基于长连接的命令传播
主从服务器在完成第一次同步后,双方之间就会维护一个 TCP 连接,后续主服务器可以通过这个连接继续将写操作命令传播给从服务器,这个过程被称为基于长连接的命令传播
分摊主服务器的压力
主服务器是可以有多个从服务器的,如果从服务器数量非常多,而且都与主服务器进行全量同步的话,主服务器压力过大。
从服务器可以有自己的从服务器,主服务器生成 RDB 和传输 RDB 的压力可以分摊到充当经理角色的从服务器。
增量复制
网络断开又恢复后,从主从服务器会采用增量复制的方式继续同步。
主从复制优点
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;
- Slave 同样可以接受其它 Slaves 的连接和同步请求,这样可以有效的分载 Master 的同步压力(分摊主服务器压力);
- Master Server 和 Slave Server 是以非阻塞的方式完成数据同步。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求;
- 网络断开又恢复后,可以增量复制。
主从复制缺点
- Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复(也就是要人工介入);
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性;
- 如果多个 Slave 断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要 Slave 启动,就会发送sync 请求和主机全量同步,当多个 Slave 重启的时候,可能会导致 Master IO 剧增从而宕机。
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
哨兵模式(Sentinel)
第一种主从同步/复制的模式,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
哨兵是一个独立的进程
哨兵模式的作用
- 监控:master 是否宕机
- 每个Sentinel进程以每秒钟一次的频率向整个集群中的 Master ,Slave 以及其他Sentinel进程发送一个 PING 命令
- 一个master一段时间没回sentinel,被这个sentinel标记为主观下线。足够多的sentinel标记master为主观下线就变成客观下线
- 选主:master 宕机后,将 slave 切换成 master
- 首先确定master下线的sentinel成为候选者,其他sentinel投票决定leader来进行主从切换;
- 挑选出一个从节点(网络好,优先级高,数据完整);
- 让已下线主节点属下的所有「从节点」修改复制目标,修改为复制「新主节点」。
- 通知:通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机
- 将新主节点的 IP 地址和信息,通过「发布者/订阅者机制」通知给客户端;
- 继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点。
哨兵模式优点:
- 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
- 主从可以自动切换,系统更健壮,可用性更高(可以看作自动版的主从复制)。
哨兵模式缺点:
- Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
Cluster 集群模式
Redis-Cluster采用无中心结构,每个节点都保存数据,节点之间互相连接从而知道整个集群状态。
数据分片(Sharding):Cluster将数据分散存储在多个节点上,每个节点负责一部分数据。数据分片基于哈希槽(Slot)实现,共有16384个槽,每个键通过CRC16算法映射到特定槽,槽再分配给集群中的节点。
Redis Cluster工作机制
相当于多个主从结构
主节点(Master):负责处理槽对应的读写请求,维护数据副本,并同步给从节点。
从节点(Slave):复制主节点数据,提供读服务,主节点故障时可晋升为主节点。
数据路由:
-
客户端路由:客户端使用MOVED重定向响应或ASK转向请求,自动将请求转发至正确的主节点。
-
节点间路由:节点通过集群拓扑信息,将不属于本节点的请求转发至目标节点。
故障检测与自动故障转移:
- 心跳检测:节点间定期发送PING/PONG消息,检测对方是否存活。
- 主观下线与客观下线:类似Sentinel,节点根据心跳超时判断主观下线,多数节点同意则标记客观下线。
- 故障转移:故障节点的从节点竞选成为新主节点,其他节点更新槽映射与配置,客户端自动重定向。
数据同步与增量复制:
- 全量同步:新节点加入或从节点晋升为主节点时,通过RDB快照进行全量同步。
- 增量复制:主从节点间通过PSYNC命令进行增量数据同步,减少网络开销。
Cluster优点:
- 多主多从,去中心化:从节点作为备用,复制主节点,不做读写操作,不提供服务
- 支持动态扩容节点:这是我认为算是Rerdis Cluster最大的优点之一;
- 节点之间相互通信,相互选举,不再依赖sentinel:准确来说是主节点之间相互“监督”,保证及时故障转移。
Cluster缺点:
不支持处理多个key:因为数据分散在多个节点,在数据量大高并发的情况下会影响性能;
参考:
认识Redis集群——Redis Cluster - JJian - 博客园 (cnblogs.com)
深度图解Redis Cluster - 知乎 (zhihu.com)
[Redis] 你了解 Redis 的三种集群模式吗? - 个人文章 - SegmentFault 思否
【Redis深度解析】揭秘Cluster(集群):原理、机制与实战优化_redis cluster 集群分片原理-CSDN博客