Redis 从入门到精通【进阶篇】之高可用集群(Redis Cluster)详解

文章目录

  • 0. 前言
    • 设计目标
    • 核心概念
  • 1. 架构设计和原理
    • 1.1. 数据分片
    • 2. 节点间通信
    • 6. 扩容和缩容
  • 2. 总结
  • 3. Redis从入门到精通系列文章
  • 4. Redis Cluster面试题
    • 4.1. Redis Cluster如何进行扩容和缩容?
    • 4.2. Redis Cluster如何进行故障转移?
    • 4.3. Redis Cluster如何进行读写分离?
    • 4.4. Redis Cluster如何保证数据的一致性?
    • 4.5. Redis Cluster如何处理网络分区?
    • 4.6. Redis Cluster如何进行数据备份?
    • 4.7. Redis Cluster如何进行性能优化?

在这里插入图片描述

0. 前言

前面两个章节我们学习关于Redis 中的高可用 Redis主从复制. 以及Redis的哨兵模式(sentinel)。我们能够发现上面两种方式主要解决读写分离,备份冗余,以及故障恢复,故障转移。但是无法解决redis的性能问题,我们如果做过测试会发现 redis在单节点的情况下,只能将CPU的一个核心跑满。这主要是因为由于Redis是单线程的,无法充分利用多核CPU的优势,因此在高并发场景下可能会出现性能瓶颈。为了解决这个问题,Redis提供了集群技术,可以将数据分布在多个节点上,实现分布式存储和高并发读写。本文将详细介绍Redis集群技术的原理、设计和实现。

设计目标

  • 高可扩展性:能够支持大规模集群,可以容易地添加或删除节点。
  • 高可用性:能够自动检测节点故障,并进行自动故障转移,保证系统的可用性。
  • 高性能:能够支持高并发读写操作。
  • 避免合并操作:不需要在节点间进行数据合并操作,避免了复杂性和性能问题。

在Redis Cluster中,客户端和服务器分别扮演不同的角色。客户端将请求发送到集群中的某个节点,节点会将请求转发到正确的节点上,最终返回结果给客户端。

核心概念

  • Keys hash tags:用于将多个key映射到同一个hash slot上,以便于管理和分片。
  • Hash Slot:将所有的key分布到16384个hash slot中,每个节点负责管理其中一部分hash slot。
  • Cluster nodes属性:每个节点都有一个唯一的ID,包括IP地址和端口号,以及节点的状态信息。
  • Cluster总线:用于节点间的通信,通过发布/订阅模式实现。
  • 节点握手请求:用于节点间的信息交换和确认。
  • Moved 重定向:用于将请求重定向到正确的节点上。
  • ASK 重定向:用于临时重定向请求到其他节点上,直到数据槽的负责节点变回原节点。
  • smart客户端状态检测及维护:客户端会定期检测所有节点的状态,以便及时发现节点故障。
  • Gossip协议:用于节点间的状态维护和信息交换。
  • 故障恢复(Failover):当一个节点故障时,集群会自动将其故障转移至其他节点上。
  • 扩容&缩容:可以动态地添加或删除节点。

1. 架构设计和原理

在这里插入图片描述

Redis Cluster的架构设计主要包括以下几个方面:

1.1. 数据分片

Redis Cluster将所有的key分布到16384个hash slot中,每个节点负责管理其中一部分hash slot。这种分片方式可以保证数据的一致性和高可用性,同时也避免了数据合并的复杂性和性能问题。
在这里插入图片描述
Redis集群中的数据分片是指将数据分散存储在不同的节点上,以实现数据的横向扩展和高可用性。Redis集群的数据分片采用了一种类似于哈希的算法,即将key通过哈希函数映射到不同的槽位上,然后将槽位分配给不同的节点进行存储。Redis集群中的数据分片主要包括以下几个步骤:

  1. 计算key的哈希值

