• 聊聊基础概念

主从复制与主从替换

主从复制不同于主从替换,主从复制是正常情况下主节点同步数据到从节点;主从替换是主节点挂了之后,把从节点替换为主节点;

从节点存在的意义:备份主节点数据+负载均衡(对外提供可读操作)

从节点配置主节点的信息(两种方式)

1、临时配置:启动从节点的redis-cli执行命令【slaveof host port】,host是主节点的ip,port是主节点的端口号,结果总是返回ok

2、永久配置:进入redis.conf,添加【slaveof host port】到文件中

runid和offset

runid:每个redis在启动或重启时都会生成一个唯一的runid;

offset:主从节点都有自己的主从复制偏移量,主节点复制数据到从节点时,从节点的偏移量的offset=原始offset+命令数据长度,同时从节点会把'从offset'发给主节点,所以主节点会同时保存'主offset'和'从offset',主节点可以通过判断'主offset'是否等于'从offset'来判断主从是否一致

backlog:是一个复制积压缓冲区,最大1M,主从同步的整个过程中主节点还会被外界写入数据,所以在主从同步进行时,主节点会把这些外部写入的'命令数据'保存一份备份到backlog,在主从同步完rdb文件后,主节点还需要同步缓存中的这些'命令数据'给到从节点(或者在'命令数据'因网络问题丢失后,主节点也可以从backlog中复制备份的数据重新同步到从节点)

主从复制的过程

  • 主从复制默认使用rdb文件的原因?

    (1)rdb文件是二进制文件比较小,所以主节点向磁盘写入rdb的I/O效率以及主节点传输rdb文件给从节点的效率都比aof文件高

    (2)rdb文件是二进制文件比较小,所以从节点写入rdb文件恢复数据的效率也比aof文件高

  • 全量复制的过程?

    (1) 一开始从节点执行【slaveof host port】命令,查找网络上的主节点,找到后发送ping给主节点,主节点返回pong,这样双方就建立了连接关系,建立了连接关系后就可以进行数据的复制了

    (2) 从节点发送【psync ? -1】给主节点,'?'是因为从节点第一次不知道主节点的runid所以用?代替,-1表示从节点自己的偏移量(首次主从复制固定为-1)

    (3) 主节点收到-1后知道这是第一次主从复制,返回【funllresync 主runid 主offset】给从节点,从节点收到后保存在自己的信息中

    (4) 主节点发完fullresync命令后马上执行bgsave命令生成rdb文件(rdb保存在磁盘中、由redis主线程分出一个子线程执行bgsave),然后把rdb文件传送给从节点

    (5) 主节点在执行bgsave命令和发送rdb文件给从节点的时候,还会被外界写入数据(简称'命令数据'),主节点会将这些'命令数据'保存一份到backlog缓冲区中,同步完rdb文件后就会继续同步缓冲区中的这些'命令数据'

    (6) 从节点收到rdb文件后会先清空本地内存数据再加载rdb文件数据到本节点,加载完后再执行主节点推过来的'命令数据'相应的命令('命令数据'其实就是一些写命令)

  • 增量复制的过程?

    • 什么时候才会需要增量复制:在主从同步的整个过程中,所有的命令都可能发生网络中断的情况,这时候就需要增量同步。
    • 过程:

      不管在什么时候主节点都会将'写命令'记录在一个叫 repl_backlog_buffer的缓冲区中,该缓冲区是一个环形数组【在执行bgsave的时候写命令也会写入全量复制中的backlog,故此时会同时将写命令记录在这两个缓冲区】
      -->

      主节点在repl_backlog_buffer上用偏移量'主offerset'记录写命令的偏移量(上面全量复制中的'主offerset'就是这个值,理论上应为repl_backlog_buffer中最新的数据位置)


      -->

      从节点也有自己主从同步过程中最新数据的位置偏移'从offerset',理论上这两个偏移值是相同的,但是在网络中断时,可能'主offerset'>'从offerset'


      -->

      此时进行增量复制:从节点先发送【psync 主runid 从offset】给主节点,主节点收到后先判断该'主runid'是否是自身,若是则再去"repl_backlog_buffer缓冲区"中判断'从offset'偏移量之后的'写命令'数据是否存在,存在则先发送【continue】命令给从节点,然后发送 '从offset'~'主offset' 之间的写命令数据同步给从节点

