美文网首页
知道 Redis-Cluster 么?说说其中可能不可用的情况

知道 Redis-Cluster 么?说说其中可能不可用的情况

作者: 干货满满张哈希 | 来源:发表于2021-02-02 01:50 被阅读0次

Redis 集群模式简述

一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Master 3 个 Slave 的模式,如 图00 所示。

image

key 分槽与转发机制

Redis 将键空间分为了 16384 个槽,通过以下算法确定每一个 key 的槽:

CRC16(key) mod 16384

由于 16384 = 2 的 14 次方,对一个 2 的 n 次方取余相当于对于它的 2 的 n 次方减一取与运算。所以优化为:

CRC16(key) & 16383

当 key 包含 hash tags 的时候(例如 key{sub}1),会以 sub tags 中指定的字符串(就是 sub )计算槽,所以key{sub}1key{sub}2会到同一个槽中。

客户端可以发送读取任一个槽的命令到任一个集群实例,当槽属于请求的实例的时候,就会处理,否则会告诉客户端这个槽在哪里,例如如果将下面命令发到第二个 Master:

GET key1
返回: MOVED slot ip:port(第一个Master的) 

默认情况下,所有的读写命令只能发送到 Master。如果需要使用 Slave 处理读请求,需要先在客户端执行 readonly 命令。

主从自动切换机制

当一个 Master 发生故障,如果有 Slave,则会切换为 Master。

如何判断 Master 发生故障了呢?Redis 集群配置中有一个配置,cluster-node-timeout集群心跳超时时间。当集群内节点建立连接后,定时任务 clusterCron 函数(参考源码:https://github.com/redis/redis/blob/6.0/src/cluster.c)会每隔一秒随机选择一个节点发送心跳。如果在超时时间(cluster-node-timeout)的时间内未收到心跳响应,则将这个节点标记为 pfail。

如果集群中有一半以上的 Master 标记一个节点的状态是 pfail,那么这个节点的状态就会变成 fail。

当节点变成 fail 就会触发自动主从切换。主从切换的过程,也涉及到类似的选举:

  1. 当某个 Master 被标记为 fail 之后,对应的 Slave 节点执行定时任务 clusterCron 函数时,选取复制偏移量,也就是主从同步进度最大、数据最新的 Slave 尝试变为主。
  2. 这个 Slave 设置自己的 currentEpoch += 1(正常情况下集群中所有的 currentEpoch 相同,每次选举都会加 1,并且每个 currentEpoch 只能投一次,防止多个 Slave 同时发起选举后难以获取大多数票),之后向所有的 Master 发送 failover 请求,如果得到大多数 Master 的同意则开始执行主从切换。

集群不可用情况

根据上面的描述,我们可以总结出如下不可用的情况

  1. 当访问一个 Master 和 Slave 节点都挂了的槽的时候,会报槽无法获取。
  2. 当集群 Master 节点个数小于 3 个的时候,或者集群可用节点个数为偶数的时候,基于 fail 的这种选举机制的自动主从切换过程可能会不能正常工作,一个是标记 fail 的过程,一个是选举新的 master 的过程,都有可能异常。

参考

  1. 官方文档:https://redis.io/topics/cluster-spec
  2. 源代码:[https://github.com/redis/redis

相关文章

  • 知道 Redis-Cluster 么?说说其中可能不可用的情况

    Redis 集群模式简述 一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Master 3 个 Sl...

  • redis cluster

    1.建立目录/opt/redis/redis-cluster/opt/redis/redis-cluster/re...

  • 说说民气不可用

    写出这么个题目,一看到就很让人泄气,但我之所以这样认为,是因为我认为经济、政治、社会、军事、外交都是专业问题,得依...

  • 简单理解Redis-cluster的slot

    如果使用redis-cluster集群部署Redis,redis-cluster把所有的物理节点映射到[0-163...

  • [Swift] 可选型

    变量或常量在某些情况下可能表示的是未被赋值的情况,若直接不对某一类型的变量赋值,会提示该变量未初始化不可用。这时就...

  • 如何设计一个高可用系统?简单总结了10来种方法,今天全部告诉你们

    一篇短小的文章,面试经常遇到的这个问题。本文主要包括下面这些内容: 高可用的定义 哪些情况可能会导致系统不可用? ...

  • redis-cluster 命令行

    在使用redis集群的时候需要了解redis-cluster的具体情况,使用命令查看集群的状态:直接上一些常用的命令:

  • Hystrix——服务容错

    1 Hystrix 简介 在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能...

  • 说说最近的情况

    最近我在做什么 投身教育行业,带学生们备战考研。对于教育行业,怎么说呢,对于我来说它是一门用心经营的营生。如果各位...

  • Springcloud-熔断器Hystrix

    雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这...

网友评论

      本文标题:知道 Redis-Cluster 么?说说其中可能不可用的情况

      本文链接:https://www.haomeiwen.com/subject/pusetltx.html