Java面试八股之Redis集群Cluster

  1. Redis集群Cluster

Redis Cluster是一种基于数据分片(Sharding)的分布式缓存和存储系统,它实现了数据的水平扩展、高可用性和自动故障转移。以下是对Redis Cluster模式详细实现流程的描述:

1. 初始化与配置

部署节点:在不同的服务器上部署多个Redis节点,每个节点既可以作为主节点也可以作为从节点。

配置集群模式:为每个节点启用Cluster模式,指定Cluster所需的端口(通常为主节点端口+10000,用于节点间通信)以及Cluster配置文件(如redis.conf中的相关参数)。

分片规划:决定集群的总槽数量(通常为16384),并规划每个节点负责的槽范围。每个键在集群中会被映射到一个唯一的槽位,根据槽位找到对应的节点进行操作。

2. 创建集群

手动创建:使用redis-trib.rb(Ruby脚本)或redis-cli的cluster子命令,按照规划好的槽位分布,将各个节点加入集群。创建过程中,工具会自动处理节点间的握手、槽位分配和配置同步。

自动部署工具:使用第三方自动化部署工具(如Ansible剧本、Kubernetes Operator等)根据配置文件自动创建和配置Redis Cluster。

3. 数据分片与路由

键值到槽位映射:Redis Cluster使用CRC16算法对键进行哈希,然后对总槽数取模,确定键所属的槽位。客户端或中间件在发送命令前,也会使用相同算法计算键的槽位。

客户端路由:客户端(或代理中间件)在连接集群时,获取集群的节点列表和槽位分布信息。当客户端发送命令时,先计算键对应的槽位,再查找拥有该槽位的节点进行连接。如果客户端连接的是错误的节点,节点会返回MOVED或ASK重定向响应,指示客户端转向正确的节点。

4. 节点间通信与数据同步

Gossip协议:节点间通过Gossip协议(一种分布式通信协议)交换集群状态信息,包括节点状态、槽位映射、主从关系等。Gossip协议基于发布/订阅和定期心跳机制,保证信息在集群内的快速传播和一致性。

主从复制:每个主节点都有一个或多个从节点。主节点将写入的数据同步到从节点,从节点以只读模式提供服务。主从复制可以实现数据冗余和读取负载均衡。

5. 故障检测与自动故障转移

心跳检测:节点间通过发送PING命令进行心跳检测,监控对方的存活状态。当节点长时间未响应心跳时,其他节点会将其标记为疑似下线(PFAIL)。

故障确认与投票:当足够数量(取决于配置的quorum)的节点确认同一主节点PFAIL时,该主节点被标记为客观下线(FAIL)。节点间进行投票,决定是否进行故障转移。

故障转移:当选定的某个从节点被提升为主节点后,其他从节点会自动与新主节点建立复制关系。原主节点恢复后,若配置允许,它将自动成为新主节点的从节点。

客户端重定向:故障转移过程中,客户端收到的MOVED响应会引导其转向新的主节点。客户端需要更新本地的槽位映射表,后续请求将直接发送到正确的新主节点。

6. 扩容与缩容

添加新节点:向集群中添加新节点时,通过redis-trib或redis-cli重新分配部分槽位到新节点,其他节点自动与新节点同步这部分槽位的数据。客户端在获取新的槽位映射后,能透明地访问到新节点上的数据。

移除节点或调整槽位:通过类似工具移除节点或调整槽位分布,涉及的数据会自动在集群内迁移。客户端在获取更新后的槽位映射后,能适应新的集群拓扑。

7. 监控与运维

监控集群状态:使用CLUSTER INFO、CLUSTER NODES等命令或第三方监控工具监控集群的整体状态、节点状态、槽位分布、复制延迟等指标。

故障排查与恢复:当出现故障时,通过上述命令和工具定位问题,执行必要操作(如故障转移、手动调整节点状态等)恢复集群服务。

综上所述,Redis Cluster模式通过数据分片、客户端路由、节点间通信、故障检测与自动转移等机制,实现了数据的分布式存储、高可用性和水平扩展。在实际使用中,还需要结合适当的部署策略、客户端配置、监控与运维手段,确保集群的稳定高效运行。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter 手写 TabBar

前言: 这几天在使用 flutter TabBar 的时候 我们的设计给我提了一个需求: 如下 Tabbar 第一个元素 左对齐,试了下TabBar 的配置,无法实现这个需求,他的 配置是针对所有元素的。而且 这个 TabBar 下面的 滑块在移动的时…

产品经理-产品经理会在项目中遇到的几个问题(16)

项目中遇到了需求变更怎么办? 首先要弄清楚需求变更的原因是什么。如果是因为在迭代的过程中更好地理解了用户需求 进而产生了更好的需求则完全是正常的。如果是因为老板的需求 那就需要和老板沟通清楚,并且确保自己能理解老板的需求,而且这个…

软件测试——测试用例

工作职责: 1.负责产品系统测试,包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写,包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求: 1.熟练…

