百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis高可用故障转移 Redis Sentinel 哨兵模式 从配置到编码一气呵成

mhr18 2025-03-20 16:38 22 浏览 0 评论

满怀忧思,不如先干再说!



主从复制出现的问题


上篇文章《Redis主从复制》中我们说到可以对Redis单节点数据进行备份实现Redis高可用,但是如果master节点宕机并不会自动做故障切换等,导致项目中更可能需要接入多数据源,编写代码实现故障切换非常麻烦,Redis考虑到这个问题提供了哨兵模式,也就是Redis Sentinel


Redis Sentinel基本架构


看图我们说一下Redis Sentinel架构,首先我们需要加入Sentinel节点,Sentinel节点去监控Redis中Master和Slave的运行状态,判断是否可用,当然Sentinel节点也是有多个的,实现Sentinel节点的高可用和多节点判断Redis节点是否可用不会出现误判情况


客户端不再直接操作Redis的Master或者Slave节点,而是去访问Sentinel节点!所以我们的客户端会记录Redis Sentinel的地址!我们的客户端不关心谁是Master而是Sentinel告诉客户端谁是Master,后台Master切换了,客户端也不会受到影响!


当多个sentinel发现并确认master出现问题,会选举出一个sentinel作为领导,选举出一个slave为新的master,通知其余的slave有新的master产生,通知客户端master发生变化,等待老的master复活成为新的master的slave!


一套sentinel可以同时监控多套master和slave!节省资源!每套master/slave会有一个master-name作为标识以示区别



安装和配置


集群规划


  1. 配置开启主从节点,一个master端口号为7000,两个slave节点分别问70017002;
  2. 配置开启sentinel监控主节点。(sentinel是特殊的redis节点,不存储数据),三个sentinel分别为26379,26380,26381



配置描述


master


port 7000
daemonize yes
pidfile /var/run/redis/redis-7000.pid
logfile "7000.log"
dir "/usr/local/redis-5.0.5/data/"


slave-7001


命令:sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf


将7000替换为7001


命令:echo "slaveof stt101 7000" >> redis-7001.conf


重定向slaveof stt101 7000redis-7001.conf文件末尾


port 7001
daemonize yes
pidfile /var/run/redis/redis-7001.pid
logfile "7001.log"
dir "/usr/local/redis-5.0.5/data/"
slaveof stt101 7000


slave-7002


port 7002
daemonize yes
pidfile /var/run/redis/redis-7002.pid
logfile "7002.log"
dir "/usr/local/redis-5.0.5/data/"
slaveof stt101 7000

配置完之后启动三个节点查看主从关系:


redis-cli -p 7000 info replication


sentinel主要配置


#三台sentinel使用端口区别
port ${port}
dir "/usr/local/redis-5.0.5/data/"
logfile "${port}.log"
#监控主节点名字为mymaster,ip,端口,2台sentinel认为master有问题就会故障转移
sentinel monitor mymaster ip port 2
#30000毫秒ping不通认为出现问题
sentinel down-after-milliseconds mymaster 30000
#选择了新的master之后老的slave会对新的slave进行复制,1代表每次只有一个slave进行复制,减轻master压力
sentinel parallel-syncs mymaster 1
#故障转移时间
sentinel failover-timeout mymaster 180000


注意:在redis的安装目录下有一个sentinel.conf文件就是sentinel的配置文件,我们将这个文件拷贝到conf目录下,去除注释等。给出一个26739的配置,其余的两台大家只需修改端口号了pid文件即可


第一台的配置
port 26379
daemonize yes
pidfile "/var/run/redis/redis-sentinel-26379.pid"
logfile "26379.log"
dir "/usr/local/redis-5.0.5/data"
#stt101为ip映射
sentinel monitor mymaster stt101 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
protected-mode no

#通过该命令将sentinel.conf文件去掉注释和换行将内容放到redis-sentinel-26739.conf文件中
cat sentinel.conf | grep -v "#" | grep -v "^$" > redis-sentinel-26739.conf
#启动
redis-sentinel redis-sentinel-26739.conf

