📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
本文目录
本文导读
本文讲解Redis高可用之Cluster主从模式详解,首先讲解什么是主从复制,主从复制主要的作用,Redis主从模式三种常见的拓扑结构,一主一从、一主多从、树状主从。
Redis的主从复制原理,两种主从数据同步的方式的原理,全量复制原理和部分复制原理,最后总结主从复制的不足。
一、主从模式解析
1、什么是主从复制
主从复制,是指将一个Redis服务器的数据复制到其他Redis服务器。
前者称为主节点(master),后者称为从节点(slave)。在此过程中,只有 master 机可以执行写命令,而 salve 机只能执行读命令。这种读写分离模式可以大大降低 Redis 主机的数据读取压力,从而提高 Redis 的效率,同时提供多个数据备份,主从模式是构建Redis集群的最简单方法。
2、主从复制主要的作用
数据冗余:主从复制实现了数据的热备份(数据冗余模式)。
故障恢复:当主节点出现问题时,从节点可以提供服务以实现快速故障恢复(服务冗余模式)。
负载均衡:在主从复制的基础上,结合读写分离,主节点可以提供写服务,从节点可以提供读服务(即应用程序在写Redis数据时连接到主节点,应用程序在读Redis数据的时候连接到从节点),以分担服务器负载。特别是在少写多读的情况下,通过在多个从节点之间共享读负载,可以大大提高Redis服务器的并发性。
高可用性:主从复制是Sentinel(哨兵)和集群模式实现的基础,因此主从复制是Redis高可用性的基础。
二、Redis主从模式几种常见的拓扑结构
Redis主从模式拓扑结构可以支持一主一从、一主多从、树状主从结构。
1、一主一从结构
一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持。
2、一主多从结构
一主多从结构(又称为星形拓扑结构)使得应用端可以利用多个从节点实现读写分离(见图6-5)。
对于读占比较大的场景,可以把读命令发送到从节点来分担主节点压力。
3、树状主从结构
树状主从结构(又称为树状拓扑结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。
通过引入复制中间层,可以有效降低主节点负载和需要传送给从节点的数据量。
三、Redis的主从复制原理
Redis主从复制的工作流程大概可以分为如下几步:
1、保存主节点(master)信息的步骤是保存主节点的信息,包括主节点的IP和端口。
2、从节点(slave)发现新的主节点之后,它尝试与主节点建立网络连接。
3、发送ping命令连接成功后,从节点发送第一次通信的ping请求,主要是检测主从节点之间的网络套接字是否可用,以及主节点当前是否可以接受处理命令。
4、权限验证,如果主节点需要密码验证,则从节点必须具有正确的密码才能通过验证。
5、同步数据集,当主复制连接和从复制连接正常通信后,主节点将向从节点发送其保存的所有数据。
6、命令连续复制,主节点将连续向从节点发送写命令,以确保主数据和从数据的一致性。
四、主从数据同步的方式
Redis在2.8及以上版本使用psync命令完成主从数据同步,同步过程分为:全量复制和部分复制。
1、全量复制(完全重同步)
如果是第一次同步(初始复制场景),从服务器尚未复制任何主服务器,或者从服务器要复制的主服务器与上次要复制的主服务器不同,则将使用完全重同步模式进行复制(完全复制)。
全量复制将主节点的所有数据一次性发送到从节点,当数据量很大时,会给主节点和从节点以及网络造成大量开销。
全量复制的完整运行流程如下:
1、将数据从主服务器复制到从服务器,第一步是建立 Socket 连接,这个过程将进行一些信息验证、身份验证和其他事情
2、然后从服务器将向主服务器发送 PSYNC 命令以请求同步,此时,将带来服务器ID RUNID和复制进度 offset参数(偏移参数)
3、当主服务器发现这是一个新的从服务器(因为参数没有带来)时,它将采用完全重新同步模式,并将服务器ID(runld)和复制进度(offset)发送到从服务器
4、从服务器就会保存这些信息
5、主服务器将在后台生成RDB文件,并通过先前建立的连接将其发送到从服务器。从服务器接收RDB文件后,主服务器将首先清除自己的数据,然后加载并恢复RDB文件。在此过程中,主服务器继续从客户端接收请求
6、主服务器将使用 buffer 缓冲区来记录RDB文件中生成的修改命令。在从服务器加载RDB后,主服务器将向从服务器发送 buffer 中记录的命令
7、主服务器和从服务器实现数据一致性(复制过程是异步的,因此数据是最终一致性)
2、部分复制(部分重同步)
部分复制是Redis针对完全复制的高成本而采取的一种优化措施,它是使用psync {runId} {offset} 命令实现的。
当从节点复制主节点时,如果出现网络闪存或命令丢失等异常,则从节点将请求主节点重新发布丢失的命令数据。
如果这部分数据存在于主节点的复制积压缓冲区中,它将直接发送到从节点,这样可以保持主节点和从节点复制的一致性。
部分复制的完整运行流程如下:
使用 offset 执行部分重新同步。主服务器每次发送命令时,都会将 offset 发送到从服务器。主服务器和从服务器将保存 offset。
如果两侧的 offset 不同,则表示主服务器和从服务器的数据没有完全同步。在从服务器断开连接后,PSYNC 命令将发送到主服务器,主服务器还将携带 RUNID 和 offset。
主服务器收到命令后,检查RUNID是否正确。它表明这可能是以前复制的。检查主服务器记录的offset 中是否仍存在 offset。
主服务器记录 offset 使用环形 buffer 。如果缓冲区已满,它将覆盖以前的记录。如果找到它,它将从报价的缺失部分开始,并向从服务器发送相应的修改命令。如果未找到从环形 buffer,则只能使用完全复制模式再次复制主缓冲区和从缓冲区。
五、主从复制的不足
1、一旦主节点发生故障,Redis 主从模式不具备自动容错和恢复功能,Redis集群将无法工作,需要手动将从节点升级为主节点,同时,需要修改应用程序的主节点地址。还需要命令其他从节点复制新的主节点。整个过程需要人工干预。
2、主节点的写和存储受单机限制。
3、如果同步的数据量很大,可能会导致卡滞现象。
4、如果主机宕机前有一部分数据未能及时同步到从机,即使切换主机后也会造成数据不一致的问题。
总结
本文讲解Redis高可用之Cluster主从模式详解,首先讲解什么是主从复制,主从复制主要的作用,Redis主从模式三种常见的拓扑结构,一主一从、一主多从、树状主从。
Redis的主从复制原理,两种主从数据同步的方式的原理,全量复制原理和部分复制原理,最后总结主从复制的不足。