redis 哨兵

文章目录

      • 前言
      • 主从复制的问题
        • 怎么人工恢复故障主节点
      • Redis Setinel 架构
      • 使用 docker 来配置哨兵结构
        • 安装 docker
        • 编排 redis 主从节点
        • 编排 redis 哨兵节点
      • 观察哨兵模式的作用
      • 主从切换的具体流程
      • 小结

前言

redis 主从复制模式下, 一旦主节点出现故障, 不能提供服务的时候, 就需要人工进行主从切换. 这是十分不靠谱的, 毕竟谁也不知道主节点什么时候出现故障, 这样就无法第一时间恢复服务. 所以 redis 从 2.8 版本开始提供了 哨兵(Redis Sentinel) 模式, 可以通过自动化手段来解决主节点出现故障的问题.

主从复制的问题

redis 主从复制是将主节点的数据同步给从节点, 这样从节点就拥有主节点的所有数据, 这样客户端就可以从从节点这边来读取数据, 来分担主节点所要承受的并发量. 但是主从复制也有一些问题:

  1. 主节点发生故障的时候, 这时整个 redis 服务就失去了写入数据的功能, 这时就需要程序员手动干预来将从节点切换成主节点.
  2. 主从复制可以将读的并发量分担给从节点, 但是写压力/存储压力是无法被分担的, 还是受到单机的限制.

其中第一个问题就是哨兵模式主要解决的问题, 而第二个问题是 redis 集群模式解决的问题, 本章主要讨论第一个问题.

怎么人工恢复故障主节点

首先程序员会先看看主节点挂的原因, 并且尝试能不能抢救, 如果知道原因并且容易恢复主节点的功能, 就直接将主节点恢复即可.

如果不好定位原因, 或者知道原因, 但是短时间之内不能恢复, 这时, 程序员就需要挑一个从节点, 设置成主节点:

  1. 在挑选出来的从节点上执行 slaveof no one, 使其脱离故障的主节点.
  2. 在其它的从节点上执行 slaveof 新主节点ip 新主节点端口, 使其连上新的主节点.
  3. 告知客户端(修改客户端的配置), 让客户端能够连接新的主节点, 用来完成修改数据的操作.

当之前挂了的主节点修好了之后, 就可以作为一个新的从节点, 加入到这个分布式系统中.

上述恢复操作涉及到了人工干预, 人工干预的过程也是有可能出错的, 如果配置的时候不小心配置错误了, 可能就会导致更严重的问题. 而且人工干预也是需要时间的, 在集群配置好之前, 整个 redis 服务都不能进行写操作, 这段时间多少都会造成损失.

所以, redis 引入了哨兵模式, 就能解决上述问题.

Redis Setinel 架构

如图所示, redis 哨兵模式也是加入了一个集合, 里面有若干个哨兵节点, 这几个哨兵节点会监控现有的 redis master 和 slave(建立 tcp 长连接, 并定期发送心跳包). 借助监控机制, 就可以及时发现某个主机是否挂了. 如果从节点挂了, 不会有多大影响, 并不影响整个集群的读写功能. 如果是主节点挂了, 哨兵就要发挥作用了.

  1. 此时一个哨兵节点发现主节点挂了, 还不够, 需要有多个哨兵节点来认同这个主节点挂了(防止单个哨兵误判).
  2. 如果主节点确实挂了, 这些哨兵节点中就会挑选出一个 leader, 由这个 leader 负责从现有的从节点中, 挑选一个作为新的主节点.
  3. 挑选出新的主节点之后, 哨兵节点就会自动控制该被选中的从节点, 执行 slaveof no one, 并且控制其他从节点, 修改主从结构到新的主节点上.
  4. 哨兵节点会自动通知客户端程序新的主节点是哪个, 并且后续客户端再进行写操作, 就会针对新的主节点进行操作了.

redis 哨兵核心功能:

  1. 监控: 监控主节点的状态, 当主节点出现故障, 及时做出处理
  2. 自动的故障转移: 自动的完成挑选从节点替换主节点操作
  3. 通知: 通知客户端新的主节点

