Redis——集群高可用(脑裂/主从复值/哨兵Sentinel)

Redis——集群高可用

上一篇文章中我们学习了有关集群的理论性知识,知道了单机情况下会产生什么问题?引出了为什么要搭建集群。在本篇文章中我们将要学习一下如何通过集群保证服务高可用

注意:本篇文章并没有通过命令行演示如何搭建一个高可用集群,如何搭建在官网中都有详细教程,所以把搭建过程的命令行、环境配置等记录下来毫无意义,建议每个人都要实际动手搭建一遍。

只看是没有用的,只有动手做了才能理解,才能算是自己的东西

一、概念(主从、主备)

集群解决单点故障问题——对主做HA高可用

不管是主从还是主备,不管数据是否要保持一致性,主机都是既要做读,也要做写,还要处理所有的客户端请求。所以从某种意义上来说,主机也算是单点。为了防止单点故障,需要对主机做高可用,即主机挂掉之后,需要选取出新的主机对外提供服务

在这里插入图片描述

二、脑裂

当前对外提供服务的 master 出现问题之后,需要从剩余 slave 中选取出一台当作新的 master,既然需要从多台slave 里面选出一个新的 master,需要怎么选取呢?

在这里插入图片描述

如果一台就可以选取答案,那么集群中每个监控都可以给出各自的答案,谁都没有一锤定音的能力。答案就是模棱两可的,我们称之为脑裂,脑裂无法完成正确的选举。

出现脑裂不一定完全不好,需要看你系统的分区容忍性,是否允许出错

经过推导以及长期理论实践,一般认为只要过半的监控选取出相同的答案,就可以确定唯一一个答案,整个集群对于 Redis 主机的判断要么是挂,要么是不挂,不会出现模棱两可的状态

过半的从属监控相互间通信,相当于组成了一个势力范围,可以做出一个决策,没有模糊的中间状态,集群中每个 slave 间需要相互通信,才能沟通、选举,通信功能的实现是通过发布——订阅功能实现的

面试官问:为什么集群要使用奇数台?

答:以 3 台监控和 4 台监控来论证

  • 首先不过半,就容易出现纷争,出现脑裂,无法正确选举
  • 成本问题

三台的时候,两台即可结成势力范围,进行选举,它可以允许其中一台出现故障。四台的时候,需要三台才可以组成势力范围,进行选举,它也只可以允许其中一台出现故障

首先成本不一样,买四台机器肯定成本要高一些。其次它们都只允许其中一台出现故障,而四台中出现一台有故障的概率要大于三台其中一台出故障,简而言之就是四台承担的风险要高。

用偶数台搭建集群,就相当于花钱买了更大的风险回来,所以一般搭建集群的实例个数为奇数

二、主从复制配置

Redis官网主从复制:http://redis.cn/topics/replication.html

在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 服务器(下文称 slave)能精确的复制主 Redis 服务器(下文称 master)的内容。每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave 都将尝试让自身成为 master 的精确副本

Redis使用默认的异步复制,其特点是低延迟和高性能

一般来说 master 对外即提供读又提供写,slave 会同步 master 的所有数据,同时只对外提供查询功能。我们可以人为使用 REPLICAOF让某一台机器追随另一台机器。凡是有 slave 连接到 master,master 一定可以知道自己有多少个 slave。

一旦 master 挂掉之后,我们可以人为的使用 REPLICAOF no one让某一台 slave 不再追随任何一台机器,可以对外同时提供读写服务。还使用 REPLICAOF 让别的 slave 追随此主机,形成新的主从关系

搭建主从复制集群的具体配置指令省略,可从官网查看

如果人为指定主从关系的话,需要人工维护 master 的故障问题,而人是不稳定的,有可能处理不及时,有可能生病、休假等暂时处理不了问题。所以我们更倾向于一种自动监控和维护主从关系的机制,其中最常用的就是哨兵机制来自动管理和维护

三、哨兵机制

Redis官网哨兵配置:http://redis.cn/topics/sentinel.html

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。

多个哨兵 Sentinel 之间需要共同选举出一台新的 master,那么 Sentinel 之间需要相互通信,每个 Sentinel 通过发布—订阅功能发现其他哨兵


关联文章:

Redis入门–万字长文详解epoll

Redis——详解五种数据结构

Redis——Redis的进阶使用(管道/发布订阅/事务/布隆过滤器)

Redis——Redis用作缓存(内存回收/穿透/击穿/雪崩)

Redis——Redis用作数据库(持久化/RDB/AOF)

Redis——Redis集群理论

猜你喜欢

转载自blog.csdn.net/qq_42583242/article/details/108912126