redis--集群

redis集群

Redis 集群是一种用于分布式存储和管理数据的解决方案,它允许将多个 Redis 实例组合成一个单一的逻辑数据库,提供更高的性能、容量和可用性。

redis集群的优点

  • 高可用性: Redis集群使用主从复制和分片技术,使得数据可以在多个节点之间进行复制和分布。这提供了数据的冗余备份,当某个节点发生故障时,集群仍然可以继续运行,不会导致数据丢失或服务中断。

  • 横向扩展性: Redis集群支持分片技术,将数据分布在多个节点上。这允许集群在处理更大的数据量和更高的负载时保持性能稳定,因为负载被均匀地分布在多个节点上,避免了单一节点的性能瓶颈。

  • 负载均衡: 分片技术确保数据在多个节点之间均匀分布,从而实现了负载均衡。这使得每个节点都能够处理适量的请求,防止某个节点过载而影响整体性能。

  • 快速读取和写入: Redis集群使用分片技术将数据分散在多个节点上,这在一定程度上提高了读取和写入操作的性能。对于一些需要高吞吐量和低延迟的应用场景,这是一个重要的优点。

  • 自动数据迁移: 当需要扩展集群或某个节点负载过高时,Redis集群能够自动执行数据迁移,将部分数据从一个节点迁移到另一个节点,以平衡负载。这种自动迁移确保了数据在集群中的均衡分布。

  • 监控和管理: Redis集群通常提供了集中式的管理和监控工具,使得管理员可以更轻松地监控集群中各个节点的状态、性能和负载情况,并进行必要的调整和优化。

  • 容错性: 由于Redis集群可以配置多个主节点和从节点,当部分节点出现故障时,仍然可以保持部分功能。这增加了系统的容错性,确保即使在部分节点故障的情况下,应用仍然可以继续运行。

redis集群的应用场景

  • 超大数据集存储:当数据集巨大时,单个Redis节点难以容纳所有数据,需使用Redis集群分片存储于多个节点。例如,社交媒体平台的用户生成内容,如图片、视频和帖子,产生了海量的数据。Redis集群可以将不同用户的数据分片存储在多个节点上,以支持高效的数据访问和管理。

  • 高并发写入场景:对于高并发写入需求,单个Redis节点可能成为性能瓶颈。Redis集群分散写入请求,提升并发写入性能。例如,电商平台的秒杀活动期间,成千上万的用户同时试图购买有限的商品。Redis集群可以将写入请求分散到多个节点上,避免单一节点的性能瓶颈,确保订单的及时处理。

  • 地理分布式部署:若应用分布于不同地点且需共享数据,Redis集群可实现地理位置间数据复制和同步。例如,一个在线游戏需要在全球范围内提供一致的游戏状态和排行榜信息。通过在不同地理位置部署Redis集群,可以实现数据的复制和同步,确保玩家在不同地区的体验一致性。

  • 数据冷热分离:某些情境下,可将热数据存储于高性能内存节点,将冷数据存储于廉价存储介质,Redis集群透过分片实现。例如,微博上的热点话题可以视为热门数据,相反,一些不太引人注目的微博帖子可以被视为冷门数据。Redis集群可以将与这些热点话题相关的帖子存储在Redis集群的高性能节点中,以提高访问效率和用户体验。对于一些冷门数据,可以将其存储在持久化存储中,以节省内存资源,并确保高性能节点用于更具吸引力的内容。

  • 数据安全与故障隔离:在多数据中心备份和故障隔离需求下,Redis集群可在多数据中心部署以确保数据和服务恢复。例如,金融机构需要在多个数据中心之间备份和同步交易数据,以确保在某个数据中心发生故障时能够快速恢复。Redis集群的多数据中心部署可以提供数据冗余和故障隔离。

  • 多租户应用:为多租户提供独立数据存储与隔离需求,Redis集群能实现租户数据分片存储。例如,云服务提供商为多个客户提供缓存服务,每个客户都需要独立的数据存储和隔离。Redis集群可以将不同客户的数据分片存储,确保数据的隔离性。

  • 可扩展性需求:若预计应用将大规模增长,单一Redis节点无法扩展,Redis集群提供可扩展选项。例如,一个实时数据分析平台面临不断增长的数据量和用户量,需要随时扩展以应对负载增加。通过使用Redis集群,可以方便地添加新节点以支持更大规模的数据处理。

  • 零停机维护:进行Redis维护或升级时,Redis集群实现零停机,确保服务连续性。例如,一个在线游戏需要进行服务器升级和维护,但不能因此中断玩家的游戏体验。使用Redis集群的节点迁移和数据迁移功能,可以在维护过程中保持服务的连续性。

