Redis哨兵机制 | |
redis主机宕机后,需要人工解决切换,这是需要哨兵机制,自动监控 | |
Redis的sentinel | 做为一个监控程序能够监控各个机器的状态并及时作出调整,将手动的操作变成自动的(监控状态并作出调整) |
哨兵机制的原理 | Redis Sentinel 一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其余 Sentinel 节点进行监 控,当它发现节点不可达时,会对节点做下线标识。 如果被标识的是主节点,它还会和其他 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,它们会选举出一个 Sentinel 节点来 完成自动故障转移的工作,同时会将这个变化实时通知给 Redis 应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。 |
Sentinel实现原理
基本的故障转移流程 | 1)检测问题,主要讲的是三个定时任务,这三个内部的执行任务可以保证出现问题马上让 Sentinel 知道。
2)发现问题,主要讲的是主观下线和客观下线。当有一台 Sentinel 机器发现问题时,它就会主观对它主观下线。 但是当多个 Sentinel 都发现有问题的时候,才会出现客观下线。
3)找到解决问题的人,主要讲的是领导者选举,如何在 Sentinel 内部多台节点做领导者选举,选出一个领导者。
4)解决问题,主要讲的是故障转移,即如何进行故障转移。
1.检测问题-3个定时任务 2.发现问题-主观/客观下线 3.解决问题的人-选举 4.解决问题-故障转移 |
三个定时任务 | 每10秒每个 Sentinel 对 Master 和 Slave 执行一次 Info Replication 。
每2秒每个 Sentinel 通过 Master 节点的 channel 交换信息(pub/sub)。
每1秒每个 Sentinel 对其他 Sentinel 和 Redis 执行 ping 。
第一个定时任务,指的是 Redis Sentinel 可以对 Redis 节点做失败判断和故障转移,在 Redis 内部有三个定时任务作为基础,来 Info Replication 发现 Slave 节点,这个命令可以确定主从关系。
第两个定时任务,类似于发布订阅, Sentinel 会对主从关系进行判定,通过 _sentinel_:hello 频道交互。了解主从关系可以帮助更好的自动化操作 Redis 。然后 Sentinel 会告知系统消息给其它 Sentinel 节点,最终达到共识,同时 Sentinel 节点能够互相感知到对方。
第三个定时任务,指的是对每个节点和其它 Sentinel 进行心跳检测,它是失败判定的依据。
|
什么是主观下线 | 每个 Sentinel 节点对 Redis 节点失败的“偏见”。之所以是偏见,只是因为某一台机器30秒内没有得到回复。
(某一台,只有一台机器认定宕机) |
什么是客观下线 | 这个时候需要所有 Sentinel 节点都发现它30秒内无回复,才会达到共识。
(多台机器认定宕机) |
领导选举方式 | 如果sentinel节点发现自己票数超过半数,同时也超过了 sentinel monitor mymaster 127.0.0.1 6379 2 超过2个的时候,就会成为领导者进行故障转移操作 |
如何选择合适的slave节点 | Redis 内部其实是有一个优先级配置的,在配置文件中 slave-priority ,这个参数是 Salve 节点的优先级配置,如果存在则返回,如果不存在则继续。 当上面这个优先级不满足的时候, Redis 还会选择复制偏移量最大的 Slave节点,如果存在则返回,如果不存在则继续。之所以选择偏移量最大,这是因为偏移量越小,和 Master 的数据越不接近,现在 Master 挂掉了,说明这个偏移量小的机器数据也可能存在问题,这就是为什么要选偏移量最大的 Slave 的原因。 如果发现偏移量都一样,这个时候 Redis 会默认选择 runid 最小的节点。
1.优先级配置 slave-priority 2.复制偏移量最大的slave节点(之所以选择偏移量最大,这是因为偏移量越小,和 Master 的数据越不接近,现在 Master 挂掉了,说明这个偏移量小的机器数据也可能存在问题) 3.选择runnid最小的节点 |
Redis Sentinel的功能 | 监控:Sentinel 节点会定期检测 Redis 数据节点、其余 Sentinel 节点是否可达 通知:Sentinel 节点会将故障转移的结果通知给应用方 主节点故障转移: 实现从节点晋升为主节点并维护后续正确的主从关系 配置提供者: 在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合 ,从中获取主节点信息。 |
Docker-compose | 通过docker-compose构建好哨兵跟主从的环境 |
| |
Sentinel的核心配置 | |
sentinel monitor mymaster 127.0.0.1 7000 2 | 监控的主节点的名字、IP 和端口,最后一个2的意思是有几台 Sentinel 发现有问题,就会发生故障转移,例如 配置为2,代表至少有2个 Sentinel 节点认为主节点 不可达,那么这个不可达的判定才是客观的。对于设置的越小,那么达到下线的条件越宽松,反之越严格。一般建议将其设置为 Sentinel 节点的一半加1 |
sentinel down-after-millseconds mymaster 30000 | 这个是超时的时间(单位为毫秒)。打个比方,当你去 ping 一个机器的时候,多长时间后仍 ping 不通,那么就认为它是有问题 |
sentinel parallel-syncs mymaster 1 | 当 Sentinel 节点集合对主节点故障判定达成一致时, Sentinel 领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作, parallel-syncs 就是用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数,指出 Sentinel 属于并发还是串行。1代表每次只能 复制一个,可以减轻 Master 的压力; |
sentinel auth-pass <master-name> <password> | 如果 Sentinel 监控的主节点配置了密码,sentinel auth-pass 配置通过添加主节点的密码,防止 Sentinel 节点对主节点无法监控。 |
sentinel failover-timeout mymaster 180000 | 表示故障转移的时间 |
|
|
Sentinel命令 | |
SENTINEL masters | 显示被监控的所有master以及它们的状态 |
SENTINEL master <master name> | 显示指定master的信息和状态 |
SENTINEL slaves <master name> | 显示所有slave以及它们的状态 |
SENTINEL get-master-addr-by-name <master name> | 返回指定master的ip和端口, 如果正在进行failover或者failover已经完成,将会显示被提升为master的slave的ip和端口 |
SENTINEL failover <master name> | 强制sentinel执行failover,并且不需要得到其他sentinel的同意。 但是failover后会将最新的配置发送给其他sentinel |
|
|
生产环境中部署技巧 | 1)Sentinel 节点不应该部署在同一台物理“机器”上。 这里特意强调物理机是因为一台物理机做成了若干虚拟机或者现今比较流行的容器,它们虽然有不同的 ** IP ** 地址,但实际上它们都是同一台物理机,同 一台物理机意味着如果这台机器有什么硬件故障,所有的虚拟机都会受到影响,为了实现 Sentinel 节点集合真正的高可用,请勿将 ** Sentinel **节点部署在同一台物理机器上。 2)部署至少三个且奇数个的 Sentinel 节点。 3) 通过增加 Sentinel 节点的个数提高对于故障判定的准确性,因为领导者选举需要至少一半加1个节点。奇数个节点可以在满足该条件的基础上节省一个节点。 |
哨兵常见问题 | 1)异步复制导致数据丢失 因为master->slave的复制是异步,所以可能有部分还没来得及复制到slave就宕机了,此时这些部分数据就丢失了。 2)集群脑裂导致数据丢失 脑裂,也就是说,某个master所在机器突然脱离了正常的网络,跟其它slave机器不能连接,但是实际上master还运行着。 此时哨兵可能就会认为master宕机了,然后开始选举,将其它 slave 切换成 master 。这时候集群里就会有2个 master ,也就是所谓的脑裂。 此时虽然某个 slave 被切换成了 master ,但是可能client还没来得及切换成新的 master ,还继续写向旧的 master 的数据可能就丢失了。 因此旧master再次恢复的时候,会被作为一个 slave 挂到新的 master 上去,自己的数据会被清空,重新从新的 master 复制数据。
怎么解决? min-slaves-to-write 1 min-slaves-max-lag 10 要求至少有1个slave,数据复制和同步的延迟不能超过10秒 如果说一旦所有的slave,数据复制和同步的延迟都超过了10秒钟,那么这个时候,master就不会再接收任何请求了 上面两个配置可以减少异步复制和脑裂导致的数据丢失
1、异步复制导致的数据丢失 在异步复制的过程当中,通过 min-slaves-max-lag 这个配置,就可以确保的说,一旦 slave 复制数据和 ack 延迟时间太长,就认为可能 master 宕机 避免损失的数据太多,那么就拒绝写请求,这样就可以把master宕机时由于部分数据未同步到 slave 导致的数据丢失降低到可控范围内 2、集群脑裂导致的数据丢失 集群脑裂因为 client 还没来得及切换成新的 master ,还继续写向旧的 master 的数据可能就丢失了,通过 min-slaves-to-write 确保必须是有多少个从节点连接,并且延迟时间小于 min-slaves-max-lag 多少秒。
1)异步复制导致数据丢失 因为主从复制是异步的,会导致有部分数据来不及复制就宕机,造成数据丢失
解决: min-slaves-max-lag 10 主从延迟时间太长
2)集群脑裂导致数据丢失 脑裂,有两个大脑。 主节点因为突然连接不上网络,与其他从节点连接不上,此时哨兵会误认为宕机了,但实际上还运行着。将其余的从节点选举成主节点。这时候就会有2个主节点; 因为客户端还没来得及切换成新的主节点,还继续向旧的主节点写入数据,就会造成数据丢失
解决方案: min-slaves-to-write 1 min-slaves-max-lag 10 1)要求至少有1个从节点 2)数据复制和同步的延迟不能超过10s 否则主节点不接收任何请求 |
3.reids哨兵
最新推荐文章于 2024-05-31 14:21:43 发布