#配置其他两台,三台配置是一样的,修改端口和日志文件,pid文件即可
sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf


启动


# 使用redis-sentinel命令读取配置文件分别启动三台sentinel节点
# 记得修改文件名哦
redis-sentinel redis-sentinel-26739.conf

# 分别启动三台Redis节点
redis-server redis-6379.conf

# 通过客户端连接上sentinel节点
redis-cli -h 192.168.109.101 -p 26379



这里大家注意一下:有些可能有疑问,上边端口不是7000吗下边咋变成6379了,搞咩啊,之前在写的时候,这里有一点小瑕疵,我直接重写了,端口号上下没有对应起来,这里声明一下,之前的7000,7001,7002分别对应下文的6379,6380,6381,如果没有发现问题,是不没认真看啊!


启动之后查看状态


大家看下边动图,名字为6379, 6380, 6381的为redis节点,名字为26379的为sentinel节点,演示节点状态和故障转移



  • 首先在redis sentinel下查看address是6381,说明其为主节点
  • 之后将6381kill掉,等待一段时间,这里时间大概在30S左右,这段时间我暂停了
  • 之后再查看info信息,发现address变为6380


SpringBoot集成Redis Sentinel演示


这个思路也很简单,我们循环添加或者查询数据,将主节点手动宕机,查看日志打印是否成功切换继续读写数据即可,我们只需要修改application.yml配置文件即可


配置文件


spring:
  redis:
    #host: 192.168.109.101  #这是之前单机时的ip配置
    #port: 6379              # 这个是单机时的端口配置,现在都不用写了
    sentinel:
      # 写sentinel节点的ip:port
      nodes: 192.168.109.101:26379,192.168.109.102:26380,192.168.109.103:26381
      # 写sentinel节点的名字,因为sentinel可以有很多组,每一组使用名字区分
      master: mymaster
    timeout: 2s
      #连接池最大连接数(使用负值表示没有限制)
    max-active: 2000
      #连接池最大阻塞等待时间(使用负值表示没有限制)
    max-wait: -1ms
      #连接池中的最大空闲连接
    max-idle: 1024
      #连接池中的最小空闲连接
    min-idle: 100


代码


/**
添加数据
*/
@Test
public void test7(){
   //循环,添加数据
   for (int i = 0; i < 200 i string key='key-' i string value='value-' i try redistemplate.opsforvalue.setkeyvalue thread.sleep500 system.out.println key>" + value);
     } catch (InterruptedException e) {
		e.printStackTrace();
	 }catch (Exception e){
		e.printStackTrace();
	 }
   }
   System.out.println("数据插入完成");
}

/**
查询数据
*/
@Test
public void test8(){
   //编写循环,添加数据
   for (int i = 0; i < 200; i++) {
        String key = "key-" + i;
        try {
            Object o = redisTemplate.opsForValue().get(key);
            //慢一点
            Thread.sleep(500);
            System.out.println("当前获取:" + o );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


演示


这里我又将刚刚关闭的6381节点启动,三个节点提供服务,进行演示,一样的动图送给大家,这里只贴出插入数据的动图了,查询的类似,大家动手做一做试一下!



基本原理

由三个定时任务实现的切换


每10S一个info


每10秒每个sentinel节点会对master和slave发送一个info命令,一是为了发现slave节点,二是为了确认主从关系



每2秒交换信息


每2秒每个sentinel通过master节点的channel交换信息(pub/sub),相当于一个sentinel的交互平台,交互对master/slave状态的监听情况和自身的信息。通过一个名为__sentinel__:hello的频道交互,每个sentinel节点都会订阅这个频道



每秒1ping


每一秒每个sentinel节点对其他sentinel和redis执行一次ping,这一步基于第一步sentinel掌握redis的master和slave节点的状况,基于第二步sentinel节点知道其他的sentinel节点,对他们进行心跳检测,判断是否在正常工作


收藏等于学会!别忘了点赞,关注哦,高频推出技术文章,有问题记得评论或者私信!

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: