前言

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

redis-sentinel集群

哨兵机制的主要功能

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

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

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

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

redis-sentinel基本介绍

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

注意

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

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

配置redis-sentinel

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

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

# redis.conf

masterauth '123' # 主服务器密码

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

redis-server /path/sentinel.conf --sentinel

# 可以使用supervisor对redis-sentinel进行管理,将sentinel设置为前台运行

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

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

python连接redis集群

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

import redis
r2 = redis.StrictRedis() # 如果该实例死机将变得不可用
  • 使用Sentinel对象
import redis
from redis.sentinel import Sentinel
# 创建一个连接对象,连接所有的哨兵,其会自动发现redis实例
sentinel = Sentinel([('192.168.1.20', 26379), ('192.168.1.20', 26379),('192.168.1.20', 26379)], socket_timeout=0.5) # 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5, db=1)
w_ret = master.set('foo', 'bar') # 获取从服务器进行读取
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, db=1)
r_ret = slave.get('foo') # 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. 第204天:js---重载和多态

    一.根据arguments个数实现重载 js本身不支持重载,所以只能通过其他方式实现,arguments检测传参的个数,然后再执行不同的方式 function add() { var sum = 0 ...

  2. ZOJ3113_John

    这个题目是一个典型的Anti_Sg.我也不知道为什么这么叫,呵呵,反正大家都这么叫,而且我也是听别人说,看别人的日志自己才知道的. 题目的意思是给你不同颜色的石子,每次可以去一种颜色的石子若干个(至少 ...

  3. CF464C-Substitutes in Number

    题意 开始给出一个长为\(n\)的数字串,有\(m\)次操作按顺序执行,每次把当前数字串中的某一个数码替换成一个数字串\(t\)(可以为空或多位),最后问操作结束后的数字串十进制下模\(10^9+7\ ...

  4. bzoj4569-萌萌哒

    题目 有一个长度为\(n\)的十进制数,用\(s\)表示.有\(m\)个限制条件,每个条件形如:\((l_1,r_1,l_2,r_2)\),表示\(s[l_1:r_1]=s[l_2:r_2]\). 现 ...

  5. BSGS和扩展BSGS

    BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...

  6. C++之正则表达式20171121

    准确来说,不论在C++或C中,只要在Linux系统中都可以使用本文讲诉的正则表达式使用方式. 一.Linux中正则表达式的使用步骤: 编译正则表达式 regcomp() 匹配正则表达式 regexec ...

  7. poj 1655 树的重心

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13178   Accepted: 5565 De ...

  8. get与post请求简单理解

    一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的方法有4种,分 ...

  9. 杨辉三角之c实现任意行输出

    #include<stdio.h> #include<stdlib.h> int** fmalloc(int n){ int** array; //二维指针 int i; ar ...

  10. 对于redis框架的理解(二)

    之前梳理过redis main函数主体流程 大体是 initServerConfig() -> loadServerConfig() -> daemonize() -> initSe ...