800块,我从淘宝上买AGV……

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 从淘宝上打算够购买一台AGV小车,上去一搜,嘿,你别说,还真有。便宜的才200块钱。 很兴奋把…

17-8 向量数据库之野望8 - 7 个主流向量数据库

​​​​​​ 在快速发展的人工智能 (AI)、机器学习 (ML) 和数据工程领域,对高效数据存储和检索系统的需求至关重要。矢量数据库已成为管理这些技术通常依赖的复杂高维数据的关键解决方案。在这里,我们探讨了每个 AI/ML/数据工程师都应该熟悉的七个矢量数据库,重点介绍了它们…

【Linux】01.Linux 的常见指令

1. ls 指令 语法:ls [选项] [目录名或文件名] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息 常用选项: -a:列出当前目录下的所有文件,包含隐藏文件…

JavaSE学习笔记第三弹之异常抛出

今天我们继续来学习JavaSE相关的知识,希望与大家共同努力。 目录 异常 什么是异常 运行时异常 编译时异常 ​编辑 为什么需要异常处理机制 错误 异常的处理与抛出 异常处理 异常抛出 自定义异常 结语 异常 什么是异常 Java中异常是一种在程序运行时发…

Java二十三种设计模式-原型模式(5/23)

Java中的原型模式:深入解析与应用实践 引言 原型模式(Prototype Pattern)是一种创建型设计模式,它使用一个已有的对象作为原型,通过复制这个原型来创建新的实例。这种模式适用于对象的创建成本较高,或者对…

BL201分布式I/O耦合器连接Profinet网络

钡铼技术的BL201分布式I/O耦合器是一个用于Profinet网络的设备,用于连接远程输入/输出(I/O)设备到控制系统,如可编程逻辑控制器(PLC),能够实现分布式的I/O连接和通信。 它支持标准Profinet IO …

Qt实现一个简单的视频播放器

目录 1 工程配置 1.1 创建新工程 1.2 ui界面配置 1.3 .pro配置 2 代码 2.1 main.c代码 2.2 widget.c 2.3 widget.h 本文主要记述了如何使用Qt编写一个简单的视频播放器,整个示例采用Qt自带组件就可以完成。可以实现视频的播放和暂停等功能。 1 工程配置 1.…

都说油车不行了,外资两款经典油车降价起量,与电动车展开决战

6月份的轿车销量数据出来了,数据显示电动汽车并没稳赢,燃油车终于发力了,反过来围剿电动汽车了,显示出消费者并非说不买油车,而是看价格,价格合适,消费者仍然会选择油车。 6月份的数据显示之前销…

AV1 编码标准帧间预测技术概述

AV1 编码标准帧间预测 AV1(AOMedia Video1)是一种开源的视频编码格式,它在帧间预测技术上做出了显著的改进和扩展,以提供比现有标准更高的压缩效率和更好的视频质量。以下是AV1帧间预测技术的几个关键点: 参考帧扩展&a…

VGMP(VRRP组管理协议)和HRP(华为冗余技术)

1、VGMP VGMP(VRRP Group Management Protocol):VRRP组管理协议,是华为开发的一种私有协议,主要用于实现对多个VRRP组进行统一管理的功能 概述:VGMP协议是在VRRP协议的基础上开发的,其最主要的…

linux的学习(五):shell编程中的变量,运算符,条件判断

简介: shell编程的基本概念,定义变量,运算符,条件判断的基本使用 shell编程 把多个命令写到一个文件里,这个文件就是脚本,里面还有很多的流程控制 基本概念 脚本的后缀名是.sh 脚本的执行:…

Golang | Leetcode Golang题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; func lowestCommonAncestor(root, p, q *TreeNode) (ancestor *TreeNode) {ancestor rootfor {if p.Val < ancestor.Val && q.Val < ancestor.Val {ancestor ancestor.Left} else if p.Val > ancestor.Val && q…

【Docker】Docker 的数据管理与镜像创建

目录 一.数据管理 1.数据卷 2.数据卷容器 二.端口映射 三.容器互联 四.Docker 镜像的创建 1.基于现有镜像创建 1.1.首先启动一个镜像&#xff0c;基于镜像创建容器&#xff0c;更新容器内容 1.2.将修改后的容器提交为新的镜像&#xff0c;需要使用该容器的 ID 号创建新…

Studying-代码随想录训练营day40| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

第40天&#xff0c;动态规划part07&#xff0c;动态规划经典题型“打家劫舍”(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 总结 198.打家劫舍 文档讲解&#xff1a;代码随想录打家劫舍 视频讲解&#xff1a;手…

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…

按钮测试: 循环遍历 单据行明细 执行SQL

using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using System; using System.ComponentModel;using System.Text;namespace cux.button.test {[Description("测试循环遍…

【JavaScript 算法】回溯法:解决组合与排列问题

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、回溯法的基本概念回溯法的模板 二、经典问题及其 JavaScript 实现1. 组合问题2. 排列问题 三、回溯法的应用四、总结 回溯法是一种通过尝试所有可能的解来解决问题的算法策略。它在组合和排列问题中尤为有效&#xff0c…