redis 主从复制代码学习 - SLAVE 部分

本文代码基于 redis 4.0.14 版本,主要涉及PSYNC协议相关。

0. 一图胜千言

1. 在 SLAVE 上执行 slaveof 命令

通过查询server.commands找到处理该命令的函数为void slaveofCommand(client *c)

  1. L2014 如果参数为 no one,那么取消之前的同步,将状态设置为 MASTER;
  2. L2026 如果发送该命令的 client,本身就是 SLAVE,那么返回错误;
  3. L2039 如果命令中同步的地址与 redis 正在同步的地址相同,那么直接返回;
  4. L2047 设置同步的地址。
  1. L1943-1944 设置需要连接的 MASTER 地址;
  2. L1945 如果当前连接另外一个 MASTER,那么断开连接;
  3. L1952 如果当前有 SLAVE,那么断开连接;
  4. L1953 取消复制流程中的握手任务;
  5. L1956 如果本身是 MASTER,那么将信息保存到cached_master
  6. L1957 最后将repl_state设置为REPL_STATE_CONNECT

至此 slaveof 命令执行完毕。

2. SLAVE 上的 replicationCron 定时任务

slaveof 命令只是设置了信息和状态,接下来 redis 的定时任务serverCron会以每秒一次的频率执行replicationCron

在执行 slaveof 命令之后,repl_stateREPL_STATE_CONNECT

L2554 向设置的 MASTER 地址发起连接。

建立连接,监听读写事件,将repl_state设置为REPL_STATE_CONNECTING

3. 与 MASTER 建立连接之后

连接建立之后会回调syncWithMaster函数:

L1609 如果 socket 有问题,那么关闭连接,返回REPL_STATE_CONNECT状态。

L1617-1626 将状态置为REPL_STATE_RECEIVE_PONG,向 MASTER 同步发送 PING 命令,如果失败也退回REPL_STATE_CONNECT状态。

验证接收到的 PONG 响应,如果有认证的需要,那么再加上 AUTH 过程,如果请求响应正常,那么状态置为REPL_STATE_SEND_PORT

接下来发送 REPLCONF listening-port,如果有配置slave_announce_ip再发送 REPLCONF ip-address,如果一切正常,那么状态置为REPL_STATE_SEND_CAPA

接下来向 MASTER 发送自身支持的特性,最后状态置为REPL_STATE_SEND_PSYNC

L1769 在slaveTryPartialResynchronization方法中向 MASTER 发送 PSYNC 命令,参数read_reply为0时,发送 PSYNC 命令;参数read_reply为1时,读取响应。

发送PSYNC命名,psync_replid默认为"?",psync_offset默认为"-1",如果本地有之前缓存的,那么用之前的信息。

读取 PSYNC 的响应,如果为空继续等待。

如果返回+FULLRESYNC,那么需要全同步,解析replid和offset信息。

如果返回+CONTINUE,那么可以增量同步,这里为了 sub-slaves 在重连之后可以继续增量同步,增加了 replid2 这个参数,具体细节这里暂且略过。

L1547 replicationResurrectCachedMaster函数设置server.master的信息,状态置为REPL_STATE_CONNECTED。

L2240 注册readQueryFromClient函数,用于处理收到的增量数据。(该函数的具体细节暂且略过)

如果返回错误,如果是可恢复的,返回PSYNC_TRY_LATER重试,如果是不可恢复的,返回PSYNC_NOT_SUPPORTED。

L1797 如果可以增量同步,直接返回。

L1835 如果是全量同步,注册readSyncBulkPayload函数用于接收处理 RDB。(该函数的具体细节暂且略过)

如果接收 RDB 正常,最终状态置为 REPL_STATE_CONNECTED,在replicationCreateMasterClient函数中也会注册readQueryFromClient函数,用于处理收到的增量数据。

4. 再回到 replicationCron

  1. L2528 与 MASTER 建立 socket 之后,如果超过server.repl_timeout阈值没有进行下一步 PING PONG,那么关闭连接,退回 REPL_STATE_CONNECT 状态。
  2. L2536 做全同步传输 RDB 期间,如果超过server.repl_timeout阈值没有收到数据,那么关闭连接,退回 REPL_STATE_CONNECT 状态。
  3. L2544 做增量同步期间,如果超过server.repl_timeout阈值没有收到数据,那么关闭连接,退回 REPL_STATE_CONNECT 状态。

L2564 周期性向 MASTER 发送 REPLCONF ACK。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • 浅谈Redis主从复制 2013.09.27 11:27:00 来源: 京东 作者:张成远 ( 0 条评论 )...
    epime阅读 558评论 0 2
  • 搭建环境 为了测试Redis主从复制功能,需要在本地启动master和slave两个Redis实例。这里使用doc...
    yingzong阅读 2,520评论 1 5
  • 本篇就一下方面展开分析 如何使用主从复制? 主从复制的原理(重点是全量复制和部分复制、以及心跳机制) 实际应用中需...
    lucode阅读 985评论 0 5
  • 系列 redis数据淘汰原理redis过期数据删除策略redis server事件模型redis cluster ...
    晴天哥_王志阅读 8,181评论 0 1
  • 2017年4月16日 星期二 今天下午第三节课是语文课,我要讲《水浒传》。这是我第一次讲,没有前人的经验,我开始...
    丽娟_04b1阅读 473评论 0 1