Redis一般是用来支撑读高并发的,为了分担读压力,Redis支持主从复制。架构是主从架构,一主多从, 主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。 所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。
 
redis主从复制的特点:
  • redis采用异步方式复制数据到slave节点,从redis2.8开始,slave节点会周期性地确认自己每次复制的数据量;
  • 一个master节点可以配置多个slave节点;
  • slave节点可以连接其他的slave节点;
  • slave节点做复制的时候,不会阻塞master节点的正常工作;
  • slave节点做复制的时候,也不会阻塞对自己的查询操作,它会用旧数据集来提供服务,但在复制完成时,需要删除旧数据集,加载新数据集,这时会暂停对外服务;
  • slave节点主要用来横向扩容,做读写分离,扩容的slave节点可以提高读的吞吐量;
  • 如果采用主从架构,必须开启master节点的持久化,不建议用slave节点作master节点的数据热备,因为如果一旦关掉master的持久化,可能在master宕机重启时数据是空的,然后一经复制,slave节点也会随之丢失。
 

主从复制


    Redis主从复制分为全量复制和增量复制。
    全量复制一般发生在Slave初始化阶段,这时slave需要将master上的所有数据都复制一份。步骤如下:
  • 从服务器连接主服务器,发送psync命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
 
    增量复制一般是 Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。步骤如下:
  • 如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制。
  • master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB。
  • master 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。
 

其他知识点(可忽略)


Redis主从复制的核心原理

    slave节点初次连接master节点,会发送psync命令并触发全量复制。此时master开启一个后台线程,开始生成一份RDB快照,同时将那些从外面接收到的写命令缓存到缓冲区中。RDB文件生成完毕后,将此文件发送给slave节点,slave先写入磁盘,再从磁盘加载到内存,接着master会将缓冲区中的写命令发送给slave,slave执行写命令并同步数据。如果slave节点和master节点因网络故障断开连接,会自动重连,连接之后master节点会复制缺少的数据给slave节点。
 

主从复制的断点续传

    从redis2.8开始支持主从复制的断点续传,主从复制过程中网络连接断开了,会接着从上次断开的地方继续复制,而不是从头开始复制。
    master节点会在内存中维护一个backlog,master和slave都会保存一个replica offset和一个master run id,offset就在backlog中,master和slave断开时,slave会让master从上次replica offset开始继续复制,如果没找到对应的offset,就会执行一次  resynchronization。

无磁盘化复制

    master在内存中创建RDB,然后发送给RDB,不会在自己本地落地磁盘了,只需要在配置文件中开始repl-diskless-sync-delay即可。
 

过期key处理

    slave不会处理过期key,只能等待master处理。如果master处理了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
 

heartbeat

    主从节点会相互发送heartbeat信息。master默认每隔10秒发送一次heartbeat,slave节点每隔1秒发送一次heartbeat。
 

异步复制

    master每次接收到写命令之后,先在内部写入数据,然后异步发送给slave节点。
 

Redis如何做到高可用


    如果系统99%的时间都用于对外服务,那么系统可以说是高可用的。
    一个slave节点挂掉,并不会影响系统的高可用性,其他slave节点可以提供相同的数据对外服务。
    但如果master节点挂掉了,就无法写入数据了,导致slave节点得不到最新的数据,这时就相当于系统不可用了。Redis的高可用架构,叫做failover故障转移,也就主备切换。master节点故障时会自动检测,并将某个slave节点自动切换成master节点的过程,叫做主备切换。这个过程,实现了Redis主从架构的高可用。
 

