在分布式系统中为了解决单点为题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。
一、拓扑
Redis的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为以下三种:一主一从、一主多从、树状主从结构。
1.1 一主一从
一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持,如图6-4所示。当应用写命令并发量较高且需要持久化时,可以只在从节点上开启AOF,这样既保证数据安全性同时也避免了持久化对主节点性能的干扰。
1.2 一主多从
一主多从结构使得应用端可以利用多个从节点实现读写分离,如图6-5所示。
- 对于读占比较大的场景,可以把读命令发送到从节点来分担主节点压力。同时在日常开发中如果需要执行一些比较耗时的读命令,如:keys、sort等,可以在其中一台从节点上运行,防止慢查询对主节点造成阻塞从而影响线上服务的稳定性。
- 对于写占比较大的场景,多个从节点会导致主节点写命令多次发送从而过度消耗网络带宽,同时也加重了主节点的负载,影响服务的稳定性。
1.3 树状主从结构
树状主从结构使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入复制中间层,可以有效降低主节点负载和需要传送给从节点的数据量,如图6-6所示。
二、复制原理
2.1 复制过程
复制过程如图6-7所示。
需要解释的是图里的同步数据集和命令持续复制。
同步数据集:主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分是耗时最长的步骤。在这里的同步数据集可以划分两种情况:全量同步和部分同步。
命令持续复制:当主从节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。
2.2 全量复制
一般用于初次复制场景,Redis早期支持的复制功能只有全量复制,它会把主节全部数据一次性发送给从节点,当数据量较大时,会对主节点和网络造成很大的开销。
全量复制时主节点会生成一个RDB文件,然后发送给从节点。
2.3 部分复制
用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销。
部分复制主要是靠主节点和从节点的偏移量实现。
缺点
单点故障
读写分离存在主从问题问题