在将一个key存储到Redis集群中时,首先需要计算该key的哈希值。可以使用Redis Cluster提供的crc16算法来计算key的哈希值,该算法可以将key映射到一个0~16383之间的整数值。

  1. 将key分配到槽位上

计算出key的哈希值后,将key分配到对应的槽位上。Redis集群中共有16384个槽位,每个槽位都对应一个整数值。可以使用Redis Cluster提供的slots命令来查看当前槽位的分配情况。

  1. 将槽位分配给节点

将槽位分配给不同的节点进行存储。可以使用Redis Cluster提供的addslots和delslots命令来增加或删除节点的槽位分配。需要注意的是,每个槽位只能分配给一个节点进行存储,如果多个节点都想存储同一个槽位的数据,就需要进行数据复制和同步。

  1. 数据复制和同步

为了保证数据的高可用性和一致性,Redis集群会自动进行数据复制和同步。每个主节点都有一个或多个从节点,主节点会将自己的数据同步给从节点,以保证数据的备份和冗余。当一个主节点失效时,集群会自动将一个从节点升级为新的主节点,以确保服务的可用性。

Redis集群中的数据分片是通过哈希算法将key映射到不同的槽位上,然后将槽位分配给不同的节点进行存储,以实现数据的横向扩展和高可用性。需要注意的是,在进行数据分片操作之前,需要评估业务需求和集群规模,以选择合适的分片方案,以确保系统的可用性和性能。

2. 节点间通信

Redis节点之间通信主要通过Gossip协议和Redis Cluster Bus两种方式。

  • Gossip协议

Gossip协议是一种去中心化的协议,它通过节点之间相互通信,实现集群状态的共享和维护。每个节点定期向其他节点发送状态信息,其他节点也会将自己的状态信息发送给该节点,这样每个节点都可以知道整个集群的状态。如果某个节点的状态发生了变化,它会向其他节点广播通知,其他节点也会相应地更新自己的状态。

Redis Cluster通过Gossip协议实现节点间的状态共享和维护。每个节点会定期向其他节点发送PING消息,其他节点会返回PONG消息,以确认自己的状态。如果某个节点长时间未收到其他节点的PONG消息,就会认为该节点已经失效,将该节点从集群中移除,并进行故障转移。

  • Redis Cluster Bus

Redis Cluster Bus是一种基于消息传递的方式,用于节点之间的通信和数据同步。每个节点都有一个专门用于通信的虚拟节点,称为"bus节点"。当一个节点需要与其他节点通信时,它会向bus节点发送消息,bus节点会将该消息转发给目标节点。Redis Cluster Bus使用的是TCP协议,可以保证消息传递的可靠性和顺序性。

Redis Cluster通过Redis Cluster Bus实现数据的复制和同步。当一个节点需要将数据同步到其他节点时,它会将数据发送到bus节点,bus节点会将该数据转发给目标节点。目标节点收到数据后,会进行数据复制和同步,以保证数据的一致性。

  1. 节点角色

在Redis Cluster中,客户端和服务器分别扮演不同的角色。客户端将请求发送到集群中的某个节点,节点会将请求转发到正确的节点上,最终返回结果给客户端。节点有以下两种角色:

(1)Master节点:负责管理一部分hash slot和对应的数据。每个Master节点都有多个Slave节点作为备份,当Master节点故障时,集群会自动将其故障转移至一个Slave节点上。

(2)Slave节点:是Master节点的备份节点,负责复制Master节点的数据。当Master节点故障时,集群会自动将其故障转移至一个Slave节点上。

  1. 节点状态维护

在Redis Cluster中,客户端会定期检测所有节点的状态,以便及时发现节点故障。节点之间通过Gossip协议进行状态维护和信息交换。Gossip协议是一种基于随机选择节点的协议,它能够快速地将信息广播给其他节点。

  1. 故障转移

