Redis:浅谈Redis集群的复制原理

2024-09-02 06:52

本文主要是介绍Redis:浅谈Redis集群的复制原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Redis的集群方案

主从复制集群:手动切换的主从复制集群、带有哨兵的HA的主从复制集群。
分片集群:客户端实现路由索引的分片集群、使用中间件代理层的分片集群、Redis自身实现的Cluster分片集群。

二、Redis主从复制的原理

1、主从复制机制

当一个master实例和一个slave实例连接正常时, master 会发送一连串的命令流来保持对slave的更新,以便于将自身数据集的改变复制给 slave , 包括客户端的写入、key的过期或被逐出等等。

当master和slave之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave重新连接上master会尝试进行部分同步,这意味着它会尝试只获取在断开连接期间内丢失的命令流。

当无法进行部分重同步时, slave会请求进行全量重同步。这会涉及到一个更复杂的过程,例如master需要创建所有数据的快照,将之发送给 slave ,之后在数据集更改时持续发送命令流到slave。

2、主从复制的关注点

Redis使用异步复制:slave和master之间异步地确认处理的数据量。

一个master可以拥有多个slave,slave可以接受其他slave的连接。除了多个slave可以连接到同一个master之外,slave之间也可以像层叠状的结构(cascading-likestructure)连接到其他slave。自Redis4.0起,所有的sub-slave将会从master收到完全一样的复制流。

Redis复制在master侧是非阻塞的。这意味着master在一个或多个slave进行初次同步或者是部分重同步时,可以继续处理查询请求。

Redis复制在slave侧大部分也是非阻塞的。当slave进行初次同步时,它可以使用旧数据集处理查询请求,假设你在redis.conf中配置了让Redis这样做的话。在初次同步之后,旧数据集必须被删除,同时加载新的数据集。此外,你也可以配置如果复制流断开,Redis的slave会返回一个error给客户端。slave在这个短暂的时间窗口内(如果数据集很大,会持续较长时间),会阻塞到来的连接请求。自Redis4.0开始,可以配置Redis使删除旧数据集的操作在另一个不同的线程中进行,但是,加载新数据集的操作依然需要在主线程中进行并且会阻塞slave。

三、主从复制的具体过程

每一个Redis的master都有一个replicationID,这是一个较大的伪随机字符串,标记了一个给定的数据集。每个master也持有一个偏移量offset,master将自己产生的复制流发送给slave时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新slave的状态。偏移量offset即使在没有一个slave连接到master时,也会自增,所以基本上每一对给定的ReplicationID,offset都会标识一个master数据集的确切版本。

当slave连接到master时,它们使用PSYNC命令来发送它们记录的旧的master节点的replicationID和它们至今为止处理的偏移量。通过这种方式,master能够仅发送slave所需的增量部分。但是如果master的缓冲区中没有足够的命令积压缓冲记录,或者如果slave引用了不再知道的历史记录(replicationID),则会转而进行一个全量重同步:在这种情况下,slave会得到一个完整的数据集副本,从头开始。

下面是一个全量同步的工作细节:
master开启一个后台保存进程,以便于生产一个RDB文件。同时它开始缓冲所有从客户端接收到的新的写入命令。当后台保存完成时,master将数据集文件传输给slave,slave将之保存在磁盘上,然后加载文件到内存。再然后master会发送所有缓冲的命令发给slave。这个过程以指令流的形式完成并且和Redis协议本身的格式相同。

你可以用telnet自己进行尝试。在服务器正在做一些工作的同时连接到Redis端口并发出SYNC命令。你将会看到一个批量传输,并且之后每一个master接收到的命令都将在telnet回话中被重新发出。事实上SYNC是一个旧协议,在新的Redis实例中已经不再被使用,但是其仍然向后兼容:但它不允许部分重同步,所以现在PSYNC被用来替代SYNC。

之前说过,当主从之间的连接因为一些原因崩溃之后,slave能够自动重连。如果master收到了多个slave要求同步的请求,它会执行一个单独的后台保存,以便于为多个slave服务。

补充-无需磁盘参与的复制:正常情况下,一个全量重同步要求在磁盘上创建一个RDB文件,然后将它从磁盘加载进内存,然后slave以此进行数据同步。如果磁盘性能很低的话,这对master是一个压力很大的操作。Redis2.8.18是第一个支持无磁盘复制的版本。在此设置中,子进程直接发送RDB文件给slave,无需使用磁盘作为中间储存介质。

这篇关于Redis:浅谈Redis集群的复制原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129305

相关文章

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