Redis 集群模式

一、集群模式概述

Redis 中哨兵模式虽然提高了系统的可用性,但是真正存储数据的还是主节点和从节点,并且每个节点都存储了全量的数据,此时,如果数据量过大,接近或超出了 主节点 / 从节点机器的物理内存,就会出现严重的问题;

集群模式就是为了解决这个问题的,它通过引入更多的主节点和从节点,每一组主节点及其所对应的从节点存储了数据全集的一部分,多组这个的结构构成了一个更大的整体,这就是集群

如下图所示,假定引入了三组主从节点来存储全量数据,那么每组机器只需要存储全集的 1/3 即可,其中每组机器中的每个节点保存的数据内容是一样的,这样的一组机器(包含一个主节点和多个从节点)也称为一个分片;

 此时,如果全量数据继续增加,就只需引入更多的分片即可;

二、数据分片算法

1. 哈希求余

设有 N 个分片,使用 [0,N-1] 来编号;

哈希求余就是针对给定的 key,先根据一个 hash 函数计算出 hash 值(例如使用 MD5 算法计算 hash 值),再把得到的结果进行 % N,得到的结果就是其所对应的分片编号;

优点:简单高效,数据分配均匀;

缺点:一旦需要进行扩容,N 就会改变,导致原有的映射规则被破坏(hash(key) % N),就需要让节点之间的数据相互传输,重新排列,以满足新的映射规则,此时需要搬运的数据量非常多,开销很大;

2. 一致性哈希算法

首先,把 [0,2^32-1] 这个数据空间,映射到一个圆环上,数据按照顺时针方向增长;

假设存在三个分片,如下图所示

假设有一个 key,通过 hash 函数计算得到 hash 值 H,那么这个 key 对应的分片就是从 H 所在位置,顺时针往下找,找到的第一个分片;

这就相当于,N 个分片的位置,把整个圆环分成了 N 个区间,key 的 hash 值落在某个区间内,就归对应区间管理;

当需要扩容时,原有分片在环上的位置不动,只需要在环上新安排一个分片位置即可;

优点:大大降低了扩容时数据搬运的规模,提高了扩容操作的效率;

缺点:数据分配不均匀(有的分片数据多,有的少,数据倾斜);

3. 哈希槽分区算法(Redis 采用)

为了解决上述搬运成本高 和 数据分配不均匀的问题,Redis cluster 引入了哈希槽 (hash slots) 算法;

hash_slot = crc16(key) % 16384

16384 = 16 * 1024 = 2 ^ 14,这就相当于把整个 hash 值,映射到 16384 个槽位上,即[0,16383]然后再把这些槽位比较均匀的分配给每个分片,同时每个分片的节点都要记录自己持有哪些分片;

比如有三个分片,则槽位的分配方式可能为:

  • 0 号分片:[0,5461],共 5462 个槽位
  • 1 号分片:[5462,10923],共 5462 个槽位
  • 2 号分片:[10924,16383],共 5460 个槽位

每个分片的节点使用 位图 来表示自己持有哪些槽位,对于 16384 个槽位来说,需要 2048 个字节即 2 KB 大小的内存空间来表示;

当需要进行扩容时,比如新加一个 3 号分片,就可以针对原有的槽位进行重新分配,分配的结果可能为:

  • 0 号分片:[0,4095],共 4096 个槽位
  • 1 号分片:[5462,9557],共 4096 个槽位
  • 2 号分片:[10924,15019],共 4096 个槽位
  • 3 号分片:[4096,5461],[9558,10923],[15020,16383],共 4096 个槽位

在实际使用 Redis 集群分片的时候,不需要手动指定哪些槽位分配给某个分片,只需要告诉某个分片应该持有多少个槽位即可,Redis 会自动完成后续的槽位分配,以及对应的 key 搬运的工作;

为什么是 16384 个槽位呢?

Redis 官方的解释是:节点之间通过心跳包通信,心跳包中包含了该节点持有哪些 slots,这个是使用位图这样的数据结构表示的,表示 16384 (16k) 个 slots,需要的位图大小是 2KB,如果给定的 slots 数更多了,比如 65536 个了,此时就需要消耗更多的空间,8 KB 位图表示了,8 KB,对于内存来说不算什么,但是在频繁的网络心跳包中,还是⼀个不小的开销的;

