首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏学习

    【redis】主从复制:拓扑结构、原理和psync命令解析

    后续再有数据变化,继续进行同步 psync 命令 redis 提供了一个 psync 命令,完成数据同步的过程 不需要我们手动执行,redis 服务器会在建立好主从同步关系之后,自动执行 psync 从节点负责执行 pysnc,从节点从主节点这边拉取数据(从节点主动要,而不是主节点主动给) 语法格式为: PSYNC replicationid offset 命令解析 replicatonid replicationid 如果分行的订单数量 offset 比总行的少,那就说明还没同步完成 运行流程 FULLRESYNC:全量数据的同步 CONTINEU:增量数据的同步 ERR:比较老版本的 redis 服务器不支持 psync (可以用 sync,会阻塞 redis 服务器) psync 这里可以从主节点获取全量数据,也可以获取一部分数据,主要就是看 offset 这里的进度 offset 写作 -1,就是获取全量数据

    18510编辑于 2025-03-24
  • 来自专栏廖可知的专栏

    Redis 4.0 PSYNC2中second_replid_offset探究

    Redis 4.0起引入了PSYNC2同步方式,分析源码时我们注意到,server数据中增加了replid2、second_replid_offset两个成员。 PSYNC2用以提高特定情况下的从机数据同步效率。比如对于以下拓补 A + | +---+ | | v v B C A为master,A同步数据到B、C。 在过去C需要做一次数据全同步才能重新提供服务;而支持PSYNC2后,C大概率只需要从B同步最新的自己还没有接收到的数据即可,就好像自己的master还是A,只是短暂掉线重连了一样。 PSYNC2相关的详细资料网络上已有很多,本文不再赘述。 上面提到,C大概率只需要从B同步最新的自己还没有接收到的数据,那就意味着有些情况下C还是需要全同步B的的。 因为A之前的最新数据偏移为250,所以发送PSYNC指令请求从251开始部分同步数据。如果B不做判断从251位置开始给A发送数据,很显然A中201-250这一段数据将与B、C中 的不一致。

    1.1K60发布于 2018-07-25
  • 来自专栏技术成长

    Redis复制过程中的部分重同步以及PSYNC命令的实现原理和过程

    具体步骤如下:从主节点发送一个PSYNC命令给从节点,表示要执行部分重同步。从节点根据自身是否具有复制积压缓冲区来确定采用何种方式进行同步。 从节点会向主节点发送一个PSYNC命令,携带上次复制的偏移量offset和复制积压缓冲区的内容。

    PSYNC命令的实现原理PSYNC(Partial synchronization)命令是Redis中用于复制的一种命令,其实现原理如下:当从节点(slave)首次连接到主节点(master )时,从节点向主节点发送一个PSYNC命令以请求进行复制。 PSYNC命令在复制过程中的作用初始化复制:当从节点刚连接到主节点时,PSYNC命令用于请求进行复制,并触发主节点执行全量复制或部分复制的流程。

    1.2K81编辑于 2023-09-27
  • Redis持久化与高可用深度解析:主从复制源码全揭秘,从PSYNC到复制风暴

    增量同步则依赖于PSYNC机制。从节点会携带复制偏移量和主节点运行ID发起PSYNC命令。 PSYNC命令揭秘:增量同步的智能优化 在Redis的主从复制机制中,PSYNC(Partial Synchronization)命令是实现增量同步的核心组件,它通过智能化的偏移量管理和数据重同步策略, PSYNC命令的基本工作原理可以概括为“偏移量比对与部分重传”。 PSYNC命令的实现还涉及对复制协议版本的兼容性处理。 对于PSYNC的优化,确保主从节点的Redis版本一致性(建议使用6.2或更高版本以支持改进的PSYNC2协议),可以减少兼容性问题导致的同步失败。

    16710编辑于 2025-11-28
  • 来自专栏CSDN搜“看,未来”

    【redis源码学习】从源码角度看主从复制(3):全量同步 && 部分同步

    ", psync_replid, psync_offset); } else { serverLog(LL_NOTICE,"Partial resynchronization ; memcpy(psync_offset,"-1",3); } /* Issue the PSYNC command */ reply = sendSynchronousCommand(SYNC_CMD_WRITE,conn,"PSYNC",psync_replid,psync_offset,NULL); if (reply psync_result = slaveTryPartialResynchronization(conn,1); if (psync_result == PSYNC_WAIT_REPLY) return == PSYNC_TRY_LATER) goto error; /* Note: if PSYNC does not return WAIT_REPLY, it will take care

    55310编辑于 2022-01-10
  • 来自专栏CSDN搜“看,未来”

    【redis源码学习】从源码角度看主从复制(2):主从之间的“三次握手”

    * PSYNC2: supports PSYNC v2, so understands +CONTINUE <new repl ID>. ,1); if (psync_result == PSYNC_WAIT_REPLY) return; /* Try again later... */ /* If the master == PSYNC_TRY_LATER) goto error; /* Note: if PSYNC does not return WAIT_REPLY, it will take care Otherwise psync_result == PSYNC_FULLRESYNC * and the server.master_replid and master_initial_offset 12 /* Send PSYNC */ #define REPL_STATE_RECEIVE_PSYNC 13 /* Wait for PSYNC reply */ /* --- End of handshake

    69320编辑于 2022-01-10
  • 来自专栏天罡gg

    Redis主从复制原理(面试说这么多够不够?)

    — 二、主从复制全流程 Slave和Master建立socket长连接 Slave发psync命令给Master Master根据psync参数决定是全量复制,还是部分复制(断点续传) 如果全量复制:Master ,它都会发送一个psync [runId] [offset]命令给master请求复制数据。 (redis2.8之前使用sync,sync只支持全量复制,而psync支持全量和部分复制) runId:每个redis节点启动都会生成唯一的uuid,每次redis重启后,runId都会发生变化。 master响应psync 命令 对于Slave发送的psync [runId] [offset]命令,Master有三种响应: FULLRESYNC:进行全量复制 CONTINUE:进行部分复制 (断点续传) ERR:不支持psync命令,进行全量复制 全量复制 全量复制发生的两种情况: 第一次连接,Slave发送的是psync ?

    62120编辑于 2022-12-02
  • 来自专栏蓝天

    REdis主从复制之repl_backlog

    从节点向主节点发送命令PSYNC,触发部分复制。有关REdis主从复制的细节,请参见《REdis复制研究》。 2.   */ // 被masterTryPartialResynchronization调用 // 而masterTryPartialResynchronization被syncCommand调用(对应命令PSYNC  0; } serverLog(LL_DEBUG, "[PSYNC] Backlog size: %lld", server.repl_backlog_size); serverLog(LL_DEBUG , "[PSYNC] First byte: %lld", server.repl_backlog_off); serverLog(LL_DEBUG, "[PSYNC] History len: %lld (server.repl_backlog_size - j) : len; serverLog(LL_DEBUG, "[PSYNC] addReply() length: %lld", thislen)

    2.5K30发布于 2019-06-11
  • 来自专栏Java架构学习路线

    上次阿里面试问到Redis主从复制原理,这次终于搞明白了!

    数据同步 redis 2.8 之前使用sync [runId] [offset]同步命令,redis2.8之后使用psync [runId] [offset]命令。 执行流程 从节点发送psync [runId] [offset]命令,主节点有如下响应 FULLRESYNC:第一次连接,进行全量复制 CONTINUE:进行部分复制 ERR:不支持psync命令,进行全量复制 全量复制流程 1)从节点发送psync ? 部分复制流程 1)部分复制主要是Redis针对全量复制的过高开销做出的一种优化措施,使用psync {runId}{offset}命令实现。 因此会把它们当做psync参数发送个主节点,要求进行部分复制操作。

    1.2K00发布于 2019-10-30
  • 来自专栏全栈程序员必看

    redis主从同步方式(redis数据同步原理)

    psync ? master接收到psync命令后会进行BGSAVE命令生成RDB文件快照。 生成完后,会将RDB文件发送给slave。 master收到psync后会返回+continue回复,表示slave可以执行部分同步了。 master发送断线后的写命令给slave slave执行写命令。 实际上当slave发送psync命令给master之后,master还需要根据以下三点判断是否进行部分同步。 结合以上三点,我们又可以总结下: 当slave断开重连后,会发送psync 命令给master。

    5.8K30编辑于 2022-08-01
  • 来自专栏数字化之路

    Redis持久化与主从同步:亿级流量背后的数据生存之道

    当从节点首次连接主节点,或复制ID不匹配时触发) 关键步骤解析: PSYNC握手:Slave发送PSYNC ? -1 Master启动后台进程生成 RDB快照 RDB发送给Slave载入 + 缓存期间新命令(Replication Buffer) Slave加载后达到与Master一致状态 图中“PSYNC ? PSYNC <replicationid> <offset>中 <replicationid>:主节点的唯一身份ID(类似数据库的"复制版本号") <offset>:从节点已复制的数据位置(类似读书的" 支持部分重同步 引入复制ID和offset机制 注:能使用PSYNC命令时,就不要使用SYNC。 PSYNC 6a8fe... 17562 # Master响应: +CONTINUE   # 增量同步 OR +FULLRESYNC # 需全量同步 自动愈合:当slave_repl_offset

    36300编辑于 2025-06-09
  • 来自专栏小L的魔法馆

    ndn挖坑记(完)

    相关工作 有许多实现方案,比如iHEMS[1]^{[1]}[1],COPSS[2]^{[2]}[2],HoPP[3]^{[3]}[3],PSync[4]^{[4]}[4],SPIT[5]^{[5]}[5 ],psync-notify Interest[6]^{[6]}[6]等等。 简单记录一下PSync,这是在NDN上实现的数据同步协议,主要有两种情况:1.full-data synchronization;2.partial-data synchronization。 PSync 代码:https://github.com/named-data/PSync BF:https://github.com/ArashPartow/bloom data structure Invertible Bloom Filter(BF),也叫布隆过滤器,用来表示部分同步模式下一个消费者的订阅列表信息,PSync中的BF是修改过以适应NDN的; BF具体是利用多个哈希函数将元素映射到位数组中,支持查询和插入操作

    74020发布于 2020-06-11
  • 来自专栏程序员的成长之路

    一文搞定 Redis 复制(全会的举个手看看)

    redis 同步有 2 个命令:sync 和 psync,前者是 redis 2.8 之前的同步命令,后者是 redis 2.8 为了优化 sync 新设计的命令。 我们会重点关注 2.8 的 psync 命令。 6、psync命令的使用方式 命令格式为 psync{runId}{offset} runId:从节点所复制主节点的运行 id offset:当前从节点已复制的数据偏移量 7、psync执行流程 ? 主要是针对 psync 命令相关之间的介绍。 三、全量复制 全量复制是 Redis 最早支持的复制方式,也是主从第一次建立复制时必须经历的的阶段。触发全量复制的命令是 sync 和 psync。 流程如下: Step 1:发送 psync 命令(spync ?

    51840发布于 2019-06-14
  • 来自专栏以Java架构赢天下

    Redis的主从复制原理

    为了解决旧版复制功能在处理断线重复制情况时的低效问题,redis从2.8开始使用PSYNC命令代替SYNC命令来执行复制时的同步操作。 下图可以形象地反映PSYNC命令下重复制过程: ? PSYNC命令的具体实现 PSYNC命令的调用方法有两种: ·如果从服务器以前没有复制过任何主服务器,或者之前执行过slaveof no one命令,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC 根据情况,接收到PSYNC命令的主服务器会向从服务器返回以下三种回复之一: ·主服务器返回:+FULLRESYNC 。 表示主服务器版本低于2.8,它识别不了PSYNC命令。之后从服务器将发送sync命令,与主服务器执行完整重同步操作。

    2.1K10发布于 2020-02-13
  • 来自专栏技术知识总结

    Redis的数据复制

    从服务器对主服务器的完整重同步操作,需要通过向主服务器发送 psync 命令来完成。psync 的命令为:psync ? -1---psync 命令在完整重同步模式下的的执行步骤:让主服务器创建并发送 RDB 文件,以及主服务器向从服务器发送保存在缓冲区里面的写命令来进行同步。从服务器向主服务器发送 psync 命令。 ---从服务器对主服务器的部分重同步操作,需要通过向主服务器发送 psync 命令来完成。 psync 命令为:psync < runID > < offset >图片psync 命令从服务器对主服务器的同步操作,需要通过向主服务器发送 psync 命令来完成。 ---psync 命令的调用方法有两种:如果从服务器以前没有复制过任何主服务器,或者之前执行过 slaveof no one 命令,那么从服务器在开始一次新的复制时将向主服务器发送 psync ?

    1.1K30编辑于 2022-12-21
  • 来自专栏码农沉思录

    深入Redis 主从复制原理

    redis 同步有 2 个命令: sync 和 psync,前者是 redis 2.8 之前的同步命令,后者是 redis 2.8 为了优化 sync 新设计的命令。 我们会重点关注 2.8 的 psync 命令。 psync 命令的使用方式: 命令格式为psync{runId}{offset} runId:从节点所复制主节点的运行 id offset:当前从节点已复制的数据偏移量 psync 执行流程 主要是针对 psync 命令相关之间的介绍。 3.全量复制 全量复制是 Redis 最早支持的复制方式,也是主从第一次建立复制时必须经历的的阶段。触发全量复制的命令是 sync 和 psync。 介绍一下上图步骤: 1、发送 psync 命令(spync ?

    1K20发布于 2019-05-05
  • 来自专栏数据库相关

    Linux下 fio磁盘压测笔记

    ioengine=psync io引擎使用pync方式 ,此外还有libaio 异步方式。 group_reporting -name=test-rand-write 采用同步IO的随机写: fio --filename=/root/rndwrite -iodepth=64 -ioengine=psync 16 --numjobs=16 --runtime=60 --group_reporting --name=8k7030test 在阿里云SSD测试时候,使用libaio方式能达到较高的IOPS,使用psync 从网上其他测试数据来看,异步的libaio比同步的psync方式性能高15倍左右。 2 psync同步模式随机写入5G数据 测试命令: fio --filename=/root/rndwrite -iodepth=64-ioengine=psync -direct=1 -rw=randwrite

    7.9K30发布于 2019-09-18
  • 来自专栏Redis存储

    Redis源码阅读(五)主从复制与哨兵机制

    (4)连接建立后,从节点向主节点发送psync命令请求同步数据,主节点将所有数据发送给从节点(数据同步)。 主服务器处理psync命令的入口函数为syncCommand。 【Redis 2.8 之后使用 psync [runId] [offset] 命令;支持全量和部分复制; Redis 4.0针对主从复制又提出了两点优化,提出了psync2协议】 psync2 他的好处在于 因此会把它们当做 psync 参数发送给主节点,要求进行部分复制。 4⃣️ 主节点接收到 psync 命令后首先核对参数 runId 是否与自身一致,如果一致,说明之前复制的是当前主节点。 server.repl_backlog || psync_offset < server.repl_backlog_off || psync_offset > (server.repl_backlog_off = buflen) { } //向客户端发送复制缓冲区中的命令请求 psync_len = addReplyReplicationBacklog(c,psync_offset);

    84310编辑于 2022-01-28
  • 来自专栏华章科技

    Redis如何高效可靠地实现主从复制?终于有人讲明白了

    从服务器请求同步主服务器的命令也改为了psync。 主服务器接收到psync命令时,需要判断命令参数运行ID与自己的运行ID是否相等,只有相等才有可能执行部分重同步。 从上面的分析我们可以得到psync命令格式为“psync <MASTER_RUN_ID> <OFFSET>”,主从复制初始化流程如图1所示。 这时显然是无法执行部分重同步的,而这两种情况又很常见,因此Redis 4.0针对主从复制又提出了两点优化,提出了psync2协议。 M_ID psync_offset”请求;显然根据上面条件,只要psync_offset满足条件,就可以执行部分重同步。

    64420发布于 2019-10-31
  • 【Redis系列】主从复制

    Redis 使⽤psync命令完成主从数据同步 psync replicationid offset replicationid(复制ID) :主节点生成的唯一标识,用于标识数据集的特定历史版本。 从节点发送psync命令给主节点 主节点根据psync参数和自身情况响应结果: 如果回复+FULLRESYNC replid offset,则从节点需要进⾏全量复制流程 如果回复+CONTINEU,从节点进 从节点可以使⽤sync命令进⾏全量复制(psync Redis会在主从复制模式下⾃动调⽤执⾏; sync会阻塞redis-server处理其他请求.psync则不会) 全量复制 ⼀般⽤于初次复制场景,Redis 从节点发送psync命令给主节点进主节点行数据同步,由于第一次进行复制,从节点没有主节点的replicationid和offset,所以发送psync ? 当主从节点⽹络恢复后,从节点再次连上主节点 从节点将之前保存的replicationId和offset作为psync的参数发送给主节点,请求进⾏部分复制 主节点接到psync请求后,进⾏必要的验证。

    9910编辑于 2026-01-15
  • 领券