‘壹’ Redis详解九(哨兵模式)
配置3个哨兵和1主2从的Redis服务器来演示这个过程。
多哨兵监控Redis
首先配置Redis的主从服务器,修改redis.conf文件如下
上述内容主要是配置Redis服务器,从服务器比主服务器多一个slaveof的配置和密码。
配置3个哨兵,每个哨兵的配置都是一样的。在Redis安装目录下有一个sentinel.conf文件,一份进行修改。
上述关闭了保护模式,便于测试。
有了上述的修改,我们可以进入Redis的安装目录的src目录,通过下面的命令启动服务器和哨兵
注意启动的顺序。 首先是主机(192.168.11.128)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。
如果主机宕机后,启用新的主机,原来的主机回归后,会作为从机。
从单个实例配置到哨兵:
‘贰’ Docker部署Redis哨兵集群脚本V1
操作系统版本 CentOS Linux release 7.6.1810 (Core)
Docker 版本 19.03.11, build 42e35e61f3
Redis 版本 3.2.3-alpine
‘叁’ redis sentinel(哨兵)模式
本文使用docker启动的sentinel,启动脚本如下
发现最后的sentinels=3,说明有3个哨兵服务正在监控
报错、此时sentinel可以获取到主节点信息,但是获取的ip为docker内部配置的地址
配置完毕
‘肆’ Redis哨兵(Sentinel)模式
主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。 这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式 。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是 哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
这里的哨兵有两个作用
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
用文字描述一下 故障切换(failover) 的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为 主观下线 。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为 客观下线 。这样对于客户端而言,一切都是透明的。
配置3个哨兵和1主2从的Redis服务器来演示这个过程。
首先配置Redis的主从服务器,修改redis.conf文件如下
上述内容主要是配置Redis服务器,从服务器比主服务器多一个slaveof的配置和密码。
配置3个哨兵,每个哨兵的配置都是一样的。在Redis安装目录下有一个sentinel.conf文件,一份进行修改
上述关闭了保护模式,便于测试。
有了上述的修改,我们可以进入Redis的安装目录的src目录,通过下面的命令启动服务器和哨兵
注意启动的顺序。 首先是主机(192.168.11.128)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。
上面是通过Jedis进行使用的,同样也可以使用Spring进行配置RedisTemplate使用。
sentinel down-after-milliseconds配置项只是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用。对于其他哨兵而言,并不是这样认为。哨兵会记录这个消息,当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover,此时哨兵会重写Redis的哨兵配置文件,以适应新场景的需要。
‘伍’ Redis集群哨兵模式配置优化解析
1、sentinel monitor
当所有节点启动后,配置文件中的内容发生了变化。
2、sentinel down-after-milliseconds
每个Sentinel节点都要通过定期发送ping命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过了down-after-milliseconds配置的时间且没有有效的回复,则判定节点不可达,
3、sentinel parallel-syncs
parallel-syncs就是用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数。
4、sentinel failover-timeout
ailover-timeout通常被解释成故障转移超时时间,但实际上它作用于故障转移的各个阶段:
a)选出合适从节点。
b)晋升选出的从节点为主节点。
c)命令其余从节点复制新的主节点。
d)等待原主节点恢复后命令它去复制新的主节点。
failover-timeout的作用具体体现在四个方面:
1)如果Redis Sentinel对一个主节点故障转移失败,那么下次再对该主节点做故障转移的起始时间是failover-timeout的2倍。
2)在b)阶段时,如果Sentinel节点向a)阶段选出来的从节点执行slaveof no one一直失败(例如该从节点此时出现故障),当此过程超过failover-timeout时,则故障转移失败。
3)在b)阶段如果执行成功,Sentinel节点还会执行info命令来确认a)阶段选出来的节点确实晋升为主节点,如果此过程执行时间超过failover-timeout时,则故障转移失败。
4)如果c)阶段执行时间超过了failover-timeout(不包含复制时间),则故障转移失败。注意即使超过了这个时间,Sentinel节点也会最终配置从节点去同步最新的主节点。
5、sentinel auth-pass
如果Sentinel监控的主节点配置了密码,sentinel auth-pass配置通过添加主节点的密码,防止Sentinel节点对主节点无法监控。
6、sentinel notification-script
sentinel notification-script的作用是在故障转移期间,当一些警告级别的Sentinel事件发生(指重要事件,例如-sdown:客观下线、-odown:主观下线)时,会触发对应路径的脚本,并向脚本发送相应的事件参数。
7、sentinel client-reconfig-script
sentinel client-reconfig-script的作用是在故障转移结束后,会触发对应路径的脚本,并向脚本发送故障转移结果的相关参数
Redis Sentinel可以同时监控多个主节点,具体拓扑图如下:
配置方法也比较简单,和监控一个主节点配置类型,只需要指定多个masterName来区分不同的主节点即可。
Sentinel节点也支持动态地设置参数,而且和普通的Redis数据节点一样并不是支持所有的参数。
Sentinel节点可以使用sentinel set
支持的参数:
sentinel set命令只对当前Sentinel节点有效,sentinel set命令如果执行成功会立即刷新配置文件,这点和Redis普通数据节点设置配置需要执行config rewrite刷新到配置文件不同。建议所有Sentinel节点的配置尽可能一致,这样在故障发现和转移时比较容易达成一致。Sentinel对外不支持config命令。
‘陆’ Redis 学习总结(3) Redis 哨兵模式
在实际开发中不会仅仅部署一个 Redis 服务器,为了获得高可用,Redis 哨兵模式 则是高可用的一种选择。
本文先介绍下 哨兵模式,再介绍了如何在 springboot 项目中使用。
这意味着使用 Sentinel (哨兵模式),您可以创建一个 Redis 部署,它可抵抗某些类型的故障(进行故障迁移)而无需人工干预。
它有这些功能:
Sentinel 的分布式特性
Redis Sentinel 是一个分布式系统,多个 Sentinel 进程协同工作,有这些优势:
部署前需要了解:
三个节点的基本配置
法定人数和仲裁
在配置 哨兵模式时,要指定一个 quorum,它可理解为“法定人数”。
假设有3 个 哨兵,法定人数为2。那么:
哨兵和副本的自动发现
Sentinel 与其他 Sentinel 保持连接,以便相互检查彼此的可用性并交换消息。
但是,您不需要在您运行的每个 Sentinel 实例中配置其他 Sentinel 地址的列表,因为 Sentinel 使用 Redis 实例的 Pub/Sub 功能来发现正在监视相同主节点和副本的其他 Sentinel。
类似地,您不需要配置附加到主服务器的副本地址在哪里,因为 Sentinel 会通过查询 Redis 自动发现它们。
参考我的另一篇文章:
一般需要三个节点,每个节点有一个 redis 和一个哨兵。
下面再分别描述。
我这里按三个 节点,先配置 redis 的主从复制。1个节点作为 master ,2个副本。
配置节点1:master
这里的 redis 作为 master 主redis,其他两个节点作为从节点。
我的文件夹名字叫 box1,这里编辑一个 box1/redis.conf 文件,主要配置内容如下:
配置节点2:副本
编辑一个 box2/redis.conf 文件,主要配置内容如下:
配置节点3:副本
编辑一个 box3/redis.conf 文件,主要配置内容如下:
分别启动这三个redis
命令行执行 redis-server ,并指定 配置文件的路径参数。
如何查看“主从复制”是否配置成功?
使用 info replication 命令,操作如下:
副本节点设置为只读?
从 Redis 2.6 开始,副本已被默认设置为 只读,无需额外配置。.
一般情况下,至少会需要三个哨兵对redis 进行监控,我们可以通过修改端口启动多个sentinel 服务。
第一个哨兵:
哨兵的 默认端口是 26379 ,这里不改。
第二个哨兵:
修改哨兵端口。
第三个哨兵:
修改哨兵端口。
启动哨兵
使用 redis-sentinel 命令,分别启动这三个哨兵
哨兵的自动发现
当三个哨兵都启动后,在各个哨兵的打印日志里可以看到, 三个哨兵已互相发现了彼此的存在 。
至此,配置完毕了,我们有三个 redis,和三个哨兵,看下截图。
模拟 master 宕机
按 ctrl+c 停止 master ,其位于 6379 。停止后,从日志可以看到,哨兵和 redis副本先努力继续连接 6379,反复几次失败后,开始选举出新的 master。截图如下:
至此,配置完毕。
我们看下 springboot 项目的客户端如何配置 以访问 哨兵模式的 redis。
Redis 哨兵支持
对于处理高可用Redis,Spring Data Redis 已经支持Redis Sentinel,使用RedisSentinelConfiguration,如下例所示:
Jedis 和 Lettuce 两种 redis 驱动都可以支持。
RedisSentinelConfiguration 也可以用可以 通过 PropertySource 来设置,它允许您设置以下属性:
配置application.yml
比如我这里修改我的 application.yml 文件如下:
我的配置文件示例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel
我的 springboot 配置实例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel/springboot_redis_demo
Redis官网 sentinel 介绍
https://redis.io/topics/sentinel
spring-data/data-redis
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel
https://www.cnblogs.com/jaycekon/p/6237562.html
END