哨兵模式(sentinel)

news2024/12/23 17:23:36

为什么需要哨兵模式

redis的主从复制模式能够缓解“读压力”,但是存在两个明显问题。

  1. 主节点发生故障,进行主节点切换的过程比较复杂,需要人工参与,导致故障恢复时间无法保障
  2. 主节点通过主从复制模式将读压力分散出去,但是写压力/存储压力无法被分散,受单机的限制

其中第一个问题是高可用问题,可以通过redis哨兵模式解决。第二个问题是存储分布式问题,要通过redis集群解决。本篇只讨论第一个问题。

哨兵模式

通过人工的方式解决主节点故障,不靠谱。而哨兵模式可以自动解决主节点故障问题。
哨兵机制是通过独立的进程实现的,即redis sentinel,和redis-server是不同的进程。redis sertinel不负责存储数据,只是对redis-server进程起到监控效果。
并且哨兵节点,也会搞一个集合。防止单个节点发生故障,而且单个节点容易出现误判(网络传输数据容易出现抖动,延迟,丢包,会误认为主节点发生故障)

人工恢复主节点故障

  1. image.png

服务器需要7*24运行,为了保证服务器能够长期运行,程序员会写一个监控程序来监控服务器的运行状态。当服务器出现问题,就会通知程序员,程序员会先看看主节点能不能修复

  1. image.png

如果主节点挂的原因不好定位,或者原因知道,但是短时间难以解决就需要挑一个从节点,设置为新的主节点。

  1. image.png
  1. 把选中的从节点通过slaveof no one,脱离原来的主节点
    2)把其他从节点,修改slaveof的主节点ip和port,连上新的主节点。
  1. image.png

修改客服端的配置,让客服端连接上新的主节点

  1. image.png

当之前挂的主节点修复完成后,就可以作为一个新的从节点,挂到这组机器中

哨兵自动恢复主节点故障

image.png
哨兵集合中有多个单独的redis sentinel进程,这三个哨兵进程会监控现有的redis masterslave.

监控:sentinel进程会和主从节点建立tcp长连接,定期发送心跳包。如果发送ping,没有返回pong意味着这个主机挂了。

  1. 如果从节点挂了,问题不太严重,如果主节点挂了,哨兵就会发挥作用。

一个哨兵节点发现主节点挂了,还不够,需要多个哨兵节点共同认同这件事情,防止出现误判

  1. 确认主节点挂了,这些哨兵节点就会推举出一个leader,由这个leader负责从现有的从节点中,挑选一个作为新的主节点
  2. 挑选出新的主节点后,哨兵节点会自动控制被选中的节点,执行slaveof no one并且控制其他从节点,修改slaveof到新的主节点上
  3. 哨兵节点自动通知客服端程序现在主节点是哪个,并且后续客服端再进行写操作,就会针对新的主节点进行操作

image.png

redis哨兵的核心功能:

  1. 监控:sentinel节点会定期检测redis数据节点
  2. 故障转移:实现从节点晋升为主节点并维护后续正确的主从关系
  3. 通知:sentinel节点会将故障转移的结果通知给应用方

安装部署(基于docker)

咱们要安装上图哨兵模式中的6个节点,是需要6个不同的服务器。但是我只有1个服务器,因此只能在一个云服务器下安装。如果我们按照主从结构配置的方式进行部署,容易出现端口/配置文件/数据文件各种问题,比较繁琐,也和在不同主机上部署存在较大差异。因此我们采docker部署。

docker可以认为是一个“轻量级”虚拟机,起到虚拟机这样隔离环境的效果,但是又不吃很多硬件资源。

docker安装

  1. 确认操作系统:centos7/8/9,咱们采用centos7

