Redis进阶(四):哨兵

news2024/10/1 23:46:59

        为了解决主节点故障,需要人工操作切换主从的情况;因此需要一种方法可以自动化的切换:哨兵的引入大大改变这种情况。

哨兵的基本概念

自动切换主从节点

        哨兵架构

1、当一个哨兵节点发现主节点挂了的时候,还需要其他节点也去检测一下这个主节点到底是不是真的挂了(防止误判)。

2、发现是真的挂了之后,哨兵 节点推举一个leader之后,选一个slave作为新的主节点

3、挑选新的主节点之后,哨兵节点自动的将从节点slave no one 脱离主节点的控制,并且控制其他的从节点归附到这个新的主节点身上。

4、哨兵节点会自动通知客户端,告知新的主节点是谁,并且后续客户端进行写操作就是针对新的主节点了。 

 因此  redis 哨兵核心功能 : 1.监控  2.自动的故障转移  3.通知

搭建哨兵

        准备工作(基于docker)

docker可以认为是一个轻量级的虚拟机:隔离环境,不吃硬件资源

docker-compose:管理一组docker容器

镜像:docker中的镜像和容器类似于 可执行程序 和 进程 的关系

镜像(Mirroring)是一种文件存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。

容器 (Container) 泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品。

在云原生技术中,容器就是将软件(镜像)打包成标准化单元,以用于开发、交付和部署。

  • 容器可以是镜像的一个实例
  • 镜像是文件,容器是进程
  • 镜像为静态,而容器可能为动态

镜像准备好之后,拉取的镜像里面包含了一个精简的Linux操作系统,并且上面安装了redis,基于镜像创建容器跑起来即可。

搭建redis哨兵环境

创建数据节点

修改配置文件:

version: '3.7'
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

redis -cli -p进行验证

创建哨兵节点

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 

创建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

启动哨兵节点:

docker-compose up -d

但要注意的是,docker-compose启动多个容器:处于同一个局域网中,可以使这个容器相互访问,当时哨兵节点配置文件中的sentinel monitor注明的是另一个局域网(三个redis-server节点是一个局域网),并不能访问,

docker network ls

列出当前docker中的局域网

修改配置文件即可达成修改局域网:

networks:
 default:
  external:
   name: redis-data_default 

name的获取从 列出当前docker中的局域网(docker network ls) 获取到

查看日志

docker-compose logs

重新选举

手动干掉主节点后观察日志:

确定主节点挂了之后,就需要选拔新的主节点

redis-master重启之后
docker start redis-master

Redis主节点如果宕机,会把其中的⼀个从节点,提拔成主节点.

当之前的Redis主节点重启之后,这个主节点被加⼊到哨兵的监控中,但是只会被作为从节点使⽤.

主从切换的具体流程 

1.主观下线

哨兵节点通过心跳包判定redis服务器是否正常工作,如果没有心跳包了,说明redis节点挂了,但是此时不能排除网络波动影响,只能单方面认为该节点挂了

2.客观下线

多个哨兵认为主节点挂了:认为挂了的哨兵节点数目达到法定票数,哨兵们就认为该主节点客观下线

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

示例:

此时一号哨兵成为leader

每个哨兵只有一票,当哨兵1发现当前主节点客观下线之后,就立即给自己投一票,并且告诉了2,3哨兵节点,(当他们没有投票的时候,收到投票请求就会投出去)如果总的票数超过了哨兵总数的一半,选举完成(哨兵总数常设为奇数)

 4.此时leader选举完毕,leader需要挑选一个从节点作为主节点:

a.优先级:每个redis数据节点都会在配置文件中,有一个优先级设置,slave-priority,优先级高的节点会win

b.offset 优先级相同比较offset,offset:从节点从主节点同步数据的进度,挑选offset大的节点作为主节点

c.run id 每个redis节点启动的时候随机生成的一串数字:此时选谁都行,随机挑一个。看run id 更小

5.新的主节点选好之后,leader会控制这个节点执行slave no one,成为master。并且控制其他节点执行slave of,让这些其他节点 “认主” 。

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

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

相关文章

Cyber Weekly #18

赛博新闻 1、Google 狂卷小模型,2B 参数 Gemma 2 赶超 GPT-3.5 Google本周发布了开源的轻量级、高性能模型 Gemma 2 2B。它拥有 20 亿参数,是从更大规模的模型中提炼而来的,在 LMSYS 大模型竞技场的得分超越了 GPT-3.5 和 Mixtral 8x7B。该…

【12.PIE-Engine案例——加载Landsat 7 SR单景影像】