另一方面,Redis 集群一般不建议超过 1000 个分片,所以 16k 对于最大 1000 个分片来说是足够用的,同时也会使对应的槽位配置位图体积不至于很大;

三、集群故障处理

1. 故障判定

集群中的所有节点,都会周期性的使用心跳包进行通信;

  • 当节点 A 给节点 B 发送 ping 包,B 就会给 A 返回一个 pang 包;每个节点,每秒钟,都会给一些随机的节点发起 ping 包,这样设定是为了避免在节点很多的时候,心跳包也非常多;
  • 若节点 A 给节点 B 发起 ping 包,B 不能如期回应时,此时 A 就会尝试重置和 B 的 tcp 连接,看能否连接成功,如果仍然连接失败,A 就会把 B 设为 PFAIL 状态(相当于主观下线);
  • 当A 判定 B 为 PFAIL 之后,会通过 redis 内置的 Gossip 协议,和其他节点进行沟通,向其他节点确认 B 的状态,(每个节点都会维护一个自己的 "下线列表",由于视角不同,每个节点的下线列表也不⼀定相同);
  • 此时 A 发现其他很多节点,也认为 B 为 PFAIL,并且数目超过总集群个数的一半,那么 A 就会把 B 标记成 FAIL (相当于客观下线),并且把这个消息同步给其他节点 (其他节点收到之后,也会把 B 标记成 FAIL)

至此 B 就被彻底判定为故障节点了;

若某部分节点宕机,有可能会引起整个集群宕机 (整个集群处于 fail 状态),主要有以下三种情况:

  • 某个分片上的主节点和所有从节点都挂了
  • 某个分片上的主节点挂了,并且没有从节点(可归纳为第一种)
  • 超过半数的主节点挂了(此时就无法完成投票选举主节点的工作了)

2. 故障迁移

在上述故障判定中,若 B 是从节点,则不需要进行故障迁移,若 B 是主节点,并假设 B 有两个从节点 C 和 D,此时就会由 从节点 C D 触发故障迁移(把从节点提拔为主节点);

故障迁移的具体步骤为:

  1. 从节点判定自己是否具有参选资格: 如果从节点和主节点已经太久没通信(此时认为从节点的数据和主节点差异太了)时间超过阈值就失去竞选资格;   
    1. 具有资格的节点,比如 C  D会先休眠定时间,休眠时间 = 500ms 基础时间 + [0500ms] 随机时间 + 排名 * 1000ms,offset 的值越大,则排名会越靠前(越); 
    2.  C 的休眠时间到了C 就会给其他所有集群中的节点进行拉票操作,但是只有主节点才有投票资格
    3. 主节点就会把自己的票投给 C (每个主节点只有 1 票) C 收到的票数超过主节点数目的C 就会晋升成主节点(C 自己负责执行 slaveof no one并且让 D 执行 slaveof C)
    4. 同时,C 还会把自己成为主节点的消息同步给其他集群的节点;大家也都会更新自己保存的集群结构信息;

四、集群扩容

1. 把新的主节点加入到集群

redis-cli --cluster add-node (新的主节点的ip地址和端口号) (集群中任意节点的ip地址和端口号)

2. 重新分配 slots

redis-cli --cluster reshard (集群中任意节点的ip地址和端口号)

3. 给新的主节点添加从节点

redis-cli --cluster add-node (新的从节点的ip地址和端口号) (集群中任意节点的ip地址和端口号) --cluster-slave --cluster-master-id (新的主节点的 nodeId)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/364613.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python系列】列表推导式:简洁而强大的数据操作工具

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

洛谷 P1548 [NOIP1997 普及组] 棋盘问题

题目 洛谷 P1548 [NOIP1997 普及组] 棋盘问题 [NOIP1997 普及组] 棋盘问题 题目背景 NOIP1997 普及组第一题 题目描述 设有一个 N M N \times M NM 方格的棋盘 ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) (1≤N≤100,1≤M≤100) (1≤N≤100,1≤M≤100) 求出该棋盘中包含有多少个正…

【Hadoop学习笔记】认识Hadoop

认识Hadoop 从网上找的课程做的笔记,有些图是自己理解画的,可能不正确,可以作为参考,有疑问的地方请直接指出,共同交流。 Hadoop是由Apache基金会开发的一个分布式系统基础架构,主要解决海量数据的存储和海…