如果只设置一个哨兵节点, 会出现的问题:

  1. 单个哨兵节点如果故障了, 就无法监控主节点的情况, 就无法进行自动恢复的过程了.
  2. 出现误判的概率高, 网络传输的数据容易出现抖动, 延迟或者丢包的, 如果只有一个哨兵节点, 出现上述问题的概率就很高, 就会导致单个哨兵节点出现误判, 影响比较大.

使用 docker 来配置哨兵结构

安装 docker

这里使用一台服务器来部署哨兵结构, 由于手动部署多个节点非常麻烦, 所以使用 docker 来配置更为轻松.

此处是基于 Ubuntu 环境进行配置

  1. 安装 docker 和 docker-compose
apt install docker-compose
  1. 停止之前的 redis-server
service redis-server stop
  1. 使用 docker 来获取 redis 镜像
docker pull redis:5.0.9
编排 redis 主从节点
  1. 创建 docker 的配置文件 docker-compose.yml
mkdir redis
cd redis
mkdir redis-data
cd redis-data
vim docker-compose.yml

配置如下:

version: '3.7'
services:
  sentinel1:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-1
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/etc/redis/sentinel.conf
    ports:
      - 26379:26379
  sentinel2:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-2
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/etc/redis/sentinel.conf
    ports:
      - 26380:26379
  sentinel3:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-3
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/etc/redis/sentinel.conf
    ports:
      - 26381:26379
networks:
  default:
    external:
      name: redis-data_default
  1. 启动所有容器
docker-compose up -d
编排 redis 哨兵节点
  1. 创建 docker 的配置文件 docker-compose.yml
cd redis
mkdir redis-sentinel
vim docker-compose.yml

配置如下:

version: '3.7'
services:
  sentinel1:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-1
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/etc/redis/sentinel.conf
    ports:
      - 26379:26379
  sentinel2:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-2
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/etc/redis/sentinel.conf
    ports:
      - 26380:26379
  sentinel3:
    image: 'redis:5.0.9'
    container_name: redis-sentinel-3
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/etc/redis/sentinel.conf
    ports:
      - 26381:26379
networks:
  default:
    external:
      name: redis-data_default
  1. 创建哨兵节点的配置文件
    创建三个配置文件 sentinel1.conf, sentinel2.conf, sentinel3.conf, 其中三个配置文件的内容都相同:
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

解释一下配置文件中的配置:

  1. sentinel monitor 主节点名 主节点ip 主节点端口 法定票数
    • 其中, 法定票数的解释: 比如当工作时, 其中某个哨兵节点的网络出现问题, 但是主节点仍正常工作, 此时这个哨兵节点就可能产生误判, 认为主节点挂了. 所以哨兵模式是采用投票的方式来判断主节点是否挂了, 这个方案更为稳妥. 当某个哨兵节点发现主节点挂了之后, 就会发起投票, 当认为主节点挂了的票数 >= 法定票数的时候, 哨兵集群才真正认为主节点挂了, 从而采取后面进一步的操作.
  2. sentinel down-after-milliseconds 主节点ip 超时时间
    • 主节点和哨兵之间根据心跳包来进行沟通, 如果心跳包在指定时间之内还没有响应, 就认为主节点挂了.
  1. 启动所有容器
docker-compose up -d

到这步, redis 哨兵结构就配置完成了.

观察哨兵模式的作用

此时已经将三个主从节点和三个哨兵节点都提起来了:

这时, 手动将主节点停掉, 来模拟主节点故障:

docker stop redis-master

当主节点挂了之后, 哨兵节点就开始工作了, 观察哨兵节点的日志:

  • 在 redis-sentinel 目录下
    docker-compose logs
    

由于三个节点的日志都大差不差, 只观察一个节点的日志即可:

可以看到, 当 master 节点挂了之后, 哨兵节点首先先发现主节点 sdown, 然后开始投票, 当票数达到 3/2 的时候, 达到法定票数, 于是 master 节点被判定为 odown.

  • sdown: 主观下线(SubjectivelyDown), 当前哨兵节点认为该主节点挂了.
  • odown: 客观下线(ObjectivelyDown), 多个哨兵节点都认为该节挂了, 达成了一直(达到法定票数), 此时才认为 master 节点确实挂了.

