浅谈:redis的主从复制 + 哨兵模式

主从模式

​ 在谈论redis的主从复制之前,我们先回想下mysql的主从搭建过程,第一步呢首先要在主库服务器中修改my.cnf,开启一下bin_log功能,设置下server-id=1,重启服务后开启一个主从的授权,然后就可以show master status查看主库的状态记录下主库的master_log_file和master_log_pos;第二步呢就是修改从库的server-id为2(有其余从库依次3,4····),开启relay_log,重启从库后,设置与master主库连接的命令,开启slave使从库生效。。这个mysql主从搭建的过程还是相对比较复杂的,而且要想实时灾备和主从切换,还得需要配置一些其他的,比如借用MHA架构。但是呢,redis的主从搭建就十分简单了。

redis主从搭建过程:

  • 主redis服务器什么也不需要修改,摆那启动就好。
  • 从机服务器在redis.conf文件里加上:replicaof 主机ip:port端口号,启动就好了。

redis主从实现的原理:

  • slave从机在配置完启动后,会根据配置的主机的ip:port去ping主机,看能不能ping通,建立一个socket通道。期间也会不断的进行心跳检测,保证二者实时感应到的。
  • socket通道建立后,slave经历过一系列的鉴权检验没问题后,它会在master那里获得一个RDB快照文件,由于它是二进制文件,所以体积小,传输过程也比较快。slave会解析这个RDB文件,将那个快照版本的数据复制到自己的服务器上,这是一个全量复制的过程。
  • 接下来如果master再接收到来自于客户端的其他命令,它会直接将命令传播给slave,而slave会一直的去接收并执行主服务器master传递过来的命令,这是一个增量复制的过程。

下面我画一张示意图来描述这个过程:

至于redis为什么要做主从搭建,这也源于主从搭建的两个优点:

  • 数据容灾。从机作为主机的一个数据备份,当主机宕机后,从机能够快速的切换成主机,达到一个高可用的目的。这也是redis主从搭建的常用使用场景。
  • 读写分离。主机负责写数据,从机负责读数据,提高redis的吞吐量,但是会发生数据一致性的问题,毕竟主从同步数据需要时间。

需要注意的是:

  • 当redis搭建主从后,从机就只能读数据,不能去写数据了,写的话会报错。
  • 单纯的搭建redis主从,不能实现主从的切换,也就是主机宕机后,从机还是从机,要想实现主从切换,必须引用redis的哨兵机制。

哨兵模式

​ 哨兵二字可以让我们联想到监察员一类的职务,它的角色在应该是来监控我们的redis主从服务,当发现我们的redis主从服务出现问题了,比如主机下线了一类的,它就要发挥它的作用,将其他的从机扶持成主机,达到系统正常运行的效果。

​ 一般而言,我们会用多个实例来组成sentinel集群(哨兵集群)来监视一组的一主多从或者是多组的一主多从。在这里提一句,哨兵模式也遵循一个选举机制和过半原则,只有当一半以上的sentinel认为某台机器出问题了,这个决议才会被通过进行之后的操作。

哨兵模式的部署示意图:

关于哨兵模式的搭建过程本文不再缀叙了,百度上很多都写过类似的博客,可以参考:https://www.cnblogs.com/qinxu/p/9633418.html

执行流程

启动并初始化Sentinel

Sentinel是一个特殊的redis服务器,不会去进行持久化,Sentinel实例启动后,每个Sentinel会创建2个连向主服务器的网络连接。

  • 命令连接:用于向主服务器发送命令,并接收响应
  • 订阅连接:用于订阅主服务器的一个sentinel:hello频道

获取主服务器信息

Sentinel默认每10秒一次,向被监控的主服务器发送info命令,获取主服务器和其下属从服务器的信息。

获取从服务器信息

当sentinel发现主服务器有新的从服务器出现时,sentinel还会向从服务器简历命令连接,当命令连接建立之后,sentinel还是会默认10s一次,向从服务器发送info命令,并记录从服务器的信息。

向主服务器和从服务器发送消息(以订阅的方式)

默认情况下,sentinel每2秒一次,向所有被监视的主服务器和从服务器所订阅的sentinel:hello频道上发送消息,消息会携带sentinel自身的信息和主服务器的信息。

接收来自主服务器和从服务器的频道信息

当sentinel与主服务器或者从服务器建立起订阅连接之后,sentinel就会通过订阅连接,向服务器发送以下命令:

subscribe —sentinel—:hello

sentinel彼此之间只创建命令连接,而不创建订阅连接。因为sentinel通过订阅主服务器或者从服务器,就能够感知到新的sentinel的加入,而一旦新的sentinel加入后,相互感知的sentinel通过命令连接来通信就好了。

检测主观下线状态

Sentinel每秒一次向所有与它建立了命令连接的实例(主服务器、从服务器和其他Sentinel)发送PING命



实例在down-after-milliseconds毫秒内返回无效回复(除了+PONG、-LOADING、-MASTERDOWN外)

实例在down-after-milliseconds毫秒内无回复(超时)

Sentinel就会认为该实例主观下线(SDown)

检查客观下线状态

当一个Sentinel将一个主服务器判断为主观下线后,Sentinel会向同时监控这个主服务器的所有其他Sentinel发送查询命令

SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>

