2019独角兽企业重金招聘Python工程师标准>>>

Redis的主从同步机制可以确保redis的master和slave之间的数据同步。按照同步内容的多少可以分为全同步和部分同步;按照同步的时机可以分为slave刚启动时的初始化同步和正常运行过程中的数据修改同步;本文将对这两种机制的流程进行分析。

全备份过程中,在slave启动时,会向其master发送一条SYNC消息,master收到slave的这条消息之后,将可能启动后台进程进行备份,备份完成之后就将备份的数据发送给slave,初始时的全同步机制是这样的:

(1)slave启动后向master发送同步指令SYNC,master接收到SYNC指令之后将调用该命令的处理函数syncCommand()进行同步处理;

(2)在函数syncCommand中,将调用函数rdbSaveBackground启动一个备份进程用于数据同步,如果已经有一个备份进程在运行了,就不会再重新启动了。

(3)备份进程将执行函数rdbSave()完成将redis的全部数据保存为rdb文件。

(4)在redis的时间事件函数serverCron(redis的时间处理函数是指它会定时被redis进行操作的函数)中,将对备份后的数据进行处理,在serverCron函数中将会检查备份进程是否已经执行完毕,如果备份进程已经完成备份,则调用函数backgroundSaveDoneHandler完成后续处理。

(5)在函数backgroundSaveDoneHandler中,首先更新master的各种状态,例如,备份成功还是失败,备份的时间等等。然后调用函数updateSlavesWaitingBgsave,将备份的rdb数据发送给等待的slave。

(6)在函数updateSlavesWaitingBgsave中,将遍历所有的等待此次备份的slave,将备份的rdb文件发送给每一个slave。另外,这里并不是立即就把数据发送过去,而是将为每个等待的slave注册写事件,并注册写事件的响应函数sendBulkToSlave,即当slave对应的socket能够发送数据时就调用函数sendBulkToSlave(),实际发送rdb文件的操作都在函数sendBulkToSlave中完成。

(7)sendBulkToSlave函数将把备份的rdb文件发送给slave。

上述函数调用过程如下图1所示:

图1 redis全备份时master部分的的函数调用过程

二、数据修改操作的同步

Redis的正常部署中一般都是一个master用于写操作,若干个slave用于读操作,另外定期的数据备份操作也是单独选址一个slave完成,这样可以最大程度发挥出redis的性能。在部署完成,各master\slave程序启动之后,首先进行第一阶段初始化时的全同步操作,全同步操作完成之后,后续所有写操作都是在master上进行,所有读操作都是在slave上进行,因此用户的写操作需要及时扩散到所有的slave以便保持数据最大程度上的同步。Redis的master-slave进程在正常运行期间更新操作(包括写、删除、更改操作)的同步方式如下:

(1)master接收到一条用户的操作后,将调用函数call函数来执行具体的操作函数(此过程可参考另一文档《redis命令执行流程分析》),在该函数中首先通过proc执行操作函数,然后将判断操作是否需要扩散到各slave,如果需要则调用函数propagate()来完成此操作。

(2)propagate()函数完成将一个操作记录到aof文件中或者扩散到其他slave中;在该函数中通过调用feedAppendOnlyFile()将操作记录到aof中,通过调用replicationFeedSlaves()将操作扩散到各slave中。

(3)函数feedAppendOnlyFile()中主要保存操作到aof文件,在该函数中首先将操作转换成redis内部的协议格式,并以字符串的形式存储,然后将字符串存储的操作追加到aof文件后。

(4)函数replicationFeedSlaves()主要将操作扩散到每一个slave中;在该函数中将遍历自己下面挂的每一个slave,以此对每个slave进行如下两步的处理:将slave的数据库切换到本操作所对应的数据库(如果slave的数据库id与当前操作的数据id不一致时才进行此操作);将命令和参数按照redis的协议格式写入到slave的回复缓存中。写入切换数据库的命令时将调用addReply,写入命令和参数时将调用addReplyMultiBulkLen和addReplyBulk,函数addReplyMultiBulkLen和addReplyBulk最终也将调用函数addReply。

(5)在函数addReply中将调用prepareClientToWrite()设置slave的socket写入事件处理函数sendReplyToClient(通过函数aeCreateFileEvent进行设置),这样一旦slave对应的socket发送缓存中有空间写入数据,即调用sendReplyToClient进行处理。

(6)函数sendReplyToClient()的主要功能是将slave中要发送的数据通过socket发出去。

图中的序号表示调用的先后关系,同级之间的序号才有意义。

转载于:https://my.oschina.net/LucasZhu/blog/1811438

