知道 Redis-Cluster 么?说说其中可能不可用的情况
Redis 集群模式简述
一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Master 3 个 Slave 的模式,如 图00 所示。

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}1和key{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 就会触发自动主从切换。主从切换的过程,也涉及到类似的选举:
- 当某个 Master 被标记为 fail 之后,对应的 Slave 节点执行定时任务 clusterCron 函数时,选取复制偏移量,也就是主从同步进度最大、数据最新的 Slave 尝试变为主。
- 这个 Slave 设置自己的 currentEpoch += 1(正常情况下集群中所有的 currentEpoch 相同,每次选举都会加 1,并且每个 currentEpoch 只能投一次,防止多个 Slave 同时发起选举后难以获取大多数票),之后向所有的 Master 发送 failover 请求,如果得到大多数 Master 的同意则开始执行主从切换。
集群不可用情况
根据上面的描述,我们可以总结出如下不可用的情况
- 当访问一个 Master 和 Slave 节点都挂了的槽的时候,会报槽无法获取。
- 当集群 Master 节点个数小于 3 个的时候,或者集群可用节点个数为偶数的时候,基于 fail 的这种选举机制的自动主从切换过程可能会不能正常工作,一个是标记 fail 的过程,一个是选举新的 master 的过程,都有可能异常。
参考
每日一刷,轻松提升技术,斩获各种offer:

知道 Redis-Cluster 么?说说其中可能不可用的情况的更多相关文章
- 高可用Redis(十二):Redis Cluster
Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的 ...
- 06. redis cluster
目录 Redis Cluster redis cluster 特点 搭建redis cluster 访问redis cluster redis-cli 访问redis cluster 重新分片数据 新 ...
- Redis cluster的核心原理分析
一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间 ...
- redis cluster集群的原理
redis集群的概述: 在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有.有一些red ...
- 高可用Redis:Redis Cluster
转(https://www.cnblogs.com/renpingsheng/p/9862485.html) Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Red ...
- 深度图解Redis Cluster原理
不想谈好吉他的撸铁狗,不是好的程序员,欢迎微信关注「SH的全栈笔记」 前言 上文我们聊了基于Sentinel的Redis高可用架构,了解了Redis基于读写分离的主从架构,同时也知道当Redis的ma ...
- window下使用Redis Cluster部署Redis集群
日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...
- Redis Cluster 分区实现原理
Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:如何将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀:如何保证客户端 ...
- Redis Cluster
使用 Redis Cluster Redis 3.0 在2015年出了Stable版本,3.0版本相对于2.8版本带来的主要新特性包括: 实现了Redis Cluster,从而做到了对集群的支持: 引 ...
- Redis Cluster 介绍与使用
Redis Cluster 功能特性 Redis 集群是分布式的redis 实现,具有以下特性: 1. 高可用性与可线性扩张到1000个节点 2. 数据自动路由到多个节点 3. 节点间数据共享 4. ...
随机推荐
- [leetcode]House Robber1,2
/** * 一. * You are a professional robber planning to rob houses along a street.Each house has a cert ...
- IntelliJ IDEA错误: 源值1.5已过时,将在未来所有版本中删除
参考:http://www.jianshu.com/p/451271c4de11
- Qt学习笔记-Qt-4.8.6+phonon+mplayer
首先,用phonon播放音乐时,可以使用mplayer.首先,你的设备上需要安装一个mplayer并测试能用. 然后安装后端播放插件. 我用的是网上找的phonon-mplayer. 按照网上的方法, ...
- Scrum转型(二) Scrum的角色
1.1 ScurmMaster 作为Scrum流程的捍卫者和布道者,ScrumMaster在Scrum团队中起到至关重要的作用,他们确保团队使用正确的流程,确保团队正确地召开各种会议,他们训练团队的敏 ...
- 解析SwiftUI布局细节(三)地图的基本操作
前言 前面的几篇文章总结了怎样用 SwiftUI 搭建基本框架时候的一些注意点(和这篇文章在相同的分类里面,有需要了可以点进去看看),这篇文章要总结的东西是用地图数据处理结合来说的,通过这篇文章我们能 ...
- 安装Linux Deploy和Termux之后,再安装ftp服务软件都是多余的!
之前以为Debian 9 running via Linux Deploy或者Termux在安卓系统部署之后,一定要安装vsftpd或者pure-ftpd这些专门的ftp服务器软件,才能提供ftp服务 ...
- Label_strange_labels
空格符号 特殊符号名 注释语句 , align = "left right center" 粗体 斜体 也可能是控制标签 上标 下标 大字号 小字号 下划线 删除线 等宽 键盘输 ...
- Solon rpc 之 SocketD 协议 - RPC鉴权模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- 【Spring】Spring的事务管理 - 2、声明式事务管理(实现基于XML、Annotation的方式。)
声明式事务管理 文章目录 声明式事务管理 基于XML方式的声明式事务 基于Annotation方式的声明式事务 简单记录 - 简单记录-Java EE企业级应用开发教程(Spring+Spring M ...
- 【ORACLE错误】SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
执行set autotrace traceonly的时候,报错 SQL> set autotrace traceonly SP2-0618: Cannot find the Session Id ...