Redis超详细讲解高可用主从复制基础与哨兵模式方案

目录
  • 高可用基础---主从复制
    • 主从复制的原理
    • 主从复制配置
    • 示例
      • 1、创建Redis实例
      • 2、连接数据库并设置主从复制
  • 高可用方案---哨兵模式sentinel
    • 哨兵模式简介
    • 哨兵工作原理
    • 哨兵故障修复原理
    • sentinel.conf配置讲解
    • 哨兵模式的优点
    • 哨兵模式的缺点

高可用基础---主从复制

Redis的复制功能是支持将多个数据库之间进行数据同步,主数据库可以进行读写操作。当主数据库数据发生改变时会自动同步到从数据库,从数据库一般是只读的,会接收注数据库同步过来的数据。

一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库,默认情况下,每台服务器都是主节点,可以通过配置来设置Redis节点称为从数据库。

主从复制的原理

  • 当启动一个从节点时,它会发送一个 PSYNC 命令(分为全量复制和部分复制)给主节点;
  • 如果是从节点初次连接到主节点,那么会触发一次全量复制。此时主节点会启动一个后台线程,开始生成一份 RDB 快照文件;
  • 同时还会将从客户端 client 新收到的所有写命令缓存在内存中。RDB 文件生成完毕后, 主节点会将RDB文件发送给从节点,从节点会先将RDB文件写入本地磁盘,然后再从本地磁盘加载到内存中;
  • 接着主节点会将内存中缓存的写命令发送到从节点,从节点同步这些数据;
  • 如果从节点跟主节点之间网络出现故障,连接断开了,会自动重连,连接之后主节点仅会将部分缺失的数据同步给从节点。

主从复制配置

默认情况下,每个节点都是主节点,只需要配置从节点。可以通过复制Redis.conf配置文件,修改主要信息,例如:端口号、pid名称、log文件名称、dump.rdb名称等,可以修改配置,配置就永久有效,也可以通过命令形式做处理。

命令:info replication:查看当前库信息

命令:slaveof ip port :在从服务器上执行名,给定主服务器的端口和IP

命令:Slave no one :可以让从节点恢复为主机

示例

启动三个Redis服务,给定端口6380、6381、6382。给定6380为主节点

1、创建Redis实例

nohup redis-server --port 6380 >> /usr/local/redis/data/log/6380.log 2>&1 &
nohup redis-server --port 6381 >> /usr/local/redis/data/log/6381.log 2>&1 &
nohup redis-server --port 6382 >> /usr/local/redis/data/log/6382.log 2>&1 &

[root@redis ~]# ps -ef |grep redis
root      16421  16314  0 03:01 pts/1    00:00:00 redis-server *:6380
root      16427  16314  0 03:01 pts/1    00:00:00 redis-server *:6381
root      16431  16314  0 03:01 pts/1    00:00:00 redis-server *:6382

2、连接数据库并设置主从复制

Gong-Dezhe-MBP:log gongdezhe$ redis-cli -p 6380
127.0.0.1:6380>
​
Gong-Dezhe-MBP:~ gongdezhe$ redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
​
Gong-Dezhe-MBP:~ gongdezhe$ redis-cli -p 6382
127.0.0.1:6382> slaveof 127.0.0.1 6380
OK

主从配置完成后,主节点信息:

从节点信息:

数据同步测试:

高可用方案---哨兵模式sentinel

搭建好的主从复制方案可以达到数据同步目的,但是当主服务器宕机后,需要手动将一个从服务器切换为主服务器,这个过程需要人工干预,同时切换会导致Redis的写入功能不可用。需要一种能够自动完成master故障发现并能够将一个Slave切换为master,这个时候需要哨兵sentinel模式,哨兵模式可以自动切换主从节点。

哨兵模式简介

sentinel是官方提供的高可用方案,其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。同时 sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程。所以监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器信息。

sentinel工作过程:

  • 通过向主服务器和从服务器发送ping命令,让服务器返回运行状态。
  • 当哨兵监测到master宕机,会自动将一个slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

