前文回顾

建议前面文章没看过的同学先看下前面的文章:

「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」

「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透」

Redis 主从模式

在生产环境使用 Redis ,完全禁止使用单机模式,单机模式风险太高,一台机器出于某些原因挂掉,就会导致整个缓存服务死掉,所以,我们需要使用多台机器来保证 Redis 的高可用,同时也顺便提升了并发性。

对于 Redis 缓存而言,更常见的应用场景是支持读高并发,而写高并发的场景相对比较少(不能说没有,只能说相对读高并发比较少)。

因此,使用主从模式,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。

经典的主从模式架构图如下:

主从同步策略:

master 和 slave 刚刚连接的时候,进行全量同步。全量同步结束后,进行增量同步。

当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

全量同步:

master 执行 BGSAVE 命令,生成一个 RDB 文件, 发送给 slave , slave 加载 RDB 文件达到与 master 维持一致。

  1. slave 连接 master 后,发送 SYNC 命令。
  2. master 接收到 SYNC 命名后,开始执行 BGSAVE 生成 RDB 文件,并使用缓冲区记录此后执行的所有写命令。
  3. master BGSAVE 执行完后,向所有 slave 发送快照文件,并在发送期间继续记录被执行的写命令。
  4. slave 收到快照文件后丢弃所有旧数据,载入收到的快照。
  5. master 快照发送完毕后开始向 slave 发送缓冲区中的写命令。
  6. salve 完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令。
  7. 第一次全量同步完成。

增量同步

Redis 增量复制是指 slave 初始化后开始正常工作时 master 发生的写操作同步到 slave 的过程。

增量复制的过程主要是 master 每执行一个写命令就会向 slave 发送相同的写命令,从服务器接收并执行收到的写命令。

心跳信息

主从节点互相都会发送心跳信息。

master 默认每隔 10 秒发送一次心跳信息,slave 每隔 1 秒发送一个心跳信息。

注意点:

  • Redis 使用异步的方式将数据从 master 节点复制到 slave 节点,slave 会周期性地确认自己每次复制的数据量。
  • slave 做复制的时候,不会 block master 正常工作。
  • slave 做复制的时候,也不会 block 自己当前的查询工作,只是查询的时候依然会使用旧数据,等到复制完成后,需要删除老数据加载新数据的时候才会 block 当前的查询工作。
  • slave 主要用来做横向扩容,提升读的吞吐量,一定程度上做到了读的高可用。
  • slave 不一定要连接到 master ,也可以 slave 连接到 slave 。
  • slave 不会处理过期 key ,只会等待 master 过期 key。如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。

无磁盘化主从复制

master 节点可以在内存中直接创建 RDB 文件,然后将 RDB 文件直接发送给 salve 节点,不在自己本地落地到磁盘,这个操作只需要在配置文件中开启 repl-diskless-sync yes

但是这样做的风险会比较高,因此,强烈建议在 master 上开启持久化服务。

如果一定要在 master 节点上设置不开启持久化,请在确保 Redis 实例不会自动重启。

为啥要确保实例不会自动重启?

下面给大家分享一个案例,这是生产环境真实发生过的事情,都是血的教训。

一个主从结构的 Redis 集群,当 master 没有配置开启数据持久化,某个时间,突然 master 节点宕机,然后自动重启,当 master 节点自动重启后,由于没有开启数据持久化,这时的 master 节点中是无数据的,当 salve 节点进行数据同步的时候,会把 salve 节点的数据也做清空操作。这时,整个主从结构的 Redis 集群全都没有数据,大量的请求过来发现 Redis 没有数据,导致请求落到了 DB 上,结果是毁灭性的。

主从模式存在的问题是,它仅仅只做到了读高可用,如果一旦 master 节点挂掉了,就没办法写数据了,只剩下 slave 节点还能读数据,但是数据同步也没有了,只能靠人工干预进行恢复,这并不是我们想要的高可用。

我们还需要写高可用,这就引出了 Redis 的高可用架构:哨兵模式。

简单来讲,哨兵模式就是在 master 节点不可用后,可以自发的进行主备切换,或者叫做故障转移。

master 节点在发生故障后,整个集群可以自动检测,将某个 salve 自动切换成 master 节点,这种模式才算是实现了 Redis 真正意义上的高可用。

参考

https://www.cnblogs.com/daofaziran/p/10978628.html

老司机带你玩转面试(3):Redis 高可用之主从模式的更多相关文章

  1. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  2. 老司机带你玩转面试(4):Redis 高可用之哨兵模式

    前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...

  3. 老司机带你玩转面试(5):Redis 集群模式 Redis Cluster

    前文回顾 建议前面文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 「老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩.击穿. ...

  4. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化

    引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个 ...

  5. 编程老司机带你玩转 CompletableFuture 异步编程

    本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 个人博文地 ...

  6. 老司机带你玩转web service

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来.毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放.怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防火墙 ...

  7. 老司机带你玩Spring.Net -入门篇

    网上有 Spring.Net 的相关的很多介绍的文章还有实践例子,推荐个还不错的博客 Spring.Net 学习笔记 .以前对 Spring.Net 算是有过一面之缘,但却迟迟未真正相识.在网上有太多 ...

  8. 老司机带你走进Core Animation

    为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...

  9. 老司机带你开飞机 一: mssql on linux 安装指导

    通常在本机开发环境中需要搭建所有的服务,还要修改本地的hosts,实在是不胜其烦.如今有了docker,完全不用污染本地环境,且看老司机带你搭建一个asp.net core的开发环境集群.愿你走出虚拟 ...

随机推荐

  1. AutoIt实现文件上传

    AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...

  2. mysql explain的extra

    导读 extra主要有是那种情况:Using index.Using filesort.Using temporary.Using where Using where无需多说,就是使用了where筛选 ...

  3. cb47a_c++_STL_算法_排列组合next_prev_permutation

    cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...

  4. C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

    1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...

  5. StringEscapeUtils防止xss攻击详解

    StringUtils和StringEscapeUtils这两个实用类. 1.转义防止xss攻击 1.转义可以分为下面的几种情况 第一用户输入特殊字符的时候,在提及的时候不做任何处理保持到数据库,当用 ...

  6. 10、一个action中处理多个方法的调用第二种方法method的方式

    在实际的项目中,经常采用现在的第二种方式在struct.xml中采用清单文件的方式 我们首先来看action package com.bjpowernode.struts2; import com.o ...

  7. Refresh Java

    当你的知识来源于实践, 你可能会忽略很多细节. 当你的知识来源于阅读, 你可能会很快的忘掉. 那么, 不如在空闲之余, 浏览一遍, 把觉得有必要的记录下来, 也便于以后温故而知新, 何乐而不为呢? 于 ...

  8. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  9. 入门大数据---Spring+Mybatis+Phoenix整合

    一.前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的关系型数据库(如 Mysql,Oracle)在配置上是基本相同的,下面会分别给出 Spring/Spring Boot ...

  10. python设计模式之策略模式

    每次看到项目中存在大量的if else代码时,都会心生一丝不安全感. 特别是产品给的需求需要添加或者更改一种if条件时,生怕会因为自己的疏忽而使代码天崩地裂,哈哈,本文的目的就是来解决这种不安全感的, ...