Redis【一】Redis主从复制原理

Redis【一】Redis主从复制原理
Redis【二】Redis哨兵模式原理

主从同步过程

如上图所示展示了Redis主从复制的主要过程

  1. 在slave节点上配置replicaof(老版本是slaveof) {主节点IP:Port}
  2. slave节点发现master节点配置有变更,就尝试与master节点建立socket连接
  3. slave发送ping,如果没有及时收到master的pong,slave会1s重试一次
  4. slave发送权限验证
  5. slave节点向master节点发送sync/psync命令,如果是psync命令,master节点会根据psync的offset参数决定是部分还是全量同步(首次连接时一般都会是全量同步,断线重连的话可能会是部分同步),master节点执行bgsave,把全量rdb数据通过socket的方式传给slave节点
  6. master在执行basave的时候会把之后的接收处理的所有写命令写入到副本客户端缓冲区(缓冲区的大小由client-output-buffer-limit slave 配置),如果缓冲区超过了配置的缓冲区大小限制,master就会停止当前同步过程,当前同步就会失败。

Redis数据同步

Redis2.8之后支持psync,psync在同步阶段可以根据场景决定使用全量同步或部分同步。
使用部分同步的条件:

  • 主从节点各自复制偏移量
  • 主节点复制积压缓冲区
  • 主节点运行 ID
主从节点各自复制偏移量:

参与复制的主从节点都会维护自身的复制偏移量。
主节点在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info replication 中的 masterreploffset 指标中。
从节点每秒钟上报自身的的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量。
从节点在接收到主节点发送的命令后,也会累加自身的偏移量,统计信息在 info replication 中。
通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

主节点复制积压缓冲区:

复制积压缓冲区是一个保存在主节点的一个固定长度的先进先出的队列,默认大小 1MB。该配置由参数repl_backlog_size设置
这个队列在 slave 连接是创建。这时主节点响应写命令时,不但会把命令发送给从节点,也会写入复制缓冲区。
他的作用就是用于部分复制和复制命令丢失的数据补救。

主节点运行 ID:

每个 redis 启动的时候,都会生成一个 40 位的运行 ID。
运行 ID 的主要作用是用来识别 Redis 节点。如果使用 ip+port 的方式,那么如果主节点重启修改了 RDB/AOF 数据,从节点再基于偏移量进行复制将是不安全的。所以,当运行 id 变化后,从节点将进行全量复制。也就是说,redis 重启后,默认从节点会进行全量复制。

psync命令的格式是psync {masterrunid} {offset}
master如果判断slave发送的offset还在复制积压缓冲区中,就会返回+CONTINUE进行部分复制,否则会返回+FULLRESYNC {runId} {offset} 进行全量复制。

全量复制

全量复制流程图
  1. slave向master发送psync命令
  2. master发现offset已经不在复制积压缓冲区,就返回FullReSync {runId} {offset} 准备执行全量同步
  3. slave保存master的runI offset信息
  4. master执行basave保存的rdb数据,slave把接收到的rdb文件写入磁盘上。
    redis支持无盘复制(repl-diskless-sync设置为true),另外可以通过repl-diskless-sync-delay 5设置延迟5秒执行bgsave,这样可以等待更多的slave sync请求,就可以多个slave使用同一个rdb文件,否则的话其他的slave需要等当前bgsave结束之后才能执行同步操作。
    master执行bgsave之后会把之后的所有写命令放入复制网络缓冲区,该大小由参数client-output-buffer-limit slave设置。
  5. master向slave发送rdb数据
  6. master把刚才复制网络缓冲区中的写命令发送给slave
  7. slave清空当前实例中的数据
  8. slave加载master发来的rdb文件

部分复制

部分复制流程图
  1. slave与master断开连接
  2. master持续把接收到的写命令写入复制挤压缓冲区(repl-backlog-buffer)
  3. slave与master重新连接
  4. slave发送psync {offset} {runid} runid是slave中记录的master的runid
  5. master收到psync命令,比对runid与当前运行实例的runid相同,offset还在repl-bakclog-offset中,可以部分复制,就返回lsave CONTINUE
  6. 根据slave的offset发送slave缺失的命令
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容