侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

玩转Redis搭建集群之Sentinel详解

Redis  /  管理员 发布于 7年前   143

前言

Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失。我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务。但是Redis集群是不会自动进行主从切换的,也就是说,如果主节点非常不争气的在凌晨3点挂了,那么运维同学就要马上起床,把从节点改成主节点,这样的操作是非常繁琐低效的。为此,Redis官方提供了一种解决方案:Redis Sentinel

简介

Redis Sentinel集群通常由3到5个节点组成,如果个别节点挂了,集群还可以正常运作。它负责监控Redis集群的健康情况。如果主节点挂掉,Sentinel集群会通过投票选择一个新的主节点。当原来的主节点恢复时,它会被当做新的主节点的从节点重新加入Redis集群。

基本原理

Sentinel集群通过指定的配置文件发现master,对其进行监控,并且会发送info指令获取master的从节点信息。Sentinel集群中的节点通过向其监控的主从节点发送hello信息(包含Sentinel本身的ip、端口和id等内容)来向其他Sentinel宣告自己的存在。

Sentinel集群通过订阅连接来接收其他Sentinel的hello信息。

Sentinel集群通过ping命令来检查监控的实例状态,如果在指定时间内没有返回,则认为该实例下线。

Sentinel触发failover主从切换后,并不会马上进行,只有指定(quorum)Sentinel授权后,master节点被标记为ODOWN状态。这时才真正开始投票选择新的master。

Sentinel选择新的master的原则是:首先判断优先级,选择优先级较小的;如果优先级相同,查看复制下标,选择复制数据较多的;如果复制下标也相同,就选择进程ID较小的。

Sentinel被授权后,它将会获得宕掉的master的一份最新配置版本号(config-epoch),当failover执行结束以后,这个版本号将会被用于最新的配置,通过广播形式通知其它Sentinel,其它的Sentinel则更新对应master的配置。

基本使用

我们以Python为例,简单说明一下在客户端如何使用Sentinel

from redis.sentinel import Sentinelif __name__ == '__main__': sentinel = Sentinel(['localhost', 26379], socket_timeout=0.1) print(sentinel.discover_master('mymaster')) print(sentinel.discover_slaves('mymaster')) master = sentinel.master_for('mymaster', socket_timeout=0.1) slave = sentinel.slave_for('mymaster', socket_timeout=0.1) master.set('follow', 'Jackeyzhe2018') follow = slave.get('follow') print(follow)

master_for和slave_for方法会从连接池中拿出一个连接来使用,如果从地址有多个,则会采用轮询的方法。

当redis发生了主从切换时,客户端如何知道地址已经变更了呢?我们从redis-py的源码里找一找答案。

可以看到,redis在创建一个新的连接时,会调用get_master_address方法来获取主节点地址。get_master_address方法中,客户端先查询主节点地址,然后与内存中的地址进行比较。如果不一致,则会断开连接,然后使用新的地址重新进行连接。

如果主节点没有挂,而Sentinel主动进行了主从切换,对于这种情况redis-py也做了处理。就是捕获一个ReadOnlyError的异常,然后断开连接,后续指令都需要重新进行连接了。当然,如果没有修改性指令,那么连接就不会切换,不过数据也不会被破坏,所以影响不大。

动手搭建

关于Sentinel的工作原理和使用方法我们已经有了大概的认识,为了加深理解,我们来自己动手搭建一套Sentinel集群。

首先搭建我们我需要的redis集群环境

安装好redis后,将redis目录下的配置文件redis.conf复制3份。分别命名为redis6379.conf,redis6380.conf,redis6381.conf。

在redis6381.conf文件中修改以下几项

bind 127.0.0.1port 6381logfile "6381.log"dbfilename "dump-6381.rdb"

在redis6379.conf中修改

bind 127.0.0.1port 6379logfile "6379.log"dbfilename "dump-6379.rdb"slaveof 127.0.0.1 6381

redis6380.conf的修改参照redis6379.conf。修改完成后,分别启动三个实例。就搭建好了我们想要的redis主从环境了。

我们连接上master节点,可以看到它的主从配置信息

接着,我们来配置Sentinel集群。这里我们同样配置三个实例。复制3份sentinel.conf文件,分别命名为sentinel-26379.conf,sentinel-26380.conf和sentinel-26381.conf。

sentinel-26379.conf文件中编辑以下内容

port 26379 daemonize yes logfile "26379.log" dir /home/xxx/redis/data sentinel monitor mymaster 127.0.0.1 6381 2sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000

sentinel-26380.conf和sentinel-26381.conf的内容与上述类似。配置好后,我们使用命令redis-sentinel来启动3个sentinel实例。

此时,我们用redis-cli命令连接26379的实例,查看sentinel的信息。

发现它已经开始监控我们的3个redis节点了。这时我们的整个集群就部署好了,接下来测试一下。

kill掉master节点,查看sentinel的日志,会发现sentinel已经按照我们前面说的步骤选择了新的master。

此时再来看sentinel信息。

此时,6380已经成了新的master。

恭喜你,以后都不需要在凌晨起床切换Redis主从实例了。

总结:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对AIDI的支持。


  • 上一条:
    redis简单介绍及安装使用小结
    下一条:
    redis通过位图法记录在线用户的状态详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Redis中能实现的功能、常见应用介绍(0个评论)
    • 2024年Redis面试题之一(0个评论)
    • 在redis缓存常见出错及解决方案(0个评论)
    • 在redis中三种特殊数据类型:地理位置、基数(cardinality)估计、位图(Bitmap)使用场景介绍浅析(2个评论)
    • Redis 删除 key用 del 和 unlink 有啥区别?(1个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-12
    • 2020-03
    • 2020-05
    • 2021-04
    • 2022-03
    • 2022-05
    • 2022-08
    • 2023-02
    • 2023-04
    • 2023-07
    • 2024-01
    • 2024-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客