当一个Master节点故障时,集群会自动将其故障转移至一个Slave节点上。故障转移的过程包括以下几个步骤:
(1)检测Master节点故障。
(2)选举一个新的Master节点。
(3)将新的Master节点配置为原Master节点的备份节点。
(4)将原Master节点的数据复制到新的Master节点上。
(5)将原Master节点的Slave节点切换到新的Master节点上。

6. 扩容和缩容

Redis Cluster可以动态地添加或删除节点。扩容和缩容的过程包括以下几个步骤:

(1)扩容:将新节点加入集群中,并将其负责的hash slot分配给它。
在这里插入图片描述

(2)缩容:将要删除的节点的hash slot分配给其他节点,并将其从集群中移除。
Redis集群缩容过程主要包括以下步骤:

  1. 数据迁移

在进行Redis集群缩容操作之前,需要将要删除的节点上的数据迁移到其他节点上,以确保数据的完整性和一致性。可以使用Redis Cluster提供的reshard命令或者rebalance命令来实现数据的迁移。这些命令会自动将要删除的节点上的key分配到其他节点上,然后进行数据复制和同步,以确保数据的一致性。

  1. 删除节点

当数据迁移完成后,可以执行删除节点的操作。可以使用Redis Cluster提供的del-node命令来删除节点。在执行删除节点操作之前,需要确保该节点上的所有数据已经成功迁移,并且该节点已经从集群中移除。

  1. 故障转移

在进行Redis集群缩容操作之后,需要确保集群的高可用性,即当某个节点出现故障时,集群可以自动将从节点升级为新的主节点,以确保服务的可用性。可以使用Redis Cluster提供的failover命令或者手动执行故障转移操作。需要注意的是,在删除节点之前,需要确保故障转移操作已经完成,并且新的主节点已经被选举出来。

  1. 集群状态监控

在进行Redis集群缩容操作期间,需要密切关注集群的状态和性能指标,以确保操作的顺利进行。可以使用Redis Cluster提供的cluster info命令或者其他监控工具来监控Redis集群的运行情况。

2. 总结

通过本文的介绍,我们详细了解了Redis进阶中的高可用性方面,特别是哨兵机制(Redis Sentinel)。我们了解了哨兵机制的组建过程、监控Redis库主库下线的判定方式、选举新主库的选出方法以及故障的转移过程。对我们学习和面试都有一定的帮助。

参考文章:

  1. Redis Sentinel Documentation: https://redis.io/topics/sentinel
  2. 蒋德钧 老师的《Redis 核心技术与实战-08 | 哨兵集群:哨兵挂了,主从库还能切换吗》

3. Redis从入门到精通系列文章

《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
《Redis 从入门到精通【进阶篇】之redis主从复制详解》
《Redis 从入门到精通【进阶篇】之Redis事务详解》
《Redis从入门到精通【进阶篇】之对象机制详解》
《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
《Redis从入门到精通【进阶篇】之持久化 AOF详解》
《Redis从入门到精通【进阶篇】之持久化RDB详解》
《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》

4. Redis Cluster面试题

根据上面的学习,我们来简答一下常见的Redis高可用相关面试题

4.1. Redis Cluster如何进行扩容和缩容?

答:Redis Cluster的扩容和缩容操作都需要进行数据迁移和故障转移等操作。对于扩容操作,可以使用Redis Cluster提供的reshard或者rebalance命令来实现数据迁移。对于缩容操作,需要先将要删除的节点上的数据迁移到其他节点上,然后执行删除节点的操作。在进行扩容和缩容操作之前,需要仔细评估业务需求和集群规模,以确保操作的顺利进行。

4.2. Redis Cluster如何进行故障转移?

答:Redis Cluster的故障转移是通过选举新的主节点来实现的。当一个主节点失效时,集群会自动将一个从节点升级为新的主节点,然后将该节点上的数据同步给其他从节点,以确保数据的一致性和可用性。

4.3. Redis Cluster如何进行读写分离?

