前言

redis简单的主从复制在生产的环境下可能是不行的,因为从服务器只能读不能写,如果主服务器挂掉,那么整个缓存系统不能写入了;redis自带了sentinel(哨兵)机制可以实现高可用。

redis-sentinel集群

哨兵机制的主要功能

  • 不断监控主服务器和从服务器的是否正常运行;

  • 出现问题是可以自动报告;

  • 当一个节点出现问题可以进行故障转移,主服务器故障可以通过投票机制选出新的主服务器;

  • 自动发现主服务器和从服务器;

redis-sentinel基本介绍

redis-sentinel是一个单独的进程,可以通过配置文件sentinel.conf单独启动,也可以在启动redis-server是指定--sentinel启动;

注意

  • 至少三个Sentinel实例才能实现强大的部署;

  • 应将三个Sentinel实例放入被认为以独立方式失败的计算机或虚拟机中。

配置redis-sentinel

redis的源码中有一份sentinel.conf文件可以用来配置redis-sentinel。

使用哨兵机制集群redis实例如果需要配置密码,那么主从服务器的密码需要保持一致,否则故障切换可能出错。

  1. # redis.conf
  2. masterauth '123' # 主服务器密码
  3. requirepass '123' # 本身的密码
  1. # sentinel.conf
  2. port 26379 # 端口
  3. # 格式为 sentinel <选项的名字> <服务器的名字> <选项的值>
  4. # 配置sentinel去监听名为mymaster的服务器,ip加端口,判断失效需要2个sentinel才能进行故障迁移;即一个哨兵可能发生误判。
  5. sentinel monitor mymaster 127.0.0.1 6379 2
  6. # 如果3000ms没有反应就认为mymaster挂掉
  7. sentinel down-after-milliseconds mymaster 3000
  8. # 设置故障转移时,同时有多少个从服务器对新主服务进行同步,越少需要的时间越长,越多同步时从服务器不能工作;
  9. sentinel parallel-syncs mymaster 1
  10. # failover超时时间,即触发failover切换操作后,如果10000ms还没有任何的failover故障切换即认为失败
  11. sentinel failover-timeout mymaster 10000
  12. # 设置前后台运行yes表示后台运行
  13. daemonize yes
  14. #指定工作目录
  15. dir "/home/redis/sentinel-work"
  16. # 默认情况下sentinel只能访问本地主机,设置为no后禁用保护模式
  17. protected-mode no
  18. # 指定日志文件
  19. logfile "/home/redis/sentinellog/sentinel.log"
  20. #redis主节点密码
  21. sentinel auth-pass mymaster 123456

注意

  • 没有的文件目录需要主动创建,否则启动失败;

  • 可以在不同的服务器上启动多个sentinel,它们的配置相同,都去监视主服务器的redis。

故障转移机制

  • 通过sentinel monitor设置了需要多少个sentinel同意下线,主服务器才成为客观下线状态;

  • 一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次;

  • 当没有足够数量的 Sentinel 同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向 Sentinel 的 PING 命令返回有效回复时, 主服务器的主观下线状态就会被移除。

  • 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。

  • 只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。

转移步骤

  • 发现主服务器已经进入客观下线状态。

  • 对我们的当前纪元进行自增(详情请参考 Raft leader election ), 并尝试在这个纪元中当选。

  • 如果当选失败, 那么在设定的故障迁移超时时间的两倍之后, 重新尝试当选。 如果当选成功, 那么执行以下步骤。

  • 选出一个从服务器,并将它升级为主服务器。

  • 向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。

  • 通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel , 其他 Sentinel 对它们自己的配置进行更新。

  • 向已下线主服务器的从服务器发送 SLAVEOF 命令, 让它们去复制新的主服务器。

  • 当所有从服务器都已经开始复制新的主服务器时, 领头 Sentinel 终止这次故障迁移操作。

自动发现 Sentinel 和从服务器

  • 在Sentinel的配置文件中只需要设置主服务器的参数,不需要设置其他的Sentinel和从服务器的参数,原因是Sentinel可以向它监视的主服务器询问相关的信息;

  • 我们部署集群的时候,可以先部署简单的主从复制结构,然后添加Sentinel来监控主服务器和从服务器。

启动redis-sentinel

  1. redis-server /path/sentinel.conf --sentinel
  2. # 可以使用supervisor对redis-sentinel进行管理,将sentinel设置为前台运行