使用cat /etc/*release*命令查看linux版本是否符合
image.png

  1. 确认cpu架构: ARM/x86_64

使用uname -a命令查看当前的cpu架构
image.png

  1. 查看是否下载过docker

使用docker命令,或docker version命令
image.png
我的linux中并没有安装过

如果存在docker

  1. 卸载旧版本
    :::tips
    yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
    :::
  2. 卸载历史版本
    :::tips
    #删除机器上的包
    sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    #删除目录
    sudo rm -rf /var/lib/docker 4.
    sudo rm -rf /var/lib/containerd
    :::
  1. 配置仓库
    :::tips
    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    #配置国内源
    sed -i ‘s@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g’ /etc/yum.repos.d/docker-ce.repo
    :::

  2. 安装最新版本
    :::tips
    yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    :::

  3. 启动docker
    :::tips
    #加载配置
    systemctl daemon-reload
    #查看服务状态
    systemctl status docker
    #启动服务
    systemctl start docker
    #开机自启动
    systemctl enable docker
    :::

  4. 检查安装结果查看版本
    :::tips
    docker version
    :::

  5. 更详细的查看docker信息
    :::tips
    docker info
    :::

  6. 执行hello-world看到Hello from Docker,表明docker服务正常
    :::tips
    docker run hello-world
    :::

  7. 配置docker国内的镜像源,加速下载镜像
    :::tips
    mkdir /etc/docker
    cd /etc/docker
    vim daemon.json
    {
    “registry-mirrors”: [“http://hub-mirror.c.163.com”,“https://registry.docker-cn.com”,“https://docker.mirrors.ustc.edu.cn”]
    }
    #重新加载配置
    systemctl daemon-reload
    #重启docker
    systemctl restart docker
    docker info
    image.png
    :::

  8. 修改docker目录

docker中有很多镜像,为了防止磁盘不够用,需要将他挂载到大磁盘的目录上
:::tips
#假定我们大磁盘的目录为 /data ,
mkdir /data/var/lib/docker -p
cd /etc/docker/
vim daemon.json
#输入下面的json
{
“data-root”: “/data/var/lib/docker”
}
#重新加载配置
systemctl daemon-reload
#重启docker
systemctl restart docker
#查看docker信息
docker info
image.png
:::

安装redis

  1. 安装docker-compose:docker中可以安装很多容器,容器之间存在依赖关系,因此引入docker-compose来帮助我们编排这些容器
    :::tips
    yum install docker-compose
    :::

  2. 停止redis进程,防止后续出现干扰
    :::tips
    service redis-server stop
    ps aux | grep redis
    通过kill -9杀死其他端口的redis进程
    :::

  3. 使用docker获取redis镜像
    :::tips
    docker pull redis:5.0.9
    :::

docker中的镜像类似于”可执行程序“,容器类似于”进程“。docker pull使用docker从中央仓库拉取镜像。拉取到的镜像包含一个精简的Linux操作系统并且上面安装有redis,只要基于这个镜像创建一个容器跑起来,此时redis服务器就搭建好了
image.png

  1. 使用docker-compose编排redis-server节点

咱们需要安装3个redis-server和3个redis哨兵节点,每个redis server或者redis sentinel都是一个单独的容器,使用docker-compose方便安装。
具体是通过一个yml格式的配置文件,把要创建那些容器,每个容器运行的各种参数,描述清楚即可。后续通过一个命令,就能批量的启动/停止这些容器。
咱们通过两个yml文件来配置,一个yml文件配置redis server节点,一个yml文件配置redis的哨兵节点。

其实也可以只使用1个yml文件,但是如果6个容器同时启动,可能哨兵节点先启动,数据节点后启动,哨兵就会误认为数据节点挂了。虽然影响不大,但是会影响观察执行日志的过程。

:::tips
mkdir redis
cd redis
mkdir redis-data
mkdir redis-sentinel
cd redis-data/
vim docker-compose.yml
:::

version: '3.3'
services:
 master:
   image: 'redis:5.0.9'
   container_name: redis-master
   restart: always
   command: redis-server --appendonly yes
   ports:
     - 6379:6379
 slave1:
   image: 'redis:5.0.9'
   container_name: redis-slave1
   restart: always
   command: redis-server --appendonly yes --slaveof redis-master 6379
   ports:
     - 6380:6379
 slave2:
   image: 'redis:5.0.9'
   container_name: redis-slave2
   restart: always
   command: redis-server --appendonly yes --slaveof redis-master 6379
   ports:
     - 6381:6379

image.png

  1. 启动所有redis-server容器
    :::tips
    docker-compose up -d
    :::

如果启动后发现前面的配置有误,需要重新操作,使用docker-compose down即可停止并删除刚才创建好的容器

  1. 可以通过docker ps -a查看搭建好的redis节点

image.png

  1. 编排redis-sentinel节点
    1. 编写docker-compose.yml

image.png

version: '3.3'
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: redisdata_default

image.png

  1. 创建配置文件

创建sentinel1.conf``sentinel2.conf``sentinel3.conf三份内容一致,都放到/root/redis-sentinel/目录中

bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

image.png
image.png

  1. 启动redis-sentinel
    :::tips
    docker-compose up -d
    :::

  2. 观察redis-sentinel的配置的rewrite

启动完以后,再次打开哨兵的配置文件,发现文件内容已经被自动修改
image.png

模拟主节点宕机情况

  1. 手动将redis-master干掉
    :::tips
    docker stop redis-master
    :::

  2. 观察哨兵日志
    :::tips
    docker-compose logs
    :::
    image.png

sdown: 主观下线,本哨兵节点,认为该主节点挂了
odown:客观下线,其他节点也认为主节点挂了,票数超过一半

  1. 查看redis-server

image.png
image.png

  1. 重新连上原来的主节点
    :::tips
    docker start redis-master
    :::
    image.png

哨兵选举主节点流程

  1. 主观下线:哨兵节点通过心跳包,判定redis服务器是否正常工作,如果超过心跳包时间,说明服务器挂了。(此时可能是由于网络抖动造成,因此只能是单方面认为redis节点挂了)
  2. 客观下线:多个redis节点认为主节点挂了(投票超过法定票数)
  3. 在多个哨兵节点,选出一个leader节点,由这个leader节点负责选一个从节点作为新的主节点
    1. 3号哨兵第一个发现主节点掉线,立即投自己一票,推荐自己成为leader,并告诉1和2号哨兵节点(类似于拉票)

image.png

  1. 1号哨兵节点给哨兵3投票

image.png

  1. 2号哨兵节点给哨兵3投票

image.png

谁网络延迟小,谁是leader

  1. 选举完leader,leader需要挑选一个从节点,作为主节点
    1. 优先级:每个redis数据节点,在配置文件中有一个优先级设置slave-priority,选择优先级高的slave节点
    2. offset:offset是从节点从主节点同步数据的进度,数值越大,说明从节点的数据和主节点越接近。选择offset大的从节点
    3. runid:当上面都一样时,选择谁都没差别了。runid是redis节点启动时随机生成的一串数字,根据runid大小选择

注意事项

  1. 哨兵节点不能只有一个,否则哨兵节点挂了容易影响系统可用性
  2. 哨兵节点最好是奇数个,方便选举leader,得票数更容易过半数
  3. 哨兵节点不存储数据,仍然是redis主节点负责存储
  4. 主从+哨兵解决的是“可用性”问题,不能解决“数据极端情况下写丢失”问题
  5. 主从+哨兵不能提高数据的存储容量,当我们需要存的数据接近或超过机器的物理内存,这样的结构很难胜任,需要引入集群

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】算法设计与分析 课程笔记 第一章 概述

第一章 算法概述 算法的性质 算法的四个性质:输入、输出、确定性和有穷性。 算法的时间复杂度 1. 常见的时间复杂度 常数阶 O(1) 对数阶 O(log n) 线性阶 O(n) 线性对数阶 O(nlog n) 平方阶 O(n^2) 立方阶 O(n^3) k 次方阶 O(n^k) 指数阶 O(2^n) 注&…

Prompt 策略:代码库 AI 助手的语义化搜索设计

在过去的一周里,为了更好的构建 AI Agent 框架 Chocolate Factory(以下简称 CF),我们加入了一个新的应用:代码库 AI 助手。 在设计时,为了更好的在框架底层提供这种能力,我们参阅了 Bloop 应用、…

科研小工具|慢性阻塞性肺疾病全球创议

简介 慢性阻塞性肺疾病全球创议(the Global Initiative for Chornic Obstructive Lung Disease,GOLD)是慢性阻塞性肺疾病(COPD)诊断、治疗与预防在全球范围内的标准。颁布GOLD的目的在于,增加医疗卫生工作…

pdd24版滑块

最近pdd改版了,在原来的基础之上加了一个content字段,然后pdd滑块分为两个大类。 一个是22类型的,在之前的文章里面有介绍,感兴趣也可以去看看。 详情的滑块跟普通的版本不同,但是有的算法也沿用了之前22版的东西&a…

【Seata】05 - Seata Saga 模式简单整理、Docker 部署 Nacos 单机(基于 Jpom)相关配置

文章目录 前言参考目录Saga 模式知识点简单整理1、适用场景、优缺点2、Saga 模式的使用3、可能出现的问题以及解决方法 Docker 部署 Nacos 单机(基于 Jpom)步骤 1:拉取镜像步骤 2:构建容器步骤 3:Nacos 设置 Seata 配置…

安装Python第三方库

视频版教程 Python3零基础7天入门实战视频教程 在Python的标准安装中,包含了一组自带的模块,这些模块被成为“标准库”。比如常用的math,random,datetime,os,json等等。 此外,还有很多的第三方模块,或者叫做库也行,叫…

TienChin 渠道管理-配置校验失败信息

新建 ValidationMessages.properties: channel.name.notnull渠道名称不能为空 channel.type.notnull渠道类型不能为空 channel.status.notnull渠道状态不能为空 channel.type.invalid渠道类型无效 channel.status.invalid渠道状态无效

linux上安装redis

这篇文章简单地介绍一下怎么在linux虚拟机上完成redis的安装。 首先,访问Redis官网,点击首页的【Get Started】,然后点击Install Redis on Linux 然后按照页面内容提示,在Ubuntu上安装redis 只需要在终端依次输入以下命令&#xf…

面试官:Vue实例挂载的过程中发生了什么?

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、思考 一、分析 三、结论 一、思考 我们都听过知其然知其所以然这句话 那么不知道大家是否思考过new Vue()这…

权限提升WIN篇(腾讯云,CS,MSF)

溢出漏洞 信息收集 操作系统版本ver,systeminfo漏洞补丁信息systeminfo操作系统位数systeminfo杀软防护tasklist /svc网络netstat -ano,ipconfig当前权限whoami 筛选EXP 根据前面的信息收集中的系统版本,位数和补丁情况筛选出合适的EXP 提权 根据EX…

JVM——4.垃圾回收

这篇文章我没来讲一下JVM中的垃圾回收。这是比较重要,内容也比较多的一篇文章。 目录 1.垃圾回收概述 2.如何判断对象可以回收 2.1引用计数法 2.2可达性分析算法 2.2.1GCRoot的选取 2.3再谈引用 2.3.1强引用 2.3.2软引用 2.3.3弱引用 2.3.4虚引用 2.3.5…

2023关于赴日IT培训你需要了解的

有人还是好奇日本IT行业真的那么缺人吗?我告诉你:缺!和中美完全不同的是,日本的IT行业面临着非常严重的程序员缺口。根据日本经济产业省进行的“关于IT人才供需的调查”,预计到2030年,日本IT行业将会有45万…

进程的就绪、执行、阻塞和挂起

假设我们有一个进程, 它需要的资源有CPU, 资源A(在进程创建时为其分配), 资源B(进程运行时才发现需要资源B), 现在用这个进程来分析一下进程的几种状态. 先看图: 图1: 进程的几种状态 1. 创建 --> 就绪(资源A): 操作系统为进程分配资源A, 进程进入就绪态, 等待CPU. 进程当…

ICS TRIPLEX T8310 自动化控制模块

ICS TRIPLEX T8310 是一种自动化控制模块,通常用于工业控制和自动化系统中,以实现对各种过程和设备的自动控制。以下是可能包括在 ICS TRIPLEX T8310 自动化控制模块中的一些常见产品功能: PLC(可编程逻辑控制器)功能&…

树结构构建,字典树快速生成。

表结构 查出list后&#xff0c;用工具类转换。工具类代码如下&#xff1a; 下面展示一些 内联代码片。 public static List<JSONObject> toTreeList(List tList, String oidkey, Stripspidkey) List<JSONObject> jsonObjectList JSONArray. parseArray (JSON.…

公司电脑监控软件哪个好?(常用公司电脑监控软件有哪些?)

随着科技的发展&#xff0c;公司对员工电脑的监控已经成为了企业管理的重要手段。然而&#xff0c;如何选择合适的公司电脑监控软件&#xff0c;以及如何避免员工发现&#xff0c;成为了企业管理者需要面对的问题。 一、公司电脑监控软件哪个好&#xff1f; 针对公司电脑监控软…

Hive工作原理

Hive 工作原理详解-阿里云开发者社区 Hive的服务端组件 1. Driver组件&#xff1a;该组件包括&#xff1a;Compiler、Optimizer、Executor,它可以将Hive的编译、解析、优化转化为MapReduce任务提交给Hadoop1中的JobTracker或者是Hadoop2中的SourceManager来进行实际的执行相应…

《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存

《数字图像处理-OpenCV/Python》连载&#xff08;7&#xff09;视频文件的读取与保存 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为…

记录一下 ThinkPHP 使用JWT进行身份验证

ThinkPHP使用JWT身份验证 1.composer安装jwt&#xff0c;安装命令&#xff1a;composer require firebase/php-jwt 安装成功后会在vendor目录下生成firebase目录文件 第二步&#xff1a;生成token 先引入jwt use Firebase\JWT\JWT; public function getToken($user){//使…

安达发|APS软件多工厂架构引领生产管理新革命

APS多工厂架构是一种生产管理系统&#xff0c;它通过将多个工厂的生产过程进行整合和优化&#xff0c;实现了生产效率的提高和成本的降低。在APS多工厂架构中&#xff0c;每个工厂都有自己的生产线和生产计划&#xff0c;但是它们之间可以进行协调和协作&#xff0c;以确保整个…