Redis哨兵集群搭建及其原理

news2024/11/17 6:43:11

Redis哨兵集群搭建及其原理

  • 1.Redis哨兵
    • 1.1.哨兵原理
      • 1.1.1.集群结构和作用
      • 1.1.2.集群监控原理
      • 1.1.3.集群故障恢复原理
      • 1.1.4.小结
  • 2.搭建哨兵集群
    • 2.1.集群结构
    • 2.2.准备实例和配置
    • 2.3.启动
    • 2.4.测试
  • 3.RedisTemplate
    • 3.1.引入依赖
    • 3.2.配置Redis地址
    • 3.3.配置读写分离

1.Redis哨兵

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。

1.1.哨兵原理

1.1.1.集群结构和作用

哨兵的结构如图:

在这里插入图片描述

哨兵的作用如下:

  • 监控:Sentinel 会不断检查您的master和slave是否按预期工作
  • 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
  • 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

1.1.2.集群监控原理

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

•主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线

•客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

在这里插入图片描述

1.1.3.集群故障恢复原理

一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点
  • 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
  • 最后是判断slave节点的运行id大小,越小优先级越高。

当选出一个新的master后,该如何实现切换呢?

流程如下:

  • sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
  • sentinel给所有其它slave发送slaveof 192.168.150.101 7002 命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
  • 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点

在这里插入图片描述

1.1.4.小结

Sentinel的三个作用是什么?

  • 监控
  • 故障转移
  • 通知

Sentinel如何判断一个redis实例是否健康?

  • 每隔1秒发送一次ping命令,如果超过一定时间没有相向则认为是主观下线
  • 如果大多数sentinel都认为实例主观下线,则判定服务下线

故障转移步骤有哪些?

  • 首先选定一个slave作为新的master,执行slaveof no one
  • 然后让所有节点都执行slaveof 新master
  • 修改故障节点配置,添加slaveof 新master

2.搭建哨兵集群

2.1.集群结构

这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。如图:

在这里插入图片描述

三个sentinel实例信息如下:

节点IPPORT
s1192.168.150.10127001
s2192.168.150.10127002
s3192.168.150.10127003

2.2.准备实例和配置

要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。

我们创建三个文件夹,名字分别叫s1、s2、s3:

# 进入/tmp目录
cd /tmp
# 创建目录
mkdir s1 s2 s3

如图:

在这里插入图片描述

然后我们在s1目录创建一个sentinel.conf文件,添加下面的内容:

port 27001
sentinel announce-ip 192.168.150.101
sentinel monitor mymaster 192.168.150.101 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"

解读:

  • port 27001:是当前sentinel实例的端口
  • sentinel monitor mymaster 192.168.150.101 7001 2:指定主节点信息
    • mymaster:主节点名称,自定义,任意写
    • 192.168.150.101 7001:主节点的ip和端口
    • 2:选举master时的quorum值

然后将s1/sentinel.conf文件拷贝到s2、s3两个目录中(在/tmp目录执行下列命令):

# 方式一:逐个拷贝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道组合命令,一键拷贝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf

修改s2、s3两个文件夹内的配置文件,将端口分别修改为27002、27003:

sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf

2.3.启动

为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:

# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

启动后:

在这里插入图片描述

2.4.测试

尝试让master节点7001宕机,查看sentinel日志:

在这里插入图片描述

查看7003的日志:

在这里插入图片描述

查看7002的日志:

在这里插入图片描述

3.RedisTemplate

在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。

下面,我们通过一个测试来实现RedisTemplate集成哨兵机制。

3.1.引入依赖

在项目的pom文件中引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.2.配置Redis地址

然后在配置文件application.yml中指定redis的sentinel相关信息:

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.150.101:27001
        - 192.168.150.101:27002
        - 192.168.150.101:27003

3.3.配置读写分离

在项目的启动类中,添加一个新的bean:

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

这个bean中配置的就是读写策略,包括四种:

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
  • REPLICA:从slave(replica)节点读取
  • REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master

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

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

相关文章

Centos8安装ffmpeg,使用mediamtx搭建RTSP流媒体服务器

文章目录 1、Centos安装ffmpeg2、使用mediamtx搭建媒体服务器 1、Centos安装ffmpeg 1、先安装epel-release yum install epel-release2、安装nux存储库 rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/…

