redis源码分析(六):主从复制

主从数据库配置用来降低单个redis的压力(主要是master的读压力)。通常的方案是master用做数据写入,slave用做数据读取。
下面看看主从复制的功能是如何实现的,首先需要在slave服务上配置master的ip端口(slaveof host port),可选项数据库密码(masterauth)。
也可以起一个客户端连接slave发送slaveof host port 命令,相应的取消命令是slaveof no one。

一个slave接收到slaveof命令以后经历一下过程。

  • 1.与原有的master 断开连接,取消同步操作。

  • 2.设置当前的服务为slave,记录master的地址信息。将server.repl_state置为REDIS_REPL_CONNECT;

  • 3.在下个时间事件中调用事件周期函数replicationCron,检测repl_state的值,执行连接master操作。连接失败则后续重复步骤3。

  • 4.发一个ping命令证明master是能正常提供服务的,认证密码,发送replconf命令,告知master本slave监听端口。

  • 5.发送“psync ? -1”命令获取全量获取master上的rdb数据,如果不支持psync,那么可能是早期版本,发送sync命令。

  • 6.将拿到的rdb文件存储下来,删去slave上原有的数据,加载rdb文件到内存中,这一步和redis启动的过程一致。

至此,复制流程完成,如果master上有新的数据更新,master会主动调用replicationFeedSlaves函数将增量数据发送给他的所有slave。这么看master相当于slave的客户机了。
我们默认不能往slave上直接执行写操作,slave会返回一个read-only的错误,当然我们可以使用"config set slave-read-only yes"命令启用slave的写功能, 但是这些数据不会被同步到master及其其他从属的slaves上。

以上我们是以slave的角度观察这个操作,下面我们将以master的角度再次走查这个流程,主要是psync命令。

  • 1.根据slave发来的runid判断是否需要fullsync。其中runid是master启动时随机生成的字符串。

  • 2.将该slave加入server.slaves列表,并将它的replstate置为REDIS_REPL_WAIT_BGSAVE_END,开启一个bgsave来保存rdb文件,(如果已经在bgsave了就跳过)

  • 3.bgsave完成以后,循环便利所有状态为REDIS_REPL_WAIT_BGSAVE_END的节点,将rdb文件发送给他们。

  • 4.周期性发送心跳,断开超时的slave。

master上bgsave期间的客户端发来的数据如何同步到slave?。sync命令执行之前,需要确保slave的消息缓存是空的,在全量同步到数据之前,发送到该slave上的数据均会被缓存,不会触发aeCreateFileEvent,等同步完成了以后,会触发一个可写事件将缓存发送出去。

至此,slave从master拉取数据完毕。后续如果客户端有写操作了,master执行完客户端的写操作请求以后,会将命令传播给他的从机,从而保证数据一致性。

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

推荐阅读更多精彩内容

  • 在Redis的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重...
    不变甄心阅读 1,493评论 0 5
  • 本篇就一下方面展开分析 如何使用主从复制? 主从复制的原理(重点是全量复制和部分复制、以及心跳机制) 实际应用中需...
    lucode阅读 988评论 0 5
  • 浅谈Redis主从复制 2013.09.27 11:27:00 来源: 京东 作者:张成远 ( 0 条评论 )...
    epime阅读 564评论 0 2
  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,034评论 1 51
  • 搭建环境 为了测试Redis主从复制功能,需要在本地启动master和slave两个Redis实例。这里使用doc...
    yingzong阅读 2,548评论 1 5