关于sentinel的三个定时任务:

  • 每1秒每个sentinel对其他sentinel和redis节点执行ping操作,心跳检测。
  • 每10秒每个sentinel会对master和slave执行info命令,目的是发现slave结点,确定主从关系。
  • 每2秒每个sentinel通过master节点的channel交换信息(pub/sub)。master节点上有一个发布订阅的频道(sentinel:hello)。sentinel节点通过sentinel:hello频道进行信息交换(对节点的"看法"和自身的信息),达成共识。

哨兵工作原理

  • 每个Sentinel以每秒钟一次的频率向它所知道的Master,Slave以及其他 Sentinel实例发送一个 PING命令。
  • 如果一个实例距离最后一次有效回复 PING 命令的时间超过指定值, 则这个实例会被 Sentine 标记为主观下线。
  • 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel要以每秒一次的频率确认Master是否真正进入主观下线状态。
  • 当有足够数量的 Sentinel(大于等于配置文件指定值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。若没有足够数量的 Sentinel同意 Master 已经下线, Master 的客观下线状态就会被解除。若 Master重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
  • 哨兵节点会选举出哨兵 leader,负责故障转移的工作。
  • 哨兵 leader 会推选出某个表现良好的从节点成为新的主节点,然后通知其他从节点更新主节点信息。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控,各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

哨兵故障修复原理

1.主观下线:

当主服务器发生故障时,此时一个sentinel发现了故障,系统并不会马上进行failover过程(这个现象称为主观下线),它会向网络中的其他Sentinel进行确认。

2.客观下线:

接着其他Sentinel也陆续发现故障,这个时候其中一个Sentinel就会发起投票。一定数量的哨兵(在配置文件中指定)确认Master被标记为主观下线,此时将Master标记为客观下线。

3.sentinel的leader选举:

要想完成故障切换(将故障master剔除,并将一个slave提升为master)就必须先选举一个leader。最先发现故障的sentinel向其他哨兵发起请求成为leader,其他哨兵在没有同意别的哨兵的leader请求时,就会把票投给该sentinel。当半数以上的sentinel投票通过后就认定该sentinel为leader。接下来的故障切换有该leader完成。

4.master选举:

leader选好后将故障master剔除,从slave中挑选一个成为master。遵照的原则如下:

  • slave的优先级
  • slave从master那同步的数据量,那个slave多就优先。

5.新Master再通过发布订阅模式通知所有sentinel更新监控主机信息。

6.故障的主服务器修复后将成为从服务器继续工作。

示例:故障发生时:

故障切换:

Master重新上线后:

sentinel.conf配置讲解

配置哨兵配置文件 sentinel.conf

#Sentinel monitor <name> <ip> <port> <quorum>

  • name :redis主服务名称,可以自行命名,但是在一个sentinel网络中,一个redis主服务只能有一个名称;
  • ip和port :redis主服务的IP地址和端口号.
  • quorum :表示要将这个主服务器判断为失效并下线至少需要2个sentinel同意
  • protected-mode :关闭保护模式(默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和sentinel的protected-mode修改为no,若只修改redis node,从远程连接sentinel后,依然是无法正常使用的,且sentinel的配置文件中没有protected-mode配置项,需要手工添加。依据redis文档的说明,若protected-mode设置为no后,需要增加密码证或是IP限制等保护机制,否则是极度危险的。)

哨兵模式的优点

  • 哨兵集群、基于主从复制模式,所有的主从复制优点,它会有
  • 主从可以切换,故障可以转移,系统的可用性会更好
  • 哨兵模式就是主从模式的升级,手动转自动,更加健壮

哨兵模式的缺点

  • Redis不好在线扩展,集群容量一旦到达上限,在线扩容十分麻烦
  • 实现哨兵模式的配置很麻烦,里面有很多选择

到此这篇关于Redis超详细讲解高可用主从复制基础与哨兵模式方案的文章就介绍到这了,更多相关Redis 高可用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Redis哨兵模式高可用解决方案

    目录 一.序言 1.目标与收获 2.端口规划 二.单机模拟 (一)服务规划 1.Redis实例 2.哨兵服务 (二)服务配置 1.Redis实例 2.哨兵服务 (三)服务管理 1.Redis实例 2.哨兵服务 三.客户端整合 (一)基础整合 1.全局配置文件 2.集成配置 (二)读写分离 一.序言 Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务. 1.目标与收获 一主两从三哨兵Redis服务,基本能够满足中小型项目的高可用要求,使用Supe

  • Redis哨兵模式介绍

    哨兵简介 主机"宕机" 将宕机的 master 下线 找一个 slave 作为 master 通知所有的 slave 连接新的 master 启动新的 master 和 slave 全量复制 *N+ 部分复制*N 存在的问题: 谁来确认 master 宕机了 重新找一个新的 master ,怎么找法? 修改配置后,原来的 master 恢复了怎么办? 哨兵 哨兵(sentinal)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并

  • 浅谈Redis主从复制以及主从复制原理

    面临问题 1. 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不会使用 Redis 了. 2. 容量瓶颈.当我们有需求需要扩容 Redis 内存时,从 16G 的内存升到 64G,单机肯定是满足不了.当然,你可以重新买个 128G 的新机器. 解决办法 要实现分布式数据库的更大的存储容量和承受高并发访问量,我们会将原来集中式数据库的数据分别存储到其他多个网络节点上.Redis 为了解决这个

  • Redis之windows下主从复制案例讲解

    一般的主从复制功能最少是一主二从,我这里就以最低要求进行配置. 1.首先下去官网下载并安装redis 若安装成功点击redis-server  如此是成功 2.点击客户端redis-cli 连接客户端即可使用 3.新建7000.7001两个从redis  4.修改redis-windows.conf   (1)把端口修改成7000 (2)修改cluster-config-file的名字 以免和6379端口的名字重复其他配置默认即可,我个人认为我们都重新建了一个文件夹也不可能出现和6379重复的错

  • Redis持久化与主从复制的实践

    为什么需要持久化 Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之后,redis存放在内存的数据就会丢失,为了解决这个问题,redis提供了两种持久化方式,以便在发生故障后恢复数据. 持久化选项 redis提供了两种不同的持久化方式来将数据存储到硬盘中.一种是快照方式(也叫RDB方式),它可以将莫一时刻存在于redis中的所有数据存储到硬盘:另一种叫只追加文件(AOF)方式,它会定时的复制redis执行的所有写命令到硬盘.这两种持久化方式各有千

  • 详解Redis主从复制实践

    复制简介 Redis 作为一门非关系型数据库,其复制功能和关系型数据库(MySQL)来说,功能其实都是差不多,无外乎就是实现的原理不同.Redis 的复制功能也是相对于其他的内存性数据库(memcached)所具备特有的功能. Redis 复制功能主要的作用,是集群.分片功能实现的基础:同时也是 Redis 实现高可用的一种策略,例如解决单机并发问题.数据安全性等等问题. 服务介绍 在本文环境演示中,有一台主机,启动了两个 Redis 示例. 实现方式 Redis 复制实现方式分为下面三种方式:

  • 浅谈Redis哨兵模式的使用

    概述 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工 干预,费事费力,还会造成一段时间内服务不可用.这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式.Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题. 谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库. 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独 立运行.其原理是哨兵通过发送命令,

  • Redis超详细讲解高可用主从复制基础与哨兵模式方案

    目录 高可用基础---主从复制 主从复制的原理 主从复制配置 示例 1.创建Redis实例 2.连接数据库并设置主从复制 高可用方案---哨兵模式sentinel 哨兵模式简介 哨兵工作原理 哨兵故障修复原理 sentinel.conf配置讲解 哨兵模式的优点 哨兵模式的缺点 高可用基础---主从复制 Redis的复制功能是支持将多个数据库之间进行数据同步,主数据库可以进行读写操作.当主数据库数据发生改变时会自动同步到从数据库,从数据库一般是只读的,会接收注数据库同步过来的数据. 一个主数据库可

  • Redis缓存实例超详细讲解

    目录 1 前言 1.1 什么是缓存 1.2 缓存的作用及成本 1.3 Redis缓存模型 2 给商户信息添加缓存 3 缓存更新策略 3.1 更新策略介绍 3.2 主动更新策略 3.3 主动更新策略练习 4 缓存穿透及其解决方案 4.1 缓存穿透的概念 4.2 解决方案及实现 5 缓存雪崩的概念及其解决方案 6 缓存击穿及解决方案 6.1 什么是缓存击穿 6.2 缓存击穿解决方法 6.2.1 互斥锁 6.2.2 逻辑过期 1 前言 1.1 什么是缓存 缓存就是数据交换的缓冲区(称作Cache [

  • C语言超详细讲解循环与分支语句基础

    目录 写在开始 1. 分支语句 1.1 if语句 1.2 switch 2. 循环语句 2.1 while()语句 2.2 do while()语句 2.3 for 语句 for语句中表达式的省略 break在循环语句中的作用 continue 在循环语句中的应用 总结: 写在开始 在内容开始之前给大家介绍一下在计算机中如何表示真假 0表示假,非0表示真. 1. 分支语句 分支语句也叫做条件选择语句,主要分为if语句和switch语句. 1.1 if语句 if()…{} else if()…{}

  • SpringCloud超详细讲解Feign声明式服务调用

    目录 入门案例 @FeignClient注解详解 Feign Client的配置 Feign请求添加headers 负载均衡 (Ribbon) 容错机制 Hystrix支持 Sentinel支持 Feign开启容错机制支持后的使用方式 请求压缩feign.compression 日志级别 入门案例 在服务消费者导入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>

  • 超详细讲解Java异常

    目录 一.Java异常架构与异常关键字 Java异常简介 Java异常架构 1.Throwable 2.Error(错误) 3.Exception(异常) 4.受检异常与非受检异常 Java异常关键字 二.Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 1.直接抛出异常 2.封装异常再抛出 3.捕获异常 4.自定义异常 5.try-catch-finally 6.try-with-resource 三.Java异常常见面试题 1.Error 和 Excepti

  • Python OpenCV超详细讲解读取图像视频和网络摄像头

    0.准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 1.读取图像调用imread()方法获取我们资源文件夹中的图片使用imshow()方法显示图片,窗口名称为OutputwaitKey(0)这句可以让窗口一直保持,如果去掉这句,窗口会一闪而过 我们来看下效果: 2.读取视频VideoCapture()方法的参数就是视频文件循环中通过read不断地去读视频的每一帧,再通过imshow显示出来最后if语句代表按q可以退出程

  • Python OpenCV超详细讲解调整大小与图像操作的实现

    目录 准备工作 重新调整图像大小 图像裁剪 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 查看图像大小 调用imread()方法获取我们资源文件夹中的图片lambo.png 输出图像的shape属性 img=cv2.imread("Resources/lam

  • Java SpringMVC数据响应超详细讲解

    目录 1)页面跳转   2)回写数据 3)配置注解驱动 4)知识要点 1)页面跳转   直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转.  返回带有前缀的字符串: 转发: forward:/WEB-INF/views/index.jsp 重定向: redirect:/index.jsp 通过ModelAndView对象返回 @RequestMapping("/quick2") public ModelAndView quickMethod2(){ ModelAn

  • C语言数组超详细讲解中篇三子棋

    目录 前言 1.三子棋是什么? 1.1 百度百科 1.2 游戏编程准备工作 2. 程序实现 2.1 搭建程序框架 2.2 模块化编程 2.2.1 源文件test.c 2.2.2 源文件play.c 2.2.3 头文件play.h 2.3 程序实现—拓展play函数 2.3.1 棋盘初始化与打印函数 2.3.2 玩家下棋函数 PlayMover 2.3.3 电脑下棋函数 ComputerMove 2.2.4 判断赢家函数 WhoIsWin 总结 前言 本文主要是对前面所学内容进行复习和练习,学习内

  • C语言函数超详细讲解上篇

    目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.1.1 如何学会使用库函数 2.1.2 自定义函数 3.函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4.函数的调用 4.1 传值调用 4.2 传址调用 4.3 练习 4.3.1 判断一个数是不是素数 4.3.2 判断一年是不是闰年 4.3.3 二分查找 4.3.4 数值自增增加1 5.函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 总结 前言 本文主要学习函数的相关内容. 1.函数是什么?

随机推荐