[NSSROUND#12]杂项记录

文章目录 [NSSRound#12 Basic]Bulbasaur[NSSRound#12 Basic]Secrets in Shadow[NSSRound#12 Basic]奇怪的tex文件[NSSRound#12 Basic]坏东西[NSSRound#12 Basic]ordinary forensics[NSSRound#12 Basic]Noisy Cube[NSSRound#12 Basic]ability[NSSRound#12 Basic]strange python …

数据结构课程设计——集合的交、并和差运算

集合的交、并和差运算 数据结构课程设计任务书 学生姓名&#xff1a; 专业班级&#xff1a; 软件工程 指导教师&#xff1a; 工作单位&#xff1a; 题 目: 集合的并、交和差运算 基础要求&#xff1a; 掌握数据结构与…

最全iOS 上架指南

一、基本需求信息。 1、苹果开发人员账户&#xff08;公司已经可以无需申请&#xff0c;需要开启开发者功能&#xff0c;每年99美元&#xff09; 2、开发好应用程序 二、证书 上架版本需要使用正式证书。 1、创建Apple Developer证书 2、上传证书Sign In - Apple 3、点击开发者…

pyqt5:py处理C语言格式数组和有符号数的转换(备忘录)

文章目录 1.问题&#xff1a;把下面的数组所表示的正弦波用曲线描绘出来。1.1 将C语言数组直接替换为py数组1.2 使用numpy读入数组1.3完整代码 2.从正弦波数据生成C数组2.1 正弦波数据2.2 负数转成16位带符号整型公式2.3 负数转成16位带符号整型 完整代码 3. 生成正弦波数据的代…

ASEMI代理英飞凌IPA65R650CE功率MOS管中文资料

编辑-Z IPA65R650CE是一款高性能功率晶体管&#xff0c;旨在满足现代电子应用日益增长的需求。这种先进的半导体器件提供了高效、低功耗和优异热性能的独特组合&#xff0c;使其成为广泛应用的理想选择&#xff0c;包括电源、电机驱动和可再生能源系统。 IPA65R650CE的主要功能…

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年&#xff0c;程序员们找工作可以说是不怎么费力的&#xff0c;不少求职者还会比对几家offer&#xff0c;看薪酬、看加不加班、看通勤时间等等等等&#xff0c;最后选择自己最满意的那一家过去。 但是今年&#xff0c;情况确实完全不一样&#xff0c;用网友的话形容就是“往…

vs code ts运行、断点调试解决方案

序&#xff1a; 1、解决ts在vs code里直接运行&#xff0c;并在终端直接看结果 2、解决ts 断点调试问题&#xff08;博主这个调试算的上全网最简单的设置方法了&#xff09;。 3、ts-node : 无法加载文件 C:\Program Files\nodejs\ts-node.ps1,因为在此系统上禁去看这篇》ts-no…

Velocity模板与itextpdf联合生成pdf

pom <!-- velocity模板引擎 --><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><!-- itext7html转pdf --><depende…

LeetCode刷题(ACM模式)-01数组

参考引用&#xff1a;代码随想录 注&#xff1a;每道 LeetCode 题目都使用 ACM 代码模式&#xff0c;可直接在本地运行&#xff0c;蓝色字体为题目超链接 0. 数组理论基础 数组&#xff08;array&#xff09;是存放在连续内存空间上的相同类型数据的集合&#xff0c;是一种复合…

【哪些人不适合学习云计算?看看有没有你!】

云计算作为是互联网技术革命的重要一员&#xff0c;也是区别于一般IT职业的。作为高级技工&#xff0c;不是谁都能学会&#xff0c;也不是谁都适合这个技术。优秀的云计算工程师能让技术成为炫耀的资本&#xff0c;玩得神乎其技&#xff0c;引得众人追捧。我想这也是大部分热爱…

Cam APP-HAL流程追踪之demo梳理

一、基础知识 1、Google官网的Cam流程如下图1 2、Cam的预览、拍照、录像是分开的 Cam的预览、拍照、录像是各自独立的-换句话说可以不开启预览拍照或者录像–后面代码会详细介绍&#xff1b;市场上的成品Cam应用&#xff0c;打开Cam后直接打开了预览&#xff0c;然后可以拍照…

【数据结构】线性表之栈、队列

前言 前面两篇文章讲述了关于线性表中的顺序表与链表&#xff0c;这篇文章继续讲述线性表中的栈和队列。 这里讲述的两种线性表与前面的线性表不同&#xff0c;只允许在一端入数据&#xff0c;一段出数据&#xff0c;详细内容请看下面的文章。 顺序表与链表两篇文章的链接&…

最新社区论坛小程序源码 含流量主功能+前后端+部署搭建教程

分享一个社区论坛小程序源码&#xff0c;含完整前后端代码包和详细的部署搭建教程&#xff0c;做地方运营很适合&#xff0c;集成了流量主功能&#xff0c;一键轻松开启。 系统功能一览&#xff1a; 广场管理&#xff1a;广场列表&#xff0c;圈子列表&#xff0c;圈子审核 帖…

CE作业(4)

一、准备前提 服务端 客户端 ; 关闭防火墙systemctl stop firewalld 关闭selinux setenforce 0 提供DNS服务的软件叫bind&#xff0c;服务名是named 一、正向解析&#xff1a; 1.装包 yum install bind -y 2.配置服务 vim /etc/named.conf #监听53号端口 #访问的是本…

​数据库原理及应用上机(实验三 SQL数据查询)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验 ​ 目录 ✨一、实验目的和要求 ✨二、实验内容及步骤 ✨三、实验结果 ✨四、附加练习 ✨五、实验总结 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理…

用别人的钱创咖啡的业,戴威与陆正耀殊途同归?

文 | 新熔财经 作者 | 和花 近四年来&#xff0c;ofo退押一事没有出现任何明显的转机&#xff0c;但ofo创始人戴威却已经在海外大张旗鼓地开启了名为About Time Coffee的新创业项目。 当“ofo创始人戴威再次创业”的消息登上微博热搜&#xff0c;收获的几乎都是“还钱”的征…

字符串按规则生成字典

带数字的字符串以数字为key倒序生成字典&#xff0c;字符串列表按其元素索引为key倒序生成字典。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简…

实验室云检验信息系统(云LIS源码)

一、区域云LIS系统概述&#xff1a; 区域云LIS平台源码&#xff0c;系统完全采用B/S架构模式&#xff0c;扩展性强。整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件有外网即可访问。 云LIS系统为实验室服务对象提供检验申请、采集标本、结果查…

【IDEA使用码云教程】

IDEA使用码云教程 一、下载、安装git二、配置Gitee插件三、克隆项目四、上传项目五、推送项目六、更新项目 一、下载、安装git 1.打开git官网&#xff0c;选择你的操作系统 官网下载地址&#xff1a;https://git-scm.com/downloads 2.根据你的系统位数选择相应的版本下载 系统…