注意:redis-server启动的是redis主服务进程,加了--sentinel参数启动的是sentinel进程;

  • 查看redis-sentinel的状态
  1. # 登录
  2. redis-cli -h 192.168.1.20 -p 26379

python连接redis集群

redis使用sentinel模式后,原来的python连接redis方案由于主从服务器可能发生切换变得不可用了。

  1. import redis
  2. r2 = redis.StrictRedis() # 如果该实例死机将变得不可用
  • 使用Sentinel对象
  1. import redis
  2. from redis.sentinel import Sentinel
  3. # 创建一个连接对象,连接所有的哨兵,其会自动发现redis实例
  4. sentinel = Sentinel([('192.168.1.20', 26379), ('192.168.1.20', 26379),('192.168.1.20', 26379)], socket_timeout=0.5)
  5. # 获取主服务器进行写入
  6. master = sentinel.master_for('mymaster', socket_timeout=0.5, db=1)
  7. w_ret = master.set('foo', 'bar')
  8. # 获取从服务器进行读取
  9. slave = sentinel.slave_for('mymaster', socket_timeout=0.5, db=1)
  10. r_ret = slave.get('foo')
  11. # master和slave的用法和前面的redis对象一样了,不过slave只能读不能写

参考:

redis基础之redis-sentinel(哨兵集群)(六)的更多相关文章

  1. Redis Sentinel哨兵集群

    Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...

  2. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

  3. Redis主从&哨兵集群搭建

    主从集群 在搭建主从集群前,我们先把Redis安装起来: #解压Redis压缩包 [root@master lf]# tar -zxvf redis-6.2.1.tar.gz -- #安装gcc [r ...

  4. 深入浅出Redis-redis哨兵集群

    1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...

  5. 深入浅出Redis-redis哨兵集群[转]

    1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...

  6. Linux之Redis-redis哨兵集群详解

    1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...

  7. redis系列--深入哨兵集群

    一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...

  8. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)

    摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...

  9. Redis哨兵集群创建脚本--v2

    1. 基础环境 操作系统版本  CentOS Linux release 7.6.1810 (Core) Docker 版本  19.03.11, build 42e35e61f3 Redis  版本 ...

随机推荐

  1. 第187天:js基础---常见的Bom对象

    BOM(Browser Object Mode)浏览器对象模型,是Javascript的重要组成部分.它提供了一系列对象用于与浏览器窗口进行交互,这些对象通常统称为BOM. 一张图了解一下先 1.wi ...

  2. 第89天:HTML5中 访问历史、全屏和网页存储API

    一.访问历史 API 通过history对象实现前进.后退和刷新之类的操作 history新增的两个方法history.replaceState()和history.pushState()方法属于HT ...

  3. XTU 1233 Coins(DP)

    题意: n个硬币摆成一排,问有连续m个正面朝上的硬币的序列种数. 很明显的DP题.定义状态dp[i][1]表示前i个硬币满足条件的序列种数.dp[i][0]表示前i个硬币不满足条件的序列种数. 那么显 ...

  4. MethodHandle

    JDK7为间接调用方法引入新的API,在java.lang.invoke包下,可以看作为反射的升级版,但它不像反射API那样显得冗长.繁重 主要的类 MethodHandle 方法句柄.对可直接执行的 ...

  5. logstash收集MySQL慢查询日志

    #此处以收集mysql慢查询日志为准,根据文件名不同添加不同的字段值input { file { path => "/data/order-slave-slow.log" t ...

  6. excel换行

    在excel的单元格中换行 1. windows alt + enter 2. mac command + alt + enter

  7. 【计算机视觉】SIFT中LoG和DoG比较

    <SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 在实际计算时,三种方法计算的金字塔组数noctaves ...

  8. Python数据生成pdf文件

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  9. CollectionUtils.isEqualCollection的用法

    在使用Java的集合时,有些时候会需要比较两个集合是否相等,自己写方法其实也简单,但是既然有了好的实现,就不要自己造轮子了,只要了解这个轮子是什么原理就好了. public static boolea ...

  10. [吴恩达机器学习笔记]14降维3-4PCA算法原理

    14.降维 觉得有用的话,欢迎一起讨论相互学习~Follow Me 14.3主成分分析原理Proncipal Component Analysis Problem Formulation 主成分分析( ...