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. Go语言os标准库常用方法

    1. os.Getwd()函数 原型:func Getwd()(pwd string, err error) 作用:获取当前文件路径 返回:当前文件路径的字符串和一个err信息 示例: package ...

  2. std::move的原理与实现,右值引用的深入理解

    这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用 ...

  3. webpack多页面应用打包问题-新增页面打包JS影响旧有JS资源

    webpack多页面应用打包问题:如果在项目里新增页面,pages目录中插入一个页面文件,然后打包代码,在webpack3中,新增页面文件上方文件打包出来的JS文件内容全部会改变,点击查看比对,发现问 ...

  4. Windows下升级Zabbix Agent

    这段时间因工作上不太忙,就着手升级下zabbix,从3升级到最新版4.2,服务器端升级还挺快,就是客户端比较耗时了,往往就是看的越简单的东西越耗时间啊. Windows版本的zabbix agent下 ...

  5. 数据库常用SQL语句(二):多表连接查询

    前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询. 在实现连接查询时,首先是 ...

  6. Elasticsearch(7) --- 复合查询

    Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...

  7. Net基础篇_学习笔记_第十二天_面向对象继承(父类和子类)

    继承 我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类.Student.Teacher.Driver 子类  派生类Person         ...

  8. 13 (OC)* SDWebImage

    IOS SDWebImage实现原理详解   在之前我写过SDWebImage的使用方法,主要是用与获取网络图片,没有看过的朋友可以看看. 这篇文章将主要介绍SDWebImage的实现原理,主要针对于 ...

  9. Django中自定义模型管理器(Manager)及方法

    1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个Django模型至少有一个ma ...

  10. 基于SpringBoot实现AOP+jdk/CGlib动态代理详解

    动态代理是一种设计模式.在Spring中,有俩种方式可以实现动态代理--JDK动态代理和CGLIB动态代理. JDK动态代理 首先定义一个人的接口: public interface Person { ...