接下来, 哨兵节点就会挑选出一个节点来作为主节点, 如图中的 switch-master 操作

主从切换的具体流程

  1. 主观下线: 哨兵节点通过心跳包判定 redis 服务器是否正常工作, 如果心跳包在一定时间内没有响应, 说明 redis 服务器挂了. 此时还不能排除网络波动的影响, 因此只能单方面认为 redis 主节点挂了.

  2. 客观下线: 多个哨兵节点认为主节点挂了, 即认为主节点挂了的哨兵节点个数达到法定票数, 此时就认为是客观下线.

  3. 让多个哨兵节点选出一个 leader 节点, 由这个 leader 负责选出一个从节点作为新的主节点

    • 观察上述 sentinel1 的日志可以看到:通过刚刚的配置文件中的信息可以得知:

      sentinel1 的 id 为: bc48b2a2e35a8a0fedb95cd5095916f5c9b560db

      sentinel2 的 id 为: 7ca7cb5c9d0707e9558aa984fb647ebfb8d0223f

      sentinel3 的 id 为: ba6a0e8374a1efbc5837ce8301a9d0b498468ea7

      上述过程中, sentinel1 先给自己投了一票, 接着 sentinel2 给自己投了一票, sentinel3 给 sentinel2 投了一票, 此时 sentinel2 就为 leader.

  4. 此时 leader 选组完毕, leader 就需要挑选一个从节点来作为新的主节点.

    • 挑选规则:
      1. 比较优先级: 在配置文件中的 slave-priority 或者 replica-priority 可以设置优先级, 优先级高的就会胜出.
      2. 比较 offset: 比较从节点从主节点中同步数据的进度, offset 越大, 说明从主节点这边同步的数据越多, offset 大的节点会被挑选成为主节点
      3. run id: redis 节点启动时生成的随机数, 谁的 id 小, 谁就会被挑选.

当新的主节点指定好之后, leader 就会控制这个节点, 执行 slaveof no one, 成为 master, 再控制其它节点, 执行 slaveof, 让这些节点以新的 master 作为主节点.

小结

上述过程都是自动完成的, 这样就解决了主节点宕机之后需要人工干预的问题, 提高了系统的稳定性和可用性.

还需要注意一些事项:

  • 哨兵节点不能只有一个, 否则哨兵节点挂了也会影响系统的可用性.
  • 哨兵节点最好是奇数个, 方便选举 leader, 得票容易超过半数.
  • 哨兵节点不负责存储数据, redis 主节点负责存储.
  • 主从复制 + 哨兵解决的问题是 “提高可用性”, 不能解决 “数据极端情况下写丢失” 的问题.
  • 主从复制 + 哨兵不能提高数据的存储容量. 当我们需要存的数据接近或者超过机器的物理内存, 这样的结构就难以胜任了, 这时就需要下一章节所讲的 redis 集群来解决了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/521148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷题之Leetcode283题(超级详细)

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nu…

第十讲 Query Execution Part 1

1 处理模型【Processing Model】 DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。 针对不同的工作负载进行不同的权衡。 方法1:迭代器模型【Iterator Model】 方法2:物化模型【Materialization Model】 方…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程,使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为线程执行体。…

数据结构之堆底层实现的循序渐进

题外话 把没写的都补回来! 正题 堆 概念 堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来高效存储, 大根堆:指根结点比左右孩子都大的堆 小根堆:指根结点比左右孩子都小的堆 性质 1.堆中某个节点的值总是不大于或不小于其父节点的值 2…

CCIE-14-MPLS_and_BGP

目录 实验条件网络拓朴 环境配置开始配置配置MPLSR1访问R6检测结果R6访问R1检测结果 实验条件 网络拓朴 环境配置 在我的资源里可以下载&#xff08;就在这篇文章的开头也可以下载&#xff09; 开始配置 R1<->R2&#xff1a;EBGP R2<->R5&#xff1a;IBGP&…

蓝桥杯备考3