其他Sentinel回复

<down_state>< leader_runid >< leader_epoch >

判断它们是否也认为主服务器下线。如果达到Sentinel配置中的quorum数量的Sentinel实例都判断主服务器为主观下线,则该主服务器就会被判定为客观下线(ODown)。

选举Leader Sentinel

当一个主服务器被判定为客观下线后,监视这个主服务器的所有Sentinel会通过选举算法(raft),选出一个Leader Sentinel去执行failover(故障转移)操作。

故障转移的步骤:

  • 它会将失效 Master 的其中一个 Slave 升级为新的 Master , 并让失效 Master 的其他 Slave 改为复制新的 Master ;
  • 当客户端试图连接失效的 Master 时,集群也会向客户端返回新 Master 的地址,使得集群可以使用现在的 Master 替换失效 Master 。
  • Master 和 Slave 服务器切换后, Master 的 redis.conf 、 Slave 的 redis.conf 和

    sentinel.conf 的配置文件的内容都会发生相应的改变,即, Master 主服务器的redis.conf配置文件中会多一行 replicaof 的配置, sentinel.conf 的监控目标会随之调换。

主服务器master的选择规则

  • 过滤掉主观下线的节点
  • 选择slave-priority最高的节点,如果由则返回没有就继续选择
  • 选择出复制偏移量最大的系节点,因为复制偏移量越大则数据复制的越完整,如果由就返回了,没有就继续
  • 选择run_id最小的节点,因为run_id越小说明重启次数越少

浅谈:redis的主从复制 + 哨兵模式的更多相关文章

  1. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  2. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  3. SpringBoot进阶教程(三十)整合Redis之Sentinel哨兵模式

    Redis-Sentinel是官方推荐的高可用解决方案,当redis在做master-slave的高可用方案时,假如master宕机了,redis本身(以及其很多客户端)都没有实现自动进行主备切换,而 ...

  4. Redis全方位讲解--哨兵模式(Sentinel模式)

    前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...

  5. Redis全方位讲解--哨兵模式(Sentinel模式)(转载)

    前言 当按照上一篇<redis主从复制>部署好之后,我们会想,一旦redis的master出现了宕机,并且我们并没有及时发现,这时候就可能会出现数据丢失或程序无法运行.此时,redis的哨 ...

  6. Springboot2.x整合Redis以及连接哨兵模式/集群模式

    依赖: <!--spirngboot版本为2.x--><!-- 加载spring boot redis包,springboot2.0中直接使用jedis或者lettuce配置连接池, ...

  7. redis 主从同步&哨兵模式&codis

    主从同步 1.CPA原理 1. CPA原理是分布式存储理论的基石: C(一致性):   A(可用性):  P(分区容忍性); 2. 当主从网络无法连通时,修改操作无法同步到节点,所以“一致性”无法满足 ...

  8. Redis主从、哨兵模式的搭建

    壹.Redis主从分离 准备三个redis配置文件(redis.conf),分别修改为redis6380.conf.redis6381.conf.redis6382.conf 一.配置Master 1 ...

  9. 【Redis】Sentinel 哨兵模式

    Sentinel(哨兵模式) 目录 Sentinel(哨兵模式) 哨兵模式的三个定时任务 Sentinel(哨兵)与Sentinel .主服务器.从服务器之间的连接 检测下线状态 选择领头 Senti ...

随机推荐

  1. Ubuntu下使用VS Code创建Spring Boot工程

    目的 我们将在Ubuntu桌面系统下,使用VS Code(Visual Studio Code)编辑器从零开始创建一个Spring Boot工程,并实现一个简单的RESTful风格接口.使用这套流程的 ...

  2. Java异常理解之Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException

    这个异常是Java中的数组越界问题 当你使用不合法的索引访问数组是会出现这种错误例如: class Solution { public static int climbStairs(int n) { ...

  3. lvs的三种模式

    一.NAT模式(VS-NAT) 原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数 ...

  4. Django settings.py配置文件

    import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 这里用到了python中一个神奇的变量 file 这个变量可以获取到当前 ...

  5. Water 2.5 发布,一站式服务治理平台

    Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...

  6. CSS之常见布局|常用单位|水平垂直居中

    常见布局: 1. 流式布局:百分比布局,宽高.margin.pinding都是百分比 2. 固定布局:盒子的宽高固定,如:margin.padding等 3. 浮动布局:float 4. 弹性布局:f ...

  7. Luogu_P1613跑路

    跳转链接 题目大意 题目中要求的是从1号点到n号点所需要的最短时间, 一秒可以走 \(2^k\) 个距离 给定的有向图的边边权都是1. 问题分析 由于一秒可以走 \(2^k\) 个距离,因此题目转化为 ...

  8. ApacheCN Python 译文集(二)20211110 更新

    Python 应用计算思维 零.序言 第一部分:计算思维导论 一.计算机科学基础 二.计算思维要素 三.理解算法和算法思维 四.理解逻辑推理 五.探究性问题分析 六.设计解决方案和解决流程 七.识别解 ...

  9. Spring系列13:bean的生命周期

    本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: ...

  10. IAAS, SAAS, PAAS

    原文是Pizza‐as‐a‐Service: a detailed view,用来类比Cloud Service Models.出处来自于Data Sovereignty and the Cloud ...