答:Redis Cluster通过将节点分为主节点和从节点来实现读写分离。主节点负责处理写操作和部分读操作,而从节点只负责处理读操作。客户端可以根据自己的需求选择连接到主节点或从节点进行读写操作。

4.4. Redis Cluster如何保证数据的一致性?

答:Redis Cluster通过使用主从复制和故障转移机制来保证数据的一致性。每个主节点都有一个或多个从节点,主节点会将自己的数据同步给从节点,以保证数据的备份和冗余。当一个主节点失效时,集群会自动将一个从节点升级为新的主节点,以确保服务的可用性和数据的一致性。

4.5. Redis Cluster如何处理网络分区?

答:Redis Cluster使用Quorum机制来处理网络分区。当网络分区发生时,集群会自动将故障节点标记为脱离集群状态,直到网络分区解除为止。在网络分区期间,只有Quorum数量的节点可以继续工作,以避免数据的分裂和冲突。

4.6. Redis Cluster如何进行数据备份?

答:Redis Cluster可以通过使用主从复制机制来进行数据备份。每个主节点都有一个或多个从节点,主节点会将自己的数据同步给从节点,以保证数据的备份和冗余。可以使用Redis Cluster提供的bgsave命令来进行手动备份,也可以使用Redis Cluster提供的AOF持久化来进行实时备份。

4.7. Redis Cluster如何进行性能优化?

答:Redis Cluster的性能优化可以从多个方面入手,包括配置优化、数据结构优化、网络优化和硬件优化等。可以使用Redis Cluster提供的性能监控工具来评估系统的性能,并根据实际情况进行调整和优化。

在这里插入图片描述大家好,我是冰点,今天的高可用集群模式(Redis Cluster)详解,全部内容就是这些。如果你有疑问或见解可以在评论区留言。

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

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

相关文章

【问题分析解决】git添加.gitignore后不生效问题

一,问题现象 在已经提交过的git管理的项目中,新增加一个.gitignore文件,或者修改.gitignore文件之后,新增的内容不生效。 二,问题原因 因为我们误解了.gitignore文件的用途,该文件只能作用于Untracked F…

JDK JRE JVM

JDK JRE JVM JDKJREJVM三者之间的联系三者之间的区别 JDK JDK是用于开发、编译、调试和运行Java应用程序的软件包,包含了Java编程语言的开发工具和Java运行时环境。JDK包括Java编译器(javac)、Java虚拟机(JVM)和Java类…

单轴机器人的结构与特点

单轴机器人是由马达驱动的移动平台,由滚珠螺杆和 U型线性滑轨导引构成,其滑座同时为滚珠螺杆的驱动螺帽及线性滑轨的导引滑块,可用半导体、光电、交通运输业、环保节能产业、精密工具机、机械产业、智慧自动化、生技医疗上。 相对于传统的模组…

django使用channels实现webSocket启动失败

问题描述 使用channels启动ASGI结果却是普通启动,如下: Watching for file changes with StatReloader Performing system checks...System check identified no issues (0 silenced). July 15, 2023 - 18:23:49 Django version 4.2, using settings s…

JavaWeb(3)——HTML、CSS、JS 快速入门

一、JavaScript 运算符 • 赋值运算符( ) 赋值运算符执行过程? 将等号右边的值赋予给左边, 要求左边必须是一个容器 出现是为了简化代码, 比如让 let age 18 ,age 加 2 怎么写呢 let age 18age 2console.log(age)age * 2con…

javaee jstl表达式

jstl是el表达式的扩展 使用jstl需要添加jar包 package com.test.servlet;import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import javax.servlet.ServletException; import javax.servlet…

下载编译Chromium

参考:Mac上本地编译Chrome浏览器踩坑笔记(2021.02最新) - 掘金 For Mac: 一、下载编译工具链:deptool git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH"$PATH:/Users/yumlu/cod…