Redis master和slave是如何实现数据同步的相关推荐

  1. 什么时候用redis什么时候用mysql_Redis和MySql数据同步以及Redis使用场景

    Redis和MySql的数据同步是我们开发中经常遇到的问题,怎么实现Redis和MySql之间的数据同步? 实际开发中我们经常采用如下方式实现Mysql和Redis数据同步: 当我们对MySQL数据库 ...

  2. oracle和redis关联查询,redis与oracle之间如何可以实现数据同步

    redis与oracle之间不能进行直接同步,关键还是看你的架构设计是否合适: 1,插入时同步,例如先更新了oracle,再对redis进行更新,这些需要通过代码逻辑实现.设计决定先后顺序. 2,查询 ...

  3. Redis Master/Slave 实践

    本次我们将模拟 Master(1) + Slave(4) 的场景,并通过ASP.NET WEB API进行数据的提交及查询,监控 Redis Master/Slave 数据分发情况,只大致概述,不会按 ...

  4. redis配置master-slave模式

    由于云服务器存在闪断现象,项目线上会存在基于redis的功能在闪断时段内出现异常,所以redis需要做master-slave模式.直接上代码: 原单机redis,RedisConnectionFac ...

  5. Redis 高可用篇:你管这叫主从架构数据同步原理?

    高可用有两个含义:一是数据尽量不丢失,二是服务尽可能提供服务. AOF 和 RDB 保证了数据持久化尽量不丢失,而主从复制就是增加副本,一份数据保存到多个实例上.即使有一个实例宕机,其他实例依然可以提 ...

  6. Redis 数据同步机制分析

    Redis的主从同步机制可以确保redis的master和slave之间的数据同步.按照同步内容的多少可以分为全同步和部分同步:按照同步的时机可以分为slave刚启动时的初始化同步和正常运行过程中的数 ...

  7. RocketMQ多Master多Slave模式部署

    每个 Master 配置一个 Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功. 优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性 ...

  8. canal+Kafka实现mysql与redis数据同步

    前言 上篇文章简单介绍canal概念,本文结合常见的缓存业务去讲解canal使用.在实际开发过程中,通常都会把数据往redis缓存中保存一份,做下简单的查询优化.如果这时候数据库数据发生变更操作,就不 ...

  9. 01 Redis安装、配置详解、数据备份与恢复

    缓存简介 简介 缓存是为了调节速度不一致的两个或者多个不同的物质的速度,在中间对速度访问较快的一方起到一个加速访问速度较慢的一方的作用,比如cpu的一级,二级缓存是为了保存cpu最近经常访问的数据,内 ...

最新文章

  1. sphinx error connection to 127.0.0.1:9312 failed (errno=0, msg=)
  2. renpy 如何执行2个action_如何解决工作中遇到问题丨2个思考方式、2个技巧和1个解决系统...
  3. pring MVC过滤器-HttpPutFormContentFilter
  4. 【摩天好课推荐】2.4 Python代码常见的逻辑结构
  5. linux安装mysql5.5.52,Linux系统上安装MySQL 5.5prm
  6. Struts2框架学习笔记1
  7. 【100题】第十九题(斐波那楔数列)
  8. Java_8函数式编程pdf
  9. CSDN 文章自动显示全文
  10. as5300g2 nas软件功能_浪潮AS5300G2 5500G2存储2U12
  11. 一个***的自白(续)
  12. 软考高项你想知道的都在这
  13. 【githubgirl】如何通过实现一个简单的编译器(TinyC),并借助实例来描述基本的编译原理及过程
  14. APS生产计划排程(Production Planning and Scheduling)
  15. 风寒感冒 风热感冒区别
  16. 查看电脑是否开启虚拟化
  17. 【CSDN竞赛第四期】编程赛后总结与分享
  18. 静态创意和动态创意_2020年创意工作的5个预测
  19. RHEL 5下iSCSI Initiator软件安装配置指导
  20. “全球发布——主流声音 · 最强路径”在深落幕 引领主流生态融合新模式

热门文章

  1. shiro中ini配置文件
  2. 关于上篇文章的okhttp中对于onFailure回调的异常捕获
  3. WINDOWS操作系统32位(x86)和64位(x64)的区别
  4. 网络配置辅导:多路由器如何使用多条ADSL线路
  5. 机房收费系统个人重构版:软工文档中那些图
  6. 马斯克地球事务麻烦不断:Model 3又有一起严重事故曝光
  7. 商汤科技20篇论文入选ICCV 2017,披露最新研究主线
  8. 怎么将文字转换成语音?
  9. 可可托海将打造研学旅游基地促经济发展
  10. 中科院人工智能应用 福玛特550G解析