Redis面试篇 -- Redis主从复制原理的更多相关文章

  1. Redis面试篇 -- Redis常见性能问题和解决方案?

    master最好不要做任何的持久化工作,如RD内存快照或者AOF日志文件: 如果数据比较重要,某个slave开始AOF备份数据,策略设置为每秒同步1次: 为了主从复制的速度和连接的稳定性,master ...

  2. Redis高可用之主从复制原理演进分析

    Redis高可用之主从复制原理演进分析 在很久之前写过一篇 Redis 主从复制原理的简略分析,基本是一个笔记类文章. 一.什么是主从复制 1.1 什么是主从复制 主从复制,从名字可以看出,至少需要 ...

  3. Redis面试篇 -- 如何保证缓存与数据库的双写一致性?

    如果不是严格要求“缓存和数据库”必须保证一致性的话,最好不要做这个方案:即 读请求和写请求串行化,串到一个内存队列里面去.串行化可以保证一定不会出现不一致的情况,但会导致系统吞吐量大幅度降低. 解决这 ...

  4. Redis第二篇(Redis基本命令)

    -x     从标准输入读取一个参数 such as: echo –en “shaw” |./redis-cli –x setname == set name shaw -r     重复执行一个命令 ...

  5. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

  6. 彻底搞懂Redis主从复制原理及实战

    欢迎关注公众号:「码农富哥」,致力于分享后端技术 (高并发架构,分布式集群系统,消息队列中间件,网络,微服务,Linux, TCP/IP, HTTP, MySQL, Redis), Python 等 ...

  7. Redis面试热点之底层实现篇

    通过本文你将了解到以下内容: Redis的作者.发展演进和江湖地位 Redis面试问题的概况 Redis底层实现相关的问题包括:常用数据类型底层实现.SDS的原理和优势.字典的实现原理.跳表和有序集合 ...

  8. Redis面试热点之底层实现篇(续)

    0.题外话 接着昨天的[决战西二旗]|Redis面试热点之底层实现篇继续来了解一下ziplist压缩列表这个数据结构. 你可能会抱有疑问:我只是使用Redis的功能并且公司的运维同事都已经搭建好了平台 ...

  9. 浅谈Redis面试热点之工程架构篇[1]

    前言 前面用两篇文章大致介绍了Redis热点面试中的底层实现相关的问题,感兴趣的可以回顾一下:[决战西二旗]|Redis面试热点之底层实现篇[决战西二旗]|Redis面试热点之底层实现篇(续) 接下来 ...

随机推荐

  1. Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么?

    相信大家已经对 kafka 的基本概念已经有一定的了解了,下面直接来分析一下 ISR 和 AR 的概念. ISR and AR 简单来说,分区中的所有副本统称为 AR (Assigned Replic ...

  2. A - 猜数字

    http://acm.hdu.edu.cn/showproblem.php?pid=1172 猜数字 猜数字游戏是gameboy最喜欢的游戏之一.游戏的规则是这样的:计算机随机产生一个四位数,然后玩家 ...

  3. Java开发必备工具 ------------工欲善其事,必先利其器

    java企业级开发基本工具 一.开发必备工具 1.Java开发环境 JDK (官网下载即可,需要注册账户) JRE 2.Java企业编码开发工具 IntelliJ IDEA(建议使用Idea,插件使用 ...

  4. git合并出现冲突

    git合并出现冲突:Your local changes to the following files would be overwritten by merge:Please, commit you ...

  5. Maven项目使用Nexus作为远程仓库的settings.xml配置

    Maven项目使用Nexus作为远程仓库的settings.xml配置(转) 在自己电脑C:\Users\hanmm\.m2\下的setting.xml. 1.服务器配置 <server> ...

  6. 9.1练习题5 差k素数对 题解

    题目出处:洛谷 P1348 ,题面略有改编. 题目描述 给你两个数 n 和 k ,请求出所有小于等于 n 的相差为 k 的素数对. 输入格式 两个正整数n,k.1<=k<=n<=10 ...

  7. 关于设置tomcat端口为80的事

    今天有人要求tomcat服务器的访问地址不能带端口访问, 也就是说只能用80端口访问网站. 那么问题来了, Ubuntu系统禁止root用户以外的用户访问1024以下的商品, 因此tomcat 默认为 ...

  8. Fliptile(枚举+DFS)

    Problem Description Farmer John knows that an intellectually satisfied cow is a happy cow who will g ...

  9. 一文搞懂 deconvolution、transposed convolution、sub-­pixel or fractional convolution

    目录 写在前面 什么是deconvolution convolution过程 transposed convolution过程 transposed convolution的计算 整除的情况 不整除的 ...

  10. Spring Boot 入门之整合 log4jdbc 篇(六)

    博客地址:http://www.moonxy.com 一.前言 Spring Data JPA 默认采用 Hibernate 实现.Hibernate 的 showSql 配置只打印 SQL,但并不打 ...