什么是DevOps监控以及如何在组织中实施?

如今的软件开发商经常面临两大挑战——快速交付和大规模创新。DevOps通过在软件开发生命周期(SDLC)中引入自动化来开发和交付高质量的软件,从而帮助解决这些挑战。 持续集成(CI)/持续部署(CD)是DevOps实践中自动化的关键组件。它可以自动化代码构建、测试…

力扣 1005. K 次取反后最大化的数组和

题目来源:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ C题解1:最直接的想法就是负的变正的,如果负的元素数量小于k,就挑选绝对值大的负数变正;如果负的元素数量大于k&#xf…

阿里云声音复刻

阿里云声音复刻 个性化人声定制 阿里云个性化人声定制是智能语音交互产品自学习平台下的一部分 使用方式:https://help.aliyun.com/document_detail/456006.html 方式一:控制台界面定制使用方式 方式二:通过OpenAPI定制:在该页…

回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于KELM-Adaboo…

IP基础知识总结

IP他负责的是把IP数据包在不同网络间传送,这是网络设计相关的,与操作系统没有关系。所以这部分知识,不是网络的重点。IP和路由交换技术联系紧密。但是要作为基本知识点记住。 一、基本概念 网络层作用:实现主机与主机之间通信。 …

linux之Ubuntu系列(三)远程管理指令☞SSH 高级应用 RSA非对称加密 以及免密登录,配置别名

对称加密 、非对称加密 1、对称加密中加密和解密使用的秘钥是同一个;非对称加密中采用两个密钥,一般使用公钥进行加密,私钥进行解密。 2、对称加密解密的速度比较快,非对称加密和解密花费的时间长、速度相对较慢。 3、对称加密的…

81. 正则表达式

一、概述二、匹配单个字符三、匹配一组字符四、使用元字符五、重复匹配六、位置匹配七、使用子表达式八、回溯引用九、前后查找十、嵌入条件参考资料 一、概述 正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或…

uniapp微信小程序使用axios(vue3+axios+ts版)

版本号 "vue": "^3.2.45", "axios": "^1.4.0", "axios-miniprogram-adapter": "^0.3.5", 安装axios及axios适配器,适配小程序 yarn add axios axios-miniprogram-adapter 使用axios 在utils创建utils/…

7个银行的软件测试项目实战,别再说简历项目不知道怎么写了

目录 前言 项目描述1:上海华瑞银行直连票据项目 项目描述2:平安金服风控中台系统 项目描述3:众安创展APP项目 项 目4: 招商银行VTM自助渠道服务系统 项 目5:招商银行票据支付 项 目6: 平安银行风控系…

Virus Total 曝数据泄露大事件:涉及多国情报部门

The Hacker News 网站披露,可疑文件和病毒在线检测平台 VirusTotal 曝出数据泄露事故,一名员工无意中将部分 VirusTotal 注册客户的姓名、电子邮件地址等敏感数据信息上传到了恶意软件扫描平台,此举导致约 5600 名用户数据泄露。 据悉&#x…

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)

深入探索和分析MySQL数据库的数据备份和恢复实战开发指南 MySQL数据库备份全量备份全量备份应用场景 增量备份binlogbinlog主要作用binlog的作用主要有两个方面 开启binlog日志功能要开启MySQL的binlog日志步骤 mysqlbinlogmysqlbinlog的使用案例 全量备份与增量备份结合按天全…

安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用后台模块SessionCookieToken身份验证唯一性

文章目录 开发环境数据导入-mysql架构&库表列数据库操作-mysqli函数&增删改查数据接收输出-html混编&超全局变量第三方插件引用-js传参&函数对象调用身份验证-Cookie使用身份验证-Session使用唯一性判断-Token使用具体安全知识点:Cookie和Session都…

复习java基础

复习一天有点忘了的知识: 结构化编程 结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。 指导思想 自顶向下、逐步求精、模块化 编程过程 流程图是…