不知道自己的优势擅长和兴趣爱好,我该如何填报高考志愿选专业?

天生我才必有用,每个人都是独立的个体,拥有自己的优势和擅长,当然这个优势和擅长,不是和别人对比,而是和自己对比产生的。 如果说你不知道自己的优势擅长,不知道自己的兴趣和爱好,那只不过是你没…

HarmonyOS APP应用开发项目- MCA助手(持续更新中~)

简言: gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

架构师篇-7、企业安全架构设计及实践

摘要: 认识企业安全架构企业安全案例分析及实践 内容: 为什么做企业安全架构怎么做好安全架构设计案例实践分析&随堂练 为什么要做企业安全架构 安全是麻烦制造者? 整天提安全需求增加开发工作增加运维要求增加不确定性延后业务上线…

【Docker】docker 替换宿主与容器的映射端口和文件路径

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom(了解)application.propertiessql代码Controller控制层视图service: 服务层mapper(dao):持久层entity层(model层,domain层、 bean):对应数据库表,实体类 效果…

BIM 模型三维展示方式

三维模型展示场景目前主流的使用 threejs ,bably.js 引擎框架作为开发展示;对于特殊的封闭式模型格式需要二次转换处理;今天推荐一款直接将模型碎片化处理方式,同时能够在网页加载速度快,性能也很流畅,先看结果&#x…

llama3模型部署时遇到的问题及解决方案

在llama3模型部署时,会遇到一系列问题,这里就作者所遇到的问题与解决方法分享一下。 注意:这里是从llama3 github主页上给的方法一步步做的,不适用于其他部署大模型的方法。 文章目录 ERROR 403:Forbidden安装依赖时出…

【Python游戏】猫和老鼠

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、代码示例三、知识点梳理四、总结一、前言 本文介绍如何使用Python的海龟画图工具turtle,开发猫和老鼠游戏。 什么是Python? Python是由荷兰人吉多范…

后端之路第三站(Mybatis)——结合案例讲Mybatis怎么操作sql

先讲一下准备工作整体流程要做什么 我们要基于一个员工管理系统作为案例,进行员工信息的【增、删、改、查】 原理就是用Mybatis通过java语言来执行sql语句,来达到【增、删、改、查】 一、准备工作 1、引入数据库数据 首先我们把一个员工、部门表的数…

简述设计模式-工厂模式

概述 工厂模式是为了提供创建对象的方式,无需制定要创建的具体类。 举个例子,假如我是甲方需要制造一辆车,我可以要油车,可以要电车,也可以油电混动车,如果没有工厂,我需要自己找到对应的制造…

机电公司管理小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,管理员管理,客户管理,公告管理,考勤管理,请假管理 微信端账号功能包括:系统首页,公告,机电零件…

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇11基于stm32的智能水质检测系统 🧿创作不易,拒绝白嫖可私 一、功能介绍 -------------…

独家原创 | Matlab实现CNN-Transformer多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-Transformer多变量时间序列预测; 2.运行环境为Matlab2023b…

英飞凌TC3xx之DMA工作原理及应用实例

英飞凌TC3xx之DMA工作原理及应用实例 1 DMA的架构2 必要的术语解释3 DMA请求3.1 DMA软件请求3.2 DMA硬件请求3.3 DMA 菊花链请求3.4 DMA自动启动请求3.5 总结4 小结DMA是直接存储访问Direct Memory Access的简称。它的唯一职能就是在不需要CPU参与的情况下,将数据从源地址搬运…

计算机Java项目|基于SpringBoot的作业管理系统设计与实现

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

【后端面试题】【中间件】【NoSQL】ElasticSearch 节点角色、写入数据过程、Translog和索引与分片

中间件的常考方向: 中间件如何做到高可用和高性能的? 你在实践中怎么做的高可用和高性能的? Elasticsearch节点角色 Elasticsearch的节点可以分为很多种角色,并且一个节点可以扮演多种角色,下面列举几种主要的&…

[C++][设计模式][中介者模式]详细讲解

目录 1.动机2.模式定义3.要点总结 1.动机 在软件构建过程中,经常会出现多个对象相互关联的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化在这种情况下,可以…