【Redis】哨兵模式和集群模式
一、哨兵模式
目录
一、哨兵模式
一、Redis 哨兵概念
二、Redis 哨兵监控
三、Redis 哨兵通知及故障转移
四、Redis 哨兵配置
五、Redis 哨兵搭建
六、Redis 哨兵使用
二、Cluster 集群
一、Redis-Cluster 简介
二、Redis-Cluster 查询路由方案
三、Redis-Cluster 数据分片
四、Redis-Cluster 一致性保存
一、Redis 哨兵概念
哨兵(Sentinel):是一个分布式系统,可自动干预 Redis 主从切换,主要用于管理多个 Redis 服务器,执行监控(Monitoring)、通知(Notification)、自动故障迁移(Automatic failover)任务。
二、Redis 哨兵监控
如果 Redis 节点未在 [master-down-after-milliseconds] 指定的时间内,对向它发送 PING 命令的哨兵返回一个有效回复,该哨兵就会将这个服务器标记为下线。
当某个哨兵先检测到主节点不可用时,系统并不会马上进行 failover 过程【最终只有一个 sentinel 节点作为 failover 的发起者,就需要选举一个 leader(采用类似 Raft 协议实现选举算法)】。该哨兵会通知其它哨兵,发送 [SENTINEL is-master-down-by-addr] 来询问其他哨兵是否认为主节点的服务器已下线并提议选举自己为领导者哨兵。 ■ 如果在规定的时间内接收到多个哨兵(哨兵数量大于3且为奇数)的同意时,领导者哨兵产生。
三、Redis 哨兵通知及故障转移
领导者哨兵选出一个从节点,并将其升级为主节点。 向被选中的从节点发送 SLAVEOF NO ONE 命令,让它转变为主节点。通过发布与订阅功能,将更新后的配置传播给所有其他 Sentinel,其他 Sentinel 对他们自己的配置进行更新。向其他从节点发送 SLAVE OF 命令,让它们去复制新的主节点。 当所有的从节点都已经开始复制新的主节点时,领导者哨兵终止此次故障迁移操作。每当一个 Redis 实例被重新配置(reconfigured),无论是被设置成主节点、从节点、又或者被设置成其他主节点的从节点,哨兵都会向被重新配置的实例发送一个 CONFIG REWRITE 命令,从而确保这些配置会持久化到硬盘。
四、Redis 哨兵配置
配置项 | 参数类型 | 作用 |
---|---|---|
sentinel down-after-milliseconds | <服务名称><毫秒数(整数)> | 指定哨兵在监控Redis服务时,当 Redis 服务在一个默认毫秒数内都无法回答时,单个哨兵认为的主管下线时间,默认为30000<30秒> |
配置项 | 参数类型 | 作用 |
sentinel down-after-milliseconds | <服务名称><毫秒数(整数)> | 指定哨兵在监控Redis服务时,当 Redis 服务在一个默认毫秒数内都无法回答时,单个哨兵认为的主管下线时间,默认为30000<30秒> |
sentinel failover-timeout | <服务名称><毫秒数(整数)> | 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认是3分钟。 sentinel notification-script <服务名称><脚本路径> 指定 sentinelnel 检测到该监控的 redis 实例指向的实例异常时,调用的报警脚本。可以通过脚本来通知管理员。一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。 |
五、Redis 哨兵搭建
【1】搭建 1 主 2 从共 3 个节点的 Redis 主从复制节点
#6379 为主节点端口,6380和6381为对应从节点
6379>./redis-server redis.conf
6380>./redis-server redis.conf
6381>./redis-server redis.conf
【2】新建 3 个哨兵节点并配置哨兵 sentinel.conf 文件。新建端口为17000、17001、17002 共三个哨兵节点,启动:./redis-sentinel sentinel.conf
bind 127.0.0.1
port 17000
protected-mode no #若想从远程连接redis集群,需要将sentinel的protected-mode修改为no
sentinel myid sentinel-1 #设定sentinel myid 每个都不一样,使用yum安装的时候,直接就生成了
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 2
sentinel auth-pass mymaster 123456789 #设置用于与主服务器和从服务器进行身份验证的密码
六、Redis 哨兵使用
【1】使用 Redis-cli 连接
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
Redis Sentinel的工作流程
由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求 。
Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。
在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程还是蛮复杂的。
-
主观失效
SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
-
客观失效
ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
二、Cluster 集群
一、Redis-Cluster 简介
【1】Redis 集群(Redis-Cluster)提供了在多个 Redis 节点间共享数据的功能。
【2】Redis 集群通过分区来提高可用性。可自动分割数据到不同的节点上,集群的部分节点失败或者不可达时能够继续处理请求。
【3】Redis Cluster 集群模式通常具有高可用性、可扩展性、分布式等特性。
【4】Redis 集群采用 P2P 模式,是完全去中心化的,不存在中心节点或者代理节点。
【5】Redis 集群是没有统一的入口,客户端连接集群的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个 Redis 实例。
【6】为了实现集群的高可用,即判断节点是否健康[能否正常使用],redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法。如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法。
【7】那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些 slot均等的分配给了各个节点。当需要在 Redis集群存放一个数据(key-value)时,redis会先对这个key进行 CRC16 算法,然后得到一个结果。再把这个结果对 16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定 key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的 slot 就无法使用,那么就会导致集群无法正常工作。综上所述,每个 Redis集群理论上最多可以有16384个节点。
二、Redis-Cluster 查询路由方案
客户端随机地请求任意一个 Redis实例,然后由 Redis将请求转发给正确的 Redis节点。
Redis-Cluster 实现了一种混合形式的查询路由,但不是直接将请求从一个 Redis 节点转发到另一个 Redis 节点,而是在客户端帮助下直接重定向(redirected)到正确的 Redis 节点。如果访问的第一个节点就是目标节点,则直接返回结果。
三、Redis-Cluster 数据分片
1)Redis-Cluster 没有使用一致性哈希,而是引入了哈希槽(slot)的概念。
2)Redis-Cluster 有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置在那个槽,集群中的每一个节点负责一部分 hash 槽。
四、Redis-Cluster 一致性保存
【1】Redis-Cluster 使用了异步复制:主节点对客户端请求回复状态后,异步发起写操作给从节点,会存在一个时间间隙。
【2】Redis-Cluster 出现网络分区时,当一个客户端与至少包含一个主节点在内的少数节点被孤立,可能导致在节点超时时间(node timeout)内,另一个网络分区内的大部分节点重新选举被孤立主节点的从节点为新的主节点。节点超时时间选项为 cluster-node-timeout 15000(毫秒)