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
复制代码

1from redis.sentinel import Sentinel 2 3if name == 'main': 4 sentinel = Sentinel(['localhost', 26379], socket_timeout=0.1) 5 print(sentinel.discover_master('mymaster')) 6 print(sentinel.discover_slaves('mymaster')) 7 master = sentinel.master_for('mymaster', socket_timeout=0.1) 8 slave = sentinel.slave_for('mymaster', socket_timeout=0.1) 9 master.set('follow', 'Jackeyzhe2018') 10 follow = slave.get('follow') 11 print(follow) master_for和slave_for方法会从连接池中拿出一个连接来使用,如果从地址有多个,则会采用轮询的方法。

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

图片描述(最多50字)

图片描述(最多50字)

可以看到,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文件中修改以下几项
复制代码

1bind 127.0.0.1 2port 6381 3logfile "6381.log" 4dbfilename "dump-6381.rdb" 在redis6379.conf中修改

1bind 127.0.0.1 2port 6379 3logfile "6379.log" 4dbfilename "dump-6379.rdb" 5slaveof 127.0.0.1 6381 redis6380.conf的修改参照redis6379.conf。修改完成后,分别启动三个实例。就搭建好了我们想要的redis主从环境了。

图片描述(最多50字)

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

图片描述(最多50字)

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

1port 26379
2daemonize yes
3logfile "26379.log"
4dir /home/xxx/redis/data
5sentinel monitor mymaster 127.0.0.1 6381 2 6sentinel down-after-milliseconds mymaster 30000
7sentinel parallel-syncs mymaster 1
8sentinel failover-timeout mymaster 180000 sentinel-26380.conf和sentinel-26381.conf的内容与上述类似。配置好后,我们使用命令redis-sentinel来启动3个sentinel实例。

图片描述(最多50字)

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

图片描述(最多50字)

发现它已经开始监控我们的3个redis节点了。这时我们的整个集群就部署好了,接下来测试一下。kill掉master节点,查看sentinel的日志,会发现sentinel已经按照我们前面说的步骤选择了新的master。
复制代码

图片描述(最多50字)

此时再来看sentinel信息。此时,6380已经成了新的master。恭喜你,以后都不需要在凌晨起床切换Redis主从实例了。
复制代码

欢迎工作一到五年的Java工程师朋友们加入Java架构开发: 855835163 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

玩转 Redis 集群之 Sentinel相关推荐

  1. 玩转Redis集群之Sentinel

    Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失.我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务.但是Re ...

  2. 玩转Redis集群(下)

    接上一篇<玩转Redis集群(上)>,我们来继续玩~ Redis集群操作实践 数据的分布性 从上面的操作,你可以看到,当存储某一个数据的时候,会分配一个slot,而这个slot从属于某一个 ...

  3. c语言课程设计微博管理系统,支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)...

    上篇文章<支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)>介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建.配置,运维.扩容等具体操作 集群搭建 ...

  4. 玩转Redis集群之Cluster

    前面我们介绍了国人自己开发的Redis集群方案--Codis,Codis友好的管理界面以及强大的自动平衡槽位的功能深受广大开发者的喜爱.今天我们一起来聊一聊Redis作者自己提供的集群方案--Clus ...

  5. 玩转Redis集群之Codis

    近几年,随着互联网的飞速发展,作为程序员,我们需要处理的数据规模也在不断扩大.如果你使用Redis作为数据库时,面临大数据高并发的场景时,单个Redis实例就会显得力不从心.这时Redis的集群方案应 ...

  6. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    大家一定非常熟悉如何利用Docker启动单个Redis容器用于开发环境,本文将介绍如何利用Docker Compose模板在本机和云端部署基于Sentinel的高可用Redis 3集群. Redis集 ...

  7. Redis集群:哨兵(Sentinel)

    Redis Sentinel机制与用法说明(哨兵模式) 1.主Redis与各个从Redis之间能够实现高可用(监控.自动故障迁移等),这个委托给redis-sentinel来实现.  2.业务代码中为 ...

  8. Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件

    对于redis-sentinel我在之前的文章中Redis集群~StackExchange.redis连接Twemproxy代理服务器 已经说过,它是一个仲裁者,当主master挂了后,它将在所有sl ...

  9. Redis 集群搭建(三):Docker 部署 Redis + Sentinel 高可用集群

    Redis 集群搭建(三):Docker 部署 Redis + Sentinel 高可用集群 前言 建议 官方译文 什么是 Sentinel? Sentinel 优点 Redis 配置文件 maste ...

最新文章

  1. 3D点云重建原理及Pytorch实现
  2. HTML5 Dashboard – 那些让你激动的 Web 技术
  3. app专项测试(稳定性测试、安全性测试)
  4. java jsp filename filepath 图片上传_SpringMVC实现文件上传与下载
  5. Android 开发实用小技巧
  6. c++静态成员变量使用前必须初始化,那么下面这个例子为什么不用初始化?
  7. [MySQL] - 返回影响行数
  8. centos7-docker-网络配置
  9. mysql长时间后断开_mysql 长时间没连接了 就会自动断开服务
  10. DataGridView默认不选中
  11. nodejs后台系列--第四篇--koa(三)
  12. 如何判断函数极值点与拐点
  13. IcedTea6版本1.7.1
  14. UE4 Datasmith图标消失解决
  15. 微信公众号自定义菜单创建
  16. Linkflow CDP亮相GDMS全球数字营销峰会
  17. 水位检测电路的设计(模电课设)
  18. 收集了一些Weblogic监控工具
  19. 楼宇自控BACnet/IP协议网关功能特点
  20. 一些vue功能和css样式

热门文章

  1. Xftp使用教程——问答方式
  2. Http Server : 一个差生的逆袭
  3. java提高篇之数组(1):认识JAVA数组
  4. 在Github上搭建Jekyll博客和创建主题
  5. Ubuntu安装wps Linux版
  6. 【OpenCV3】双线性插值
  7. 「 深入浅出 」集合List
  8. 离散数学及其应用 (Kenneth H·Rosen 著)
  9. 美方首次起诉4名俄黑客 其中两人系俄安全局官员
  10. fastjson异常问题