redis集群相关命令

命令描述
CLUSTER INFO打印集群的信息
CLUSTER NODES列出集群当前已知的所有节点和相关信息
节点操作
CLUSTER MEET <ip> <port>将指定节点添加到集群中
CLUSTER FORGET <node_id>从集群中移除指定节点
CLUSTER REPLICATE <node_id>将当前节点设置为指定节点的从节点
CLUSTER SAVECONFIG将节点的配置文件保存到硬盘
槽操作
CLUSTER ADDSLOTS <slot> [slot ...]将槽指派给当前节点
CLUSTER DELSLOTS <slot> [slot ...]从当前节点移除指定槽
CLUSTER FLUSHSLOTS移除当前节点被指派的所有槽
CLUSTER SETSLOT <slot> NODE <node_id>将槽指派给指定节点,先从另一节点移除
CLUSTER SETSLOT <slot> MIGRATING <node_id>将本节点的槽迁移到指定节点
CLUSTER SETSLOT <slot> IMPORTING <node_id>从指定节点导入槽到本节点
CLUSTER SETSLOT <slot> STABLE取消槽的导入或迁移状态
键操作
CLUSTER KEYSLOT <key>计算给定键应该放置在哪个槽上
CLUSTER COUNTKEYSINSLOT <slot>返回指定槽中包含的键值对数量
CLUSTER GETKEYSINSLOT <slot> <count>返回指定槽中的指定数量的键

redis集群的部署

redis集群的案例可以参考这篇博客:https://blog.51cto.com/u_15353497/3750453
博客配套的尚硅谷redis视频:https://www.bilibili.com/video/BV1Rv41177Af?p=37&vd_source=780392db714727eda3832c4fb4c114de

redis中的插槽

Redis集群中的插槽是一种数据分布技术,它使用哈希函数将所有的键映射到一个固定范围的整数集合中,这个集合就是插槽。Redis集群默认有16384个插槽,每个主节点负责一部分插槽,从节点则复制主节点的插槽。插槽的作用是解耦了数据与节点的关系,使得数据可以在节点之间灵活地迁移和扩展。

  • 插槽的计算方法:
    先对键(或键中的有效部分)使用CRC16算法计算出一个结果,然后对16384取余数,得到一个0到16383之间的数字,这个数字就是插槽编号。例如,键abc的插槽编号是7638。
  • 插槽的分配方法:
    可以由用户指定,也可以使用redis-trib.rb脚本自动分配。redis-trib.rb脚本会尽量平均地将16384个插槽分配给N个主节点。如果有从节点,脚本会自动将从节点与主节点关联起来。
  • 插槽的迁移方法:
    可以使用redis-trib.rb脚本实现,也可以使用CLUSTER SETSLOT命令手动操作。迁移插槽的目的是为了平衡集群中的数据分布,或者增加或删除节点。迁移插槽的过程涉及源节点、目标节点和其他节点三方面的协作。
  • 插槽的优点:
    可以方便地添加或移除节点,提高集群的扩展性和可用性。当需要增加节点时,只需要把其他节点的某些插槽挪到新节点就可以;当需要移除节点时,只需要把移除节点上的插槽挪到其他节点就行了。在这一点上,不需要停掉所有的Redis服务。
  • 插槽的缺点:
    限制了集群中可用的键数量和主节点数量。因为插槽数是固定的16384个,所以如果集群中有很多键,那么可能会出现哈希冲突的情况,导致不同的键被映射到同一个插槽上。这样会影响集群中键的分布均匀性和性能。另外,因为每个主节点都要负责一部分插槽,所以主节点数量不能超过16384个。而且Redis作者不建议Redis集群节点数量超过1000个,因为这样会导致网络拥堵和心跳包过大。

redis集群实现原理

