`
woodding2008
  • 浏览: 285880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Redis复制策略

 
阅读更多

       在Redis中,用户可以通过执行SLAVEOF命令或设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则称为从服务器(slave)。假设有两个Redis实例,127.0.0.1:6379和127.0.0.1:6380,6379设置为主,6380作为从,进行读写数据测试。

 

6380>SLAVEOF 127.0.0.1 6379
6379>SET key “test”
6380>GET key
6379>DEL key
6379>EXISTS key
6380>EXISTS key

 

SYNC同步

        SYNC是Redis2.8以前使用的同步机制,当客户端向从服务发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,将从服务器的数据库状态更新至主服务器当前所处的数据库状态。

      从服务队主服务器的同步操作需要向主服务器发送SYNC命令来完成,以下是SYNC命令执行的步骤:

  • 从服务器向主服务器发送SYNC命令
  • 收到SYNC服务器命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
  • 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
  • 主服务器将记录在缓冲区里面的所有写命令发送给从服务,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。

命令传播

       在SYNC命令同步操作完成之后,主从服务器两者的数据达到一致的状态,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务的数据库就有可能会被修改,并导致主从服务器状态不再一致。

       为了让主从服务器再次回到一致状态,主服务需要对从服务器执行命令传播操作,主服务器会将自己执行的写命令,发送给从服务器执行,当从服务执行之后,主从再次回到一致状态。

 

SYNC复制功能缺陷

        Redis2.8以前主从服务器复制可以分为以下两种情况:

  • 初次复制,从服务器以前没有父之过任何主服务器,或者从服务器当前要复制的主服务器和上一次复制的主服务器不同。
  • 断线后重复制,处于命令传播阶段的主从服务器因为网络原因造成了中断复制,但从服务器通过自动重连接上了主服务器,并继续复制主服务器。

      对于初次复制来说,复制功能能够很好的完成任务,但对于短线后重复制来说,复制功能虽然能让主从服务器重新回到一致状态,但效率非常低,过程见下面表格。

       在时间T10091,从服务器终于重新连接上主服务器,因为这是主从服务器状态已经不再一致,所以从服务器将向主服务器发送SYNC命令,而主服务器会将包含k1至k10089的RDB文件发送给从服务器,从服务器通过接收和载入这个RDB文件来讲自己的数据库更新至主服务器当前所处的状态。

      虽然在此执行SYNC命令能让数据重新回到一致状态,实际上这个断线重连的复制过程成本很高,同步RDB文件并非是优秀的设计。

  • 主从服务器在时间T0至T10086中一直处于一致状态,这两个服务器的数据大部分都是相同的。
  • 从服务器想要将自己更新至主服务器当前状态,真正需要的是主从服务器连接中断期间的数据。
  • 可惜的是,复制功能并没有这样做,而是让主服务器重新执行了一遍BGSAVE。

     

PSYNC同步

      为了解决SYNC同步的问题,在Redis2.8以后使用PSYNC命令代替SYNC来执行复制时的同步操作。

      PSYNC命令具有完整同步(full resynchronization)和部分重同步(partial resynchronization)两种模式。

  • 完整重同步用于处理初次复制情况,完整重同步的执行步骤和SYNC命令的执行步骤基本一样,他们都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的命令来同步。
  • 部分重同步用户处理断线后重复制情况,当从服务器在断线后重新连接上主服务器时,如果条件允许,主服务器可以将从服务器连接断开期间的谢明令发送给从服务器,从服务器接收并执行这些写命令,就可以将数据库更新至主服务器当前所处状态。

PSYNC同步实现

       部分重同步功能由以下三部分构成:

  • 主服务的复制偏移量(replication offset)和从服务器的复制偏移量
  • 主服务器的复制积压缓冲区(replication backlog)
  • 服务器的运行ID(run ID)

复制偏移量

      执行复制的双方--主从服务器会分别维护一个复制偏移量

  • 主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量加上N
  • 从服务器每次收到主服务器传播来的N个字节数据时,就将自己的复制偏移量的值加上N。

 

复制积压缓冲区

      复制积压缓冲区是由主服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小为1MB。当主服务器进行命令传播是,它不仅会将写命令发送所有从服务器,还会将写命令入队列到复制积压缓冲区里面。

       因此,主服务器的复制积压缓冲区里面会保存着一部分最近传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。

       当从服务器重新连上主服务器时,从服务器会通过PSYNC命令将自己的复制偏移量offset发送给主服务器,主服务器会根据这个复制偏移量来决定从服务器执行何种同步操作:

  •  如果offset偏移量之后的数据(偏移量offset+1开始的数据)仍然在复制积压缓冲区里面,那么主服务器将对从服务器执行部分重同步操作。
  • 如果offset偏移量之后的数据已经不存在与复制积压缓冲区,那么主服务器对从服务器执行完整从同步操作。

 

服务器运行ID

      除了复制偏移量和复制积压缓冲区之外,实现部分重同步还需要用到服务器运行ID(run ID)。每个redis服务器,不论是主服务器还是从服务器,都会有自己的运行ID,运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成。

      当从服务器对主服务器进行初次复制时,主服务器会将自己运行ID发送给从服务器,从服务器会将这个ID保存起来。当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID。

  • 如果从服务器保存的运行ID和当前连接的主服务器运行ID相同,那么说明从服务器断线之前复制的就是当前连接的这个主服务器,主服务可以尝试执行部分重同步。
  • 如果从服务器保存的运行ID和当前连接的主服务器运行ID不相同,那么说明从服务器断线之前复制的主服务器并不是当前连接的这个主服务器,主服务器将对从服务器执行完整的重同步操作。

     

 

 

 

https://redis.io/topics/replication

 

  • 大小: 80.9 KB
  • 大小: 40.1 KB
  • 大小: 54.9 KB
  • 大小: 24.9 KB
分享到:
评论

相关推荐

    SSM项目-redis缓存策略和配置实现

    实现redis缓存策略和Spring集成redis配置 1.1 Redis是一个key-value存储系统,支持多种存储结构,如String,Hash,list,zset等; 1.2 Redis采用内存中数据集的形式,因此读写性能优异; 1.3 Redis支持数据持久化,支持...

    Redis面试专题.pdf

    2.redis 主从复制如何实现的?redis 的集群模式如何实现?redis 的 key 是如何寻址的? 3.使用 redis 如何设计分布式锁?说一下实现思路?使用 zk 可以吗?如何实现?这两种有什么区别? 4.知道 redis 的持久化吗?...

    redis面试复习.xmind

    # redis基础知识 ### redis为什么快 ### 单线程好处(为什么使用单线程): ...### Redis集群之间是如何复制的 ### 保证数据一致 # redis淘汰策略 ### 6种淘汰策略 ### 回收机制 # redis锁 ### 分布式锁

    Redis面试题50道(含答案)_.pdf

    6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些...

    Redis面试专题30道.zip

    6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些...

    深入剖析Redis主从复制.pdf

    Redis 策略是,无论如何,首先会尝试进行部分同步,如不成功,要求从机进行全同步,并启动 BGSAVE……BGSAVE 结束后,传输 RDB 文件;如果成功,允许从机进行部分同步,并传输积压空间中的数据。

    Redis从入门到精通视频.rar

    48-redis-redis的主从复制-设置主从关系、全量复制、增量复制.avi 49-redis-redis的主从复制-读写分离、主机宕机.avi 50-redis-redis的主从复制-从机宕机.avi 51-redis-redis的主从复制-主机宕机、从机上位.avi 52-...

    Java面试redis.zip

    Redis 介绍 Reids常用5种数据类型 ...Redis 集群的主从复制模型是怎样的? Redis 集群会有写操作丢失吗?为什么? Redis 集群之间是如何复制的? Redis 集群最大节点个数是多少? Redis 集群如何选择数据库?

    Java面试redis.pdf

    Redis 介绍 Reids常用5种数据类型 ...Redis 集群的主从复制模型是怎样的? Redis 集群会有写操作丢失吗?为什么? Redis 集群之间是如何复制的? Redis 集群最大节点个数是多少? Redis 集群如何选择数据库?

    2023年Redis缓存面试题目汇总

    你如何理解Redis的复制?它有什么作用? Redis的集群是如何实现高可用的? 你如何保证Redis的安全性? 你如何优化Redis的性能? 在什么情况下你会使用Redis事务? Redis事务的ACID性质是什么? Redis的Lua脚本有什么...

    大家都应该知道的Redis过期键与过期策略

    过期键的过期策略是怎样的 RDB、AOF 和复制对过期键的处理又是怎样的 设置键的生存时间或过期时间 redis 一共有 4 个命令来设置键的生存时间(可以存活多久)或过期时间(什么时候被删除) expire <key> <ttl>:...

    Redis面试题.pdf

    6. 什么是Redis的主从复制(Replication)?它的作用和实现原理是什么? 7. Redis中的LRU淘汰策略是什么?它如何应对内存溢出的情况? 8. Redis中的事务是如何实现的?请说明Redis事务的特点和使用方式。 9. Redis...

    Redis特性和应用场景

    由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。数据超过内存,使用swap,保证数据; memcacache不能持久化,mongo是部分在内存; 自动...

    Redis的复制(MasterSlave)

    也就是我们所说的主从复制,主机数据更新后根据配置和策略自动同步到备机的master/slave机制,Master以写为主,Slave以读为主。 2.能干嘛 2.1读写分离 2.2容灾恢复 3.怎么玩 3.1配从(库)不配主(库) 3.2从库配置:...

    Redis入门到精通视频教程

    视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程内容: 01_redis入门 ...08_删除策略 09_redis服务器配置 10_高级数据类型 11_主从复制 12_哨兵模式 13_cluster 14_企业级解决方案

    60道关于Redis的常见面试题.pdf

    Redis 的数据淘汰策略有哪些?分别是如何工作的? - 7. 什么是 Redis 事务?它是如何实现的?与传统数据库事务有何不同? - 8. 如何设置 Redis 的主从复制?主从复制有什么优势和限制? - 9. Redis 支持的数据结构...

    redis-4.0.10 for linux CSDN下载

    包含几项重大改进:模块系统,更好的复制(PSYNC2),对驱逐策略的改进,线程DEL / FLUSH,混合RDB + AOF格式,Raspberry Pi支持作为主要平台,新的MEMORY命令,Redis Cluster支持Nat / Docker,活动内存碎片整理,...

    Redis V3.0 中文文档

    第 1 章Redis 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...

    redis面试题热门20道以及解析

    问题触及了Redis的性能优势、单线程模型、主从复制、集群架构、内存淘汰策略、分布式锁实现、发布/订阅模式等,旨在评估候选人对Redis实际应用和潜在问题的理解和解决能力。掌握这些知识点对于构建高效、可靠的数据...

Global site tag (gtag.js) - Google Analytics