聊聊redis的主从复制吧的更多相关文章

  1. 聊聊redis实际运用及骚操作

    前言 聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过.甚至大部分前端猿都知道. 数据结构: string. hash. list. set (无序集合). setsorted(有序集合 ...

  2. 跟随杠精的视角一起来了解Redis的主从复制

    不想弹好吉他的撸铁狗,都不是好的程序猿 虽然说单机的Redis性能很好,也有完备的持久化机制,那如果你的业务体量真的很大,超过了单机能够承载的上限了怎么办?不做任何处理的话Redis挂了怎么办?带着这 ...

  3. redis的主从复制配置

    redis的主从复制配置 一.     原理 Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架 ...

  4. Redis总结(三)Redis 的主从复制

    接着上一篇,前面两篇我总结了<Redis总结(一)Redis安装>和<Redis总结(二)C#中如何使用redis> 所以这一篇,会讲讲Redis 的主从复制以及C#中如何调用 ...

  5. 实现Redis的主从复制配置

    实现Redis的主从复制配置比较简单,而且容易明白. 下图是要配置的主从复制结构图: 1.说明 Redis主从复制中一个主服务可以有多个从服务,一个从服务可以有多个从服务. 配置比较简单,只需要更改r ...

  6. redis的主从复制部署和使用

    reids一种key-value的缓存数据库目前非常流行的被使用在很多场景,比如在数据库读写遇到瓶颈时缓存且读写分离会大大提升这块的性能,下面我就说说redis的主从复制 首先需要启动多个redis实 ...

  7. redis实现主从复制-单机测试

    一.redis实现主从复制-单机测试1.安装redis tar -zxvf redis-2.8.4.tar.gzcd redis-2.8.4make && make install2. ...

  8. 8. redis的主从复制和sentinal

    一. redis主从复制(读写分离) redis的主从复制分为两类节点:1个master和多个slave,master进行读写操作,slav进行只读操作 启动步骤: 主节点照常启动,slave节点启动 ...

  9. Redis基础学习(五)—Redis的主从复制

    一.概述     Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中.让从服务 ...

随机推荐

  1. JSP内置对象(4个作用域)

    9个内置对象: 4个作用域:表示这4个对象可以存值,但取值范围有限定(setAttribute/getAttribute) pageContext request session applicatio ...

  2. Dubbo 可以对结果进行缓存吗?

    为了提高数据访问的速度.Dubbo 提供了声明式缓存,以减少用户加缓存的工作 量 <dubbo:reference cache="true" /> 其实比普通的配置文件 ...

  3. kafka unclean 配置代表啥,会对 spark streaming 消费有什么影响?

    unclean.leader.election.enable 为true的话,意味着非ISR集合的broker 也可以参与选举,这样有可能就会丢数据,spark streaming在消费过程中拿到的 ...

  4. Redis的持久化方案(三)

    Redis的所有数据都是保存到内存中的. Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘.Redis默认支持的持久化方案. aof形式:append only file.把所有对redis数据 ...

  5. RabbitMQ-learning

    第一种模式=直连 P:生产者,也就是要发送消息的程序 C:消费者:消息的接受者,会一直等待消息到来. queue:消息队列,图中红色部分.类似一个邮箱,可以缓存消息:生产者向其中投递消息,消费者从其中 ...

  6. 在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?

    在测试目标只关注 Spring MVC 组件的情况下,WebMvcTest 注释用于单元测试 Spring MVC 应用程序.在上面显示的快照中,我们只想启动 ToTestController. 执行 ...

  7. 怎么将 byte 转换为 String?

    可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用 的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也 可能不同.

  8. 用maven建立一个工程4

    在命令行里面输入cd C:\Users\admin\Documents\hello 然后按回车 再输入这行代码 mvn archetype:generate -DgroupId=com.liyongz ...

  9. Rust 中的数据布局--可选的数据布局

    Rust 允许你指定不同于默认的数据布局策略,并为你提供了不安全代码指南. repr(C) 这是最重要的"repr".它的意图相当简单:做 C 所做的事.字段的顺序.大小和对齐方式 ...

  10. MOS管防反接电路设计

    转自嵌入式单片机之家公众号 问题的提出 电源反接,会给电路造成损坏,不过,电源反接是不可避免的.所以,我们就需要给电路中加入保护电路,达到即使接反电源,也不会损坏的目的 01二极管防反接 通常情况下直 ...