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

news2024/11/26 18:29:39

文章目录

  • 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.coloradmin.cn/o/753536.html

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

相关文章

【计算机视觉 | 图像分类】arxiv 计算机视觉关于图像分类的学术速递(7 月 14 日论文合集)

文章目录 一、分类|识别相关(10篇)1.1 Video-FocalNets: Spatio-Temporal Focal Modulation for Video Action Recognition1.2 Watch Your Pose: Unsupervised Domain Adaption with Pose based Triplet Selection for Gait Recognition1.3 YOLIC: An Efficient Method for Obj…

【JavaEE】HTTP请求的构造

目录 1、通过form表单构造HTTP请求 2、通过JS的ajax构造HTTP请求 3、Postman的安装和简单使用 常见的构造HTTP请求的方式有一下几种: 直接通过浏览器的地址栏,输入一个URL,就可以构造一个GET请求HTML中的一些特殊标签,也会触发…

【Linux】1、装机、装操作系统、部署

文章目录 一、装系统1.0 格式化 U 盘1.1 做启动盘1.1.2 rufus1.1.2 poweriso 1.2 安装步骤 二、恢复系统2.1 BootManager2.2 recovery mode 一、装系统 下载地址: http://old-releases.ubuntu.com/releases/16.04.5/ubuntu-16.04.5-server-amd64.isohttps://mirro…

基于STM32 ARM+FPGA伺服控制系统(二)软件及FPGA设计

完整的伺服系统所包含的模块比较多,因此无法逐一详细介绍,所以本章着重介绍 设计难度较高的 FPGA 部分并简单介绍 ARM 端的工作流程。 FPGA 部分主要有 FOC 算法、电流采样算法及编码器采样算法,是整个控制系统的基础,直接…

本地appserv外挂网址如何让外网访问?快解析端口映射

一、appserv是什么? AppServ 是 PHP 网页架站工具组合包,作者将一些网络上免费的架站资源重新包装成单一的安装程序,以方便初学者快速完成架站,AppServ 所包含的软件有:Apache[、Apache Monitor、PHP、MySQL、phpMyAdm…

好物推荐文案怎么写吸引人?纯干货

互联网上充斥着各种各样好物种草文,一不小心就跌入了软文的圈套中,好物推荐文案写得好,流量绝对少不了。 好物推荐文案怎么写吸引人?通过整理总结上百篇爆款种草文案,总结出一套超实用的文案写作妙招!纯干…

活动页服务端渲染探索

目标 通过采用在服务端渲染激励页的方式,降低页面加载白屏时间,从而提升激励 H5 渲染体验。 架构设计 前端服务框架调研选型 只对比分析以下两种方案: Vue3 Nuxt3 WebpackNext.js React Node.js ’Nuxt3Next.js介绍Nuxt是一个基于Vu…

flask实现get和post请求

1、实现get请求 在项目根目录创建app.py 代码如下: from flask import Flask,render_template,requestapp Flask(__name__)app.route("/regist/user/", methods[GET]) def regist():return render_template("regist.html") #默认去templat…

三维 GIS 引擎该用什么?结合目前主流引擎进行分析

相信大多数人在谈到三维 GIS 引擎时,第一个想到的首先是 CesiumJS,CesiumJS 以其免费开源的特点,快速占领了三维 GIS 这个领域,同时也催生了许多以 CesiumJS 为基础的衍生产品。CesiumJS 作为一个功能强大的 JavaScript 库&#x…

3ds Max 无插件制作燃烧的火焰动画特效

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在 3ds Max 中对火焰进行动画处理 如果您能找到“大气装置”设置,这很容易做到。基本上,你选择一个“Gizmo”(BoxGizmo,SphereGizmo或CylGizmo)&…

HashMap的遍历方式及底层原理

目录 概述MapMap的全谱系图HashMapkey和value HashMap的四种遍历方式keySetvaluesentrySetIterator性能分析应用场景二维表 底层原理key是数值型key是字符类型 总结: 概述 Map Map是Java中的一个接口,它继承自Collection接口,定义了键值对的…

GB35114双向身份认证(A级)学习笔记

GB35114双向身份验证学习笔记 温故而知新 SSL单向认证 摘录自:https://blog.csdn.net/qq_45759354/article/details/128672828 SSL协议用到了对称加密和非对称加密,在建立连接时,SSL首先对对称加密密钥使用非对称加密。连接建立好后&…

Docker 安装 Nacos 单节点

Docker 安装 Nacos 单节点 1 搜索 Nacos2 下载 Nacos3 安装 Nacos Nacos(中文名“云注册中心和配置中心”)是一个用于动态服务发现、配置管理和服务管理的开源项目,它由阿里巴巴集团开发并开源。Nacos提供了一种简单而强大的方式来实现微服务…

自动化用例编写思路 (使用pytest编写一个测试脚本)

目录 一,明确测试对象 二,编写测试用例 构造请求数据 封装测试代码 断言设置 三,执行脚本获取测试结果 四,总结 经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口…

系统调用与函数调用有什么区别?

本文我们来聊聊系统调用与普通的函数调用之间的区别。 作为程序员你肯定写过无数的函数,假设有这样两个函数: void funcB() {} void funcA() { funcB();} 函数之间是可以相互调用的,这很简单很happy有没有。 要知道是代码、是函数就可以相…

ABAP 发送特定格式内容的邮件

项目中,经常会有需求,向客户,供应商发送邮件,但是会有一些格式上的要求。 我们一般使用长文本来处理此类需求 举例,客户需要发送一个如下邮件主体内容(带格式) Dear Customer, Attached is y…

相机图像质量研究(2)ISP专用平台调优介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

洛谷:P5016 龙虎斗 ← NOIP2018 普及组T2

【题目来源】https://www.luogu.com.cn/problem/P5016【题目描述】 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n 个兵营(自左至右编号 1∼n),相邻编号的兵营之间相隔 1 厘米,…

psutil库使用详解

一、背景 在Python的世界里,有一些库因其强大的功能和易用性而备受开发者们的喜爱。今天,我们要介绍的就是其中的一员——psutil库。psutil(python system and process utilities)是一个跨平台的第三方库,用于获取系统运行时的进程和系统利用…

MySQL 事务与存储引擎

目录 一、MySQL事务的概念 二、事务的ACID特点 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 2.5 事务之间的相互影响 三、Mysql及事物隔离级别 3.1 查询全局事务隔离级别 3.2 查询会话事务隔离级别 3.3 设置全局事务隔离级别 3.4 设置会话事务隔离级别 …