首页 > 数据库 >redis主从数据同步的原理

redis主从数据同步的原理

时间:2023-06-03 16:34:41浏览次数:50  
标签:同步 slave baklog redis repl master RDB 主从

redis主从数据同步的原理

数据同步原理

主从第一次同步是全量同步,但是如果slave重启后同步,则执行增量同步。

image-20210725152222497

第一阶段

slave和master建立第一次同步的时候,需要执行replicaof命令,并且指定了master的ip和端口,slave和master连接一旦建立成功,slave就会向master发出请求来数据同步,然后master就会问slave是否是第一次来建立连接,如果slave不是第一次来的话,slave就代表已经有一部分master的数据了,如果slave是第一次来的话,master就会将完整的数据给slave,master在将完整的数据给slave之前,先将master的数据版本信息给slave,这样可以确保将来对版本的控制。在确定是第一次建立连接的时候,master就会将完整的信息给slave,master在做数据同步的时候它其实就是会执行bgsave命令,生成RDB。一旦执行bgsave命令,后台就会有一个独立的进程生成RDB文件,这样对主进程没有影响,主进程还是会执行用户的请求。RDB一旦生成,它里面记录了完整的内存信息发给slave(从节点),这个时候slave会先将它本地的数据清空,然后加载RDB的文件,这样就可以保证它和master的信息基本一致。

第二阶段

在主节点在发送内存给slave的期间执行主进程的信息,把这个时候的执行的命令存在replbaklog(内存缓存区)中,

所以RDB加上repl_baklog中执行的命令就是master的所有信息了。

第三阶段

将repl_baklog中的命令发送给slave,slave将master发送的repl_baklog里面的命令都执行一遍就可以保证它和master数据一致,如果后续再有命令发送过来,master也会将它保存在repl_baklog中,然后创建独立的进程发送给slave。

这里有一个问题,master如何得知salve是第一次来连接呢??

有几个概念,可以作为判断依据:

  • Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
  • offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

如果slave和master的replid id不一致一定是第一次来。

总结

简述全量同步的流程

  • slave节点请求增量同步
  • master节点判断replid,发现不一致,拒绝增量同步
  • master将完整内存数据生成RDB,发送RDB到slave
  • slave清空本地数据,加载master的RDB
  • master将RDB期间的命令记录在repl_baklog,并持续log中的命令发送给slave

image-20210725153201086

增的是slave到master这之间的数据

1685516692668

只要slave和master的信息差距不要超过这个环的上限(存储上限),就永远可以同步信息

什么时候增量同步会失败?slave宕机了,但是master还是不停记录信息,结果超过了slave

1685516919343

注意:repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log增量同步,只能再次全量同步。

可以从以下几个方面来优化Redis主从就集群:

  • 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
  • Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
  • 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力

下图中slave1执行命令时将id和端口设置成前面那个slave,而不是设置成master了

1685780021677

总结

简述全量同步和增量同步区别?

全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave

什么时候执行全量同步?
slave节点第一次连接master节点时
slave节点断开时间太久,repl_baklog中的offset已经被覆盖时

什么时候执行增量同步?
slave节点断开又恢复,并且在repl_baklog中能找到offset时

标签:同步,slave,baklog,redis,repl,master,RDB,主从
From: https://www.cnblogs.com/itfdx/p/17454160.html

相关文章

  • 大件货运系统源码,技术架构:spring boot、mybatis、redis、vue、element-ui
    网络货运平台源码网络货运平台的功能网络货运是指利用互联网平台,通过物流配送的方式进行商品销售和物流运输的一种新型商业模式。这种模式将传统的货运模式与互联网技术相结合,通过网络平台进行交易、物流配送和结算等一系列流程,从而实现货物的快速、高效、便捷地运输。技术架构:spr......
  • 4种数据同步到Elasticsearch方案
    上周听到公司同事分享MySQL同步数据到ES的方案,发现很有意思,感觉有必要将这块知识点再总结提炼一下,就有了这篇文章。本文会先讲述数据同步的4种方案,并给出常用数据迁移工具,干货满满!不BB,上文章目录:1.前言在实际项目开发中,我们经常将MySQL作为业务数据库,ES作为查询......
  • Java开发 - 让你少走弯路的Redis主从实现单节点哨兵模式
    前言前一篇中,我们讲解了Redis主从的搭建方式,其实很简单呐有木有,都是配置,连句代码都没有,是不是感觉高估了Redis主从的搭建方式?哈哈,没关系,跟着博主,包你全会。今天我们的主题是哨兵,没错,就是哨兵!有了Redis,要是没有哨兵,那真是太可惜了,哨兵是很神圣的一种重要的监测工具,有了哨兵,在Redis主......
  • redis 相关
    redis-cli-hip-p6379-aselectnumber//0-15切换数据库flushdb//清除当前库的数据delkeyname//删除指定键及数据flushall//清空整个redis数据,所有库flushdb//清除当前库的数据dockerexec-itredisredis-cliauthpasswordkeys*delllen......
  • Redis(一) -- 基础
    RedisRedis是一个开源(BSD许可高性能的内存存储的key-value数据库!可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表(List)、集合(Set)、有序集合(OrderedSets),位图(bitmap),hyperloglogs,GEO等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功......
  • 九分布式锁-Redis7笔记动力节点视频
    9分布式锁分布式锁是控制分布式系统间同步访问共享资源的一种方式,其可以保证共享资源在并发场景下的数据一致性。9.1分布式锁的工作原理当有多个线程要访问某一个共享资源(DBMS中的数据或Redis中的数据,或共享文件等)时,为了达到协调多个线程的同步访问,此时就需要使用分布式锁了。......
  • redis主从配置
    1、下载redis3.2.3wgethttp://download.redis.io/releases/redis-3.2.3.tar.gztar-zxvfredis-3.2.3.tar.gzcdredis-3.2.3makemaketest//检查一下看有没有问题makeinstall安装完之后,会在src目录下生成几个可执行文件,分别是mkreleasehdr.......
  • 关于U8物料同步不完整时处理及提示:存货档案不存在或结构性自由项非法
    说明:物料主要保存于三张表:1. Inventory存货档案 对应物料料号字段为:cinvcode2. Inventory_Sub,存货档案子表 对应物料料号字段为:cinvsubcode3. bas_part基本信息表  对应物料料号字段为:invcod我们可以通过总账工具或我们U8协同进行物料同步,但有时会出现物料同......
  • Redis新数据类型
    一、BitmapsBitmaps本身不是一种数据类型,实际上它是字符串(key-value),但是它可以对字符串的位进行操作可以把Redis想象成一个以位为单位的数组,数组每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量*setbitkeyoffsetvalue设置Bitmaps中某个偏移量的值(0或1),offs......
  • 好饭不怕晚,扒一下Redis配置文件的底Ku
    忙碌是一种幸福,让我们没时间体会痛苦;奔波是一种快乐,让我们真实地感受生活;疲惫是一种享受,让我们无暇空虚。这几句话就能简单概括我最近的工作和生活。好多小伙伴都来私信“催更”,今天它来了!为了表达阿Q的歉意,特赠送「亿级流量Java高并发与网络编程实战」一本,规则见文末。在往期的文......