Redis集群的实现原理主要包括以下几个方面:

  1. 数据分片:Redis集群将所有的数据分成16384个哈希槽,每个节点负责一部分哈希槽,每个键根据CRC16算法计算出一个哈希槽编号,公式为slot = CRC16(key) % 16384,然后存储在相应的节点上。这样,集群可以通过简单的算法,快速定位键所在的节点,而不需要维护一个全局的键映射表。

  2. 节点通信:Redis集群中的节点会通过Gossip协议来交换信息,维护集群的状态。每个节点都会保存一个当前集群的视图,包括所有节点的地址、角色、配置纪元、负责的哈希槽等信息。每隔一段时间,每个节点都会随机选择一些节点(包括自己)发送PING消息,携带自己的视图信息。收到PING消息的节点会回复PONG消息,并根据发送节点的信息更新自己的视图,如果有更大的配置纪元,就接受该配置。通过这种方式,集群中的节点可以相互发现、传播消息、检测故障。

  3. 主从复制:为了保证高可用性,Redis集群采用了主从复制模型,每个主节点可以有多个从节点作为备份,从节点会复制主节点的数据和哈希槽信息。当主节点发生故障时,集群会自动将一个从节点升级为新的主节点,接管故障主节点的哈希槽和数据,保证服务的连续性。

  4. 请求重定向:当客户端连接到某个节点时,如果该节点不负责请求的键所在的哈希槽,会返回一个MOVED错误,告诉客户端正确的节点地址。客户端可以缓存这个映射关系,下次直接访问正确的节点,或者重新连接到新的节点重试操作。另一种情况是当集群进行哈希槽迁移时,某些哈希槽可能处于中间状态,既不属于源节点也不属于目标节点。这时候,节点会返回一个ASK错误,让客户端临时访问目标节点获取数据。客户端可以在下次操作之前发送ASKING命令,然后重试操作。Moved重定向ASK重定向

  5. 复制和故障转移:Redis集群支持主从复制模式,每个主节点可以有多个从节点,从节点会复制主节点负责的哈希槽的数据。当主节点发生故障时,集群会自动从其从节点中选举一个新的主节点,接管故障主节点的哈希槽。集群使用投票机制来选举新的主节点,每个主节点都有一票投票权,当有半数以上的主节点认为某个主节点下线了,并给它的某个从节点投票,那么该从节点就会成为新的主节点。

  6. 集群管理:Redis集群中的每个节点都会维护一个集群状态信息,包括自己和其他节点的名字、地址、角色、配置纪元、连接状态、哈希槽分配等。每个节点都会定期与其他节点进行通信,交换这些信息,以达成一致的视图。另外,每个节点还会执行一些特殊的命令来管理集群的运行,比如添加或删除节点、迁移哈希槽、执行故障转移等。

redis集群故障恢复

master节点挂了之后,如何进行故障恢复呢?

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave。Failover的过程需要经过类Raft协议的过程在整个集群内达到一致, 其过程如下:
• slave发现自己的master变为FAIL
• 将自己记录的集群currentEpoch加1,并广播Failover Request信息
• 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
• 尝试failover的slave收集FAILOVER_AUTH_ACK
• 超过半数后变成新Master
• 广播Pong通知其他集群节点
在这里插入图片描述
参考:
尚硅谷redis集群
Java 全栈知识体系之redis,一个很好的java学习网站,强烈推荐!

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

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

相关文章

centos7安装hadoop 单机版

1.解压 &#xff08;1&#xff09;将hadoop压缩包复制到/opt/software路径下 &#xff08;2&#xff09;解压hadoop到/opt/module目录下 [rootkb135 software]# tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/ &#xff08;3&#xff09;修改hadoop属主和属组 [rootkb135 m…

MySQL索引 事物 存储引擎

一 索引 索引的概念 索引就是一种帮助系统能够更快速的查找信息的结构 索引的作用 索引的副作用 创建索引的规则 MySQL的优化 哪些字段/场景适合创建索引 哪些不适合 小字段唯一性强的字段更新不频繁&#xff0c;但查询率比较高的字段表记录超过 300行主键&#xff0c;外键…

【HCIP】15.MPLS基础

多协议标签交换 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部实现数据快速转发。 术语 MPLS域&#xff08;MPLS Domain&#xff09;&#xff1a;一系列…

【AndroidStudio】java.nio.charset.MalformedInputException: Input length = 1

java.nio.charset.MalformedInputException: Input length 1 可以参考这个文章处理下编码格式&#xff1a;https://blog.csdn.net/twotwo22222/article/details/124605029java.nio.charset.MalformedInputException: Input length 1是因为你的配置文件里面有中文或者是你的编…

Docker 将容器打包成镜像推送镜像到仓库