P8196 [传智杯 #4 决赛] 三元组 题目描述 给定一个长度为 n 的数列 a&#xff0c;对于一个有序整数三元组 (i,j,k)&#xff0c;若其满足 1≤i≤j≤k≤n 并且&#xff0c;则我们称这个三元组是「传智的」。 现在请你计算&#xff0c;有多少有序整数三元组是传智的。 输入格式…

小米手机澎湃OS,不Root查看电池健康

首先&#xff0c;在键盘拨号界面&#xff0c;输入*#*#284#*#*&#xff0c;会调用问题反馈APP来生成当前系统的故障日志&#xff0c;如果提示你需要授权什么就点确认 稍等几分钟&#xff0c;会得到一个压缩包&#xff0c;保存在目录MIUI/debug_log下 这里为了方便&#xff0c;我…

肖恩带你学C语言·文件操作(上)

1. 为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的保存&…

打造自然资源“一张图”管理平台,推动生态文明建设新篇章

在信息化时代的浪潮下&#xff0c;自然资源管理正面临着前所未有的挑战与机遇。传统的资源管理模式已经难以满足当前生态环境保护与经济发展的双重需求&#xff0c;我们需要一个全新的平台&#xff0c;一个集信息集成、智能分析、决策支持于一体的自然资源“一张图”管理平台。…

数据可视化-地图可视化-Python

师从黑马程序员 基础地图使用 基础地图演示 视觉映射器 具体颜色对应的代码可以在http://www.ab173.com/中查询RGB颜色查询对照表 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts#准备地图对象 mapMap() #准备数据 data[("北京",…

c语言结构体变量和结构体数组的练习(自用版)

结构体变量注释和结构体数组练习&#xff08;已注释&#xff09;代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> struct Student {char name[20];int age;char sex;float score;char addr[30]; };int main() {//练习结构体变量struct Student s…

SSL/TLS:网络安全中的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

c# wpf LiveCharts 简单试验2

1.概要 1.1 说明 1.2 要点 1.2.1 添加命名控件 xmlns:lvc"clr-namespace:LiveCharts.Wpf;assemblyLiveCharts.Wpf" 1.2.2 图片控件 <lvc:CartesianChart Name"chart" LegendLocation"Right"/> 1.3 代码文件引用 using LiveCharts…

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…

刷题之Leetcode844题(超级详细)

844.比较退格的字符串 844. 比较含退格的字符串https://leetcode.cn/problems/backspace-string-compare/ 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 注意&#xff1a;如…

5G网络架构及技术(二):OFDM一

ToDo: 等把这些讲义看完后得单开一个文章整理思维导图   该部分由于内容比较重要&#xff0c;OFDM是5G物理层的基础&#xff0c;但学习时直接跳到5G OFDM去看它的那些参数设置感觉没什么意义&#xff0c;还得从发展的角度进行学习&#xff0c;先从最先用到OFDM的WiFi协议开始…

CSS-属性

&#x1f4da;详见 W3scholl&#xff0c;本篇只做快速思维索引。 CSS 背景 用于定义元素的背景效果。 background-colorbackground-imagebackground-positionbackground-repeatbackground-attachment background-color background-color 属性指定元素的背景色。 h1 {back…

专题【链表】【考试题】刷题日记

题目列表 考试题&#xff08;22题&#xff09; 2024.04.04 146. LRU 缓存 707. 设计链表 138. 随机链表的复制 160. 相交链表 622. 设计循环队列 109. 有序链表转换二叉搜索树 460. LFU 缓存 355. 设计推特 725. 分隔链表 2487. 从链表中移除节点 日常复习题 876. 链表的中…

机器学习(理论第一课)

一、理解人工智能、机器学习、深度学习、强化学习&#xff1f; 人工智能、机器学习和深度学习之间存在递进关系&#xff0c;它们的覆盖范围逐层递减。 **人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;**是最宽泛的概念&#xff0c;旨在研究、开发用于…

好物周刊#49:字幕交流网站

https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. Starship 轻量、迅速、可无限定制的高颜值终端&#xff0c;可用于各种 Shell 的提示符。 2. spring cloud shop …