2021-01-31:Redis集群方案不可用的情况有哪些?
福哥答案2021-01-31:
[答案来自此链接:](https://www.zhihu.com/question/442112697)
一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Master 3 个 Slave 的模式。
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 就会触发自动主从切换。主从切换的过程,也涉及到类似的选举:
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 的过程,都有可能异常。
***
[评论](https://user.qzone.qq.com/3182319461/blog/1612050882)
2021-01-31:Redis集群方案不可用的情况有哪些?的更多相关文章
- Redis集群方案介绍
由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...
- Redis集群方案
Redis集群方案 前段时间搞了搞Redis集群,想用做推荐系统的线上存储,说来挺有趣,这边基础架构不太完善,因此需要我们做推荐系统的自己来搭这个存储环境,就自己折腾了折腾.公司所给机器的单机性能其实 ...
- Redis集群方案怎么做?大牛给你介绍五种方案!
Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架 ...
- 大厂们的 redis 集群方案
redis 集群方案主要有两类,一是使用类 codis 的架构,按组划分,实例之间互相独立: 另一套是基于官方的 redis cluster 的方案:下面分别聊聊这两种方案: 类 codis 架构 这 ...
- Redis集群方案怎么做?
转载自:https://www.jianshu.com/p/1ecbd1a88924 Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促 ...
- Redis集群方案总结
Redis集群方案总结 Redis集群方案总结Codis其余方案Redis cluster 目前,Redis中目前集群有以下几种方案: 主从复制 哨兵模式 redis cluster 代理 codis ...
- Redis 集群方案介绍
由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...
- Redis集群方案收集
说明: 如果不考虑客户端分片去实现集群,那么市面上基本可以说就三种方案最成熟,它们分别如下所示: 系统 贡献者 是否官方Redis实现 编程语言 Twemproxy Twitter 是 C Redis ...
- 基于Twemproxy的Redis集群方案(转载)
原文地址:基于Twemproxy的Redis集群方案 概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的 ...
- Redis集群方案(来自网络)
参考: https://www.zhihu.com/question/21419897 http://www.cnblogs.com/haoxinyue/p/redis.html 为什么集群? 通常, ...
随机推荐
- 查看linux用户密码过期时间并提醒
1.查看linux用户密码过期时间命令 [root@Centos6 /]# chage -l euser Last password change : Aug 28, 2015 [最近一次修改密码的时 ...
- 微信小程序中注册页面设计
.wxml <text>姓名</text> <input placeholder="请输入姓名" bindinput="getname&qu ...
- 共享USB打印机设置方法
打印机共享 一.准备 所有计算机在同一个网段. 所有计算机在同一个工作组,组名可以自定义,默认WORKGROUP. 使用超级管理员用户,目的是为了激活guest用户.验证之后可以不需要此前提. 二.主 ...
- luffy项目settings
一: 二:. 设置调整 1.修改manage.py配置路径 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyApi.settings.de ...
- 信创国产化,试试 Solon v2.2.2
Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它不是 Spring.没有用 Servlet.也无关 JavaEE,是一个有自己接口标准的开放生态.可以为应用软件国产化提供支持, ...
- Cesium渲染模块之Command
1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...
- (数据科学学习手札150)基于dask对geopandas进行并行加速
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为我们非常 ...
- springboot--多环境启动
法一: 法二:
- 干掉复杂的工具类,国产Java工具类库 Hutool 很香!
Hutool 大家已经比较熟悉了,这是一个超全的 Java 工具库,深受国内开发者的喜爱. 我之前其实是不太喜欢使用这种功能太多的工具类的,也比较担心稳定性和安全性,后面慢慢接受了就感觉其实也还好.而 ...
- vue指令之属性指令
目录 属性指令 示例 属性指令 标签上的属性可以绑定变量,变量变化,属性也会变化 # 什么是属性?比如: href/src/name/value/class/style... 语法: v-bind:属 ...