Docker 将容器打包成镜像&推送镜像到仓库 一、将容器打包成镜像 $ docker commit <容器ID> <镜像名称:标签>示例&#xff1a; $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

Qt 自定义菜单 托盘菜单

托盘菜单实现&#xff1a;通过QSystemTrayIconQMenuQAction即可完美实现&#xff01; 实现方式&#xff1a;createActions用于创建菜单、菜单项,translateActions用于设置文本、实现多语化&#xff0c;translateAccount用于设置用户空间配额。 void TrayMenu::createActions(…

基于Pytorch的神经网络部分自定义设计

一、基础概念&#xff08;学习笔记&#xff09; &#xff08;1&#xff09;训练误差和泛化误差[1] 本质上&#xff0c;优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标&#xff0c;后者则关注在给定有限数据量的情况下寻找合适的模型。训练误差和泛化误差通常不…

WinPlan经营大脑:精准预测,科学决策,助力企业赢得未来

近年,随着国内掀起数字化浪潮,“企业数字化转型”成为大势所趋下的必选项。但数据显示,大约79%的中小企业还处于数字化转型初期,在“企业经营管理”上存在着巨大的挑战和风险。 WinPlan经营大脑针对市场现存的企业经营管理难题,提供一站式解决方案,助力企业经营管理转型…

webassembly001 webassembly简述

WebAssembly 官方地址:https://webassembly.org/相关历史 https://en.wikipedia.org/wiki/WebAssembly https://brendaneich.com/2015/06/from-asm-js-to-webassembly/WebAssembly&#xff08;缩写为Wasm&#xff09;是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编…

macOS 安装 Homebrew 详细过程

文章目录 macOS 安装 Homebrew 详细过程Homebrew 简介Homebrew 安装过程设置环境变量安装 Homebrew安装完成后续设置(重要)设置环境变量homebrew 镜像源设置macOS 安装 Homebrew 详细过程 本文讲解了如何使用中科大源安装 Homebrew 的安装过程,文章里面的所有步骤都是必要的,需…

从C语言到C++_35(异常)C++异常的使用+异常体系+异常优缺点

目录 1. 异常的基本使用 1.1 异常的概念 1.2 异常的抛出和匹配原则 1.3 函数调用链中异常栈展开匹配原则 1.4 异常的重新抛出 1.5 异常的安全问题 1.6 C98和C11的异常规范 2. 自定义异常体系 2.1 异常继承体系 2.2 异常体系中的重新抛出 3. C标准库的异常体系 4. C…

【allegro 17.4软件操作保姆级教程十二】插件器件封装制作

&#x1f449;个人主页&#xff1a; highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 目录 制作插件焊盘 放置pin脚 绘制丝印线和装配线 放置位号和value 放置1脚标识…

【VsCode】SSH远程连接Linux服务器开发,搭配cpolar内网穿透实现公网访问(1)

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

CSS中如何实现文字阴影效果(text-shadow)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现思路⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

Python采集关键词结果辅助写作

大家好&#xff01;在进行学术研究和 写作时&#xff0c;获取准确、全面的文献资料和相关研究成果是非常重要的。在本文中&#xff0c;我将与你分享使用Python爬虫 采集 学术关键词结果来辅助 写作的方法&#xff0c;帮助你快速获取与研究主题相关的学术文献和 。 **1. 设置搜索…

Pygame编程(9)font模块

Pygame编程&#xff08;9&#xff09;font模块 函数示例 函数 pygame.font.init 初始化字体模块init() -> None pygame.font.quit 反初始化字体模块quit() -> None pygame.font.get_init True,如果字体模块已初始化get_init() -> bool pygame.font.get_default_font …

【React学习】—SetState的使用(九)

【React学习】—SetState的使用&#xff08;九&#xff09; state的简写方式 state属性总结

兄弟,王者荣耀的段位排行榜是通过Redis实现的?

目录 一、排行榜设计方案1、数据库直接排序2、王者荣耀好友排行 二、Redis实现计数器1、什么是计数器功能&#xff1f;2、Redis实现计数器的原理&#xff08;1&#xff09;使用INCR命令实现计数器&#xff08;2&#xff09;使用INCRBY命令实现计数器 三、通过Redis实现“王者荣…

【Redis从头学-13】Redis哨兵模式解析以及搭建指南

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

8.7.tensorRT高级(3)封装系列-调试方法、思想讨论

目录 前言1. 模型调试技巧总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-调试方法、思想讨论 课程大纲可看…