原始路径 欢迎大家登录航天宏图官网查看本案例原始来源 最后结果 具体代码 /*** File : Landsat7SRImage* Time : 2020/7/21* Author : piesat* Version : 1.0* Contact : 400-890-0662* License : (C)Copyright 航天宏图信息技术股份有限公司* Desc …

429总线协议

传输方式 单向方式:信息只能从通信设备的发送口输出,经传输总线传至与它相连的需要该信息的其他设备的接口。在两个通信设备间需要双向传输时,则每个方向上各用一个独立的传输总线。 编码方式 信号从高电平回归零电平表示逻辑状态1&#x…

卡码网--数组篇(移除元素)

系列文章目录 文章目录 系列文章目录前言27. 移除元素总结 前言 代码随想录:详情链接 27. 移除元素 力扣27 https://leetcode.cn/problems/remove-element/description/ Step1: 读题: 原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的…

MySQL基础练习题22-第二高的薪水

目录 题目 准备数据 分析数据 题目 查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Employee (id int, sa…

JavaDS —— AVL树

前言 本文章将介绍 AVL 树的概念,重点介绍AVL 树的插入代码是如何实现的,如果大家对 AVL 树的删除(还是和二叉搜索树一样使用的是替换删除法,然后需要判断是否进行旋转调整)感兴趣的话,可以自行去翻阅其他…

WaitGroup

第一节:WaitGroup 概述 1. WaitGroup 简介 WaitGroup 是 Go 语言标准库 sync 包中的一个并发同步工具,它用于协调主 goroutine 与多个工作 goroutine 的执行。通过计数器跟踪还未完成的工作 goroutine 的数量,WaitGroup 能够确保主 goroutin…

Mybatis-Plus-常用的注解:@TableName、@TableId、@TableField、@TableLogic

1、TableName 经过之前的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表由此得出结论,MyBatis-Plus在确定操作…

宝塔8.0开心版安装命令

使用方法 Centos安装脚本 yum install -y wget \&\& wget -O install.sh https://BTKXB.com/install/install_6.0.sh \&\& sh install.sh Ubuntu/Debian安装脚本 wget -O install.sh https://BTKXB.com/install/install_6.0.sh \&\& bash install.…

十天口语笔记

看 到 Part 2 的话题是要求描述过去的经历,可以在1 分钟思考时间刚开始时就把-ed写在考官给你记notes的纸上提示自己 01

【MySQL】索引——索引的引入、认识磁盘、磁盘的组成、扇区、磁盘访问、磁盘和MySQL交互、索引的概念

文章目录 MySQL1. 索引的引入2. 认识磁盘2.1 磁盘的组成2.2 扇区2.3 磁盘访问 3. 磁盘和MySQL交互4. 索引的概念4.1 索引测试4.2 Page4.3 单页和多页情况 MySQL 1. 索引的引入 海量表在进行普通查询的时候,效率会非常的慢,但是索引可以解决这个问题。 -…

COMSOL金属氢化物-放氢过程

在此记录下放氢过程的软件设置思路 1、采用的是"达西定律""层流" 物理场,其中"层流"物理场选择了”弱可压缩流动“,这里主要是选择”可压缩流动“的话,算出来的瞬时流量值跟实测差距太大了。 2、设置"达西…

【Elegant Programming (优雅的编程)】如何用合理的封装优雅的化解三层以上的 if-else ?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

数据结构与算法 - 二叉树

1. 概述 二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 完全二叉树:是一种二叉树结构,除了最后一层以外,每一层都必须填满,填充时要遵循从左到右 平衡二叉树:是一种二叉树…

基础算法之模拟

1P1093 [NOIP2007 普及组] 奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1093https://www.luogu.com.cn/problem/P1093 #include<iostream> #include<algorithm> using namespace std; struct stu {int num;//编号int c…

尚品汇-首页三级分类实现-nginx静态代理生成的静态页面(二十六)

目录&#xff1a; &#xff08;1&#xff09;问题详解 &#xff08;2&#xff09;首页商品分类实现 &#xff08;3&#xff09;修改web-all模块 &#xff08;4&#xff09;页面渲染 &#xff08;1&#xff09;问题详解 &#xff08;2&#xff09;首页商品分类实现 前面做了…

【书生大模型实战营(暑假场)】入门任务三 Python 关卡

入门任务二 Python 关卡 参考&#xff1a; 教程任务 1 闯关任务 1.1 使用 Python 实现 wordcount import stringdef wordcount(text):# 去除标点符号text text.translate(str.maketrans(, , string.punctuation))# 转换为小写text text.lower()# 分割字符串成单词列表wo…

CH571F蓝牙orUSB摇杆鼠标

演示视频&#xff1a; 短视频刷个爽 程序基本上是基于官方的例程上改的&#xff0c;用到的例程有&#xff1a;蓝牙的HID_Mouse,USB的CompoundDev&#xff0c;还有ADC&#xff0c;按键中断。 主要原理 就是ADC采集采集摇杆电压&#xff0c;通过蓝牙HID或者USB的HID发送给电脑或…

文心一言 VS 讯飞星火 VS chatgpt (317)-- 算法导论22.3 9题

九、请给出如下猜想的一个反例&#xff1a;如果有向图G包含一条从结点u到结点v的路径&#xff0c;则任何对图G的深度优先搜索都将导致v.d⩽u.f。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;我们需要澄清问题中的几个关键点。在图的深度优先…

想做抖音短视频,视频素材去哪里找啊?

各位抖音上的短视频创作者们&#xff0c;是否曾幻想过自己的作品能够在全网爆火&#xff0c;却常因为缺少那些能够让视频更加生动的素材而感到困扰&#xff1f;不用担心&#xff0c;今天我要为大家介绍几个优秀的视频素材网站&#xff0c;让你的抖音之路顺风顺水&#xff01; …