redis集群 —— 高性能

news2024/12/23 5:53:35

文章目录

  • 前言
  • 节点
      • 1.1 启动节点
  • 槽指派
      • 2.1 记录节点的槽指派信息
      • 2.2 传播节点的槽指派信息
      • 2.3 记录集群所有槽的指派信息
  • 在集群中执行命令
      • 3.1 计算键属于哪个槽
      • 3.3 节点数据库的实现
  • 重新分片
  • 复制与故障转移

前言

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。

本节将对集群的节点、槽指派、命令执行、重新分片、转向、故障转移、消息等各个方面进行介绍。

数据分片,每一个分片存在一个节点上,每个节点有一主多从,保证高可用。

节点

一个Redis集群通常由**多个节点(node)**组成,在刚开始的时候, 每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。
连接各个节点的工作可以使用CLUSTER MEET命令来完成,该命令的格式如下:

CLUSTER MEET <ip> <port>

向一个节点node发送CLUSTER MEET命令,可以让node节点与ip和port所指向的节点进行握手(handshake),当握手成功时,node节点就会将ip和port所指定的节点添加到node节点当前所在的集群中。

1.1 启动节点

一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器 在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务 器的集群模式,如图
在这里插入图片描述
节点(运行在集群模式下的Redis服务器)会继续使用所有在单机 模式中使用的服务器组件,比如说:

  • 节点会继续使用文件事件处理器来处理命令请求和返回命令回复。
  • 节点会继续使用时间事件处理器来执行serverCron函数,而 serverCron函数又会调用集群模式特有的clusterCron函数。clusterCron函 数负责执行在集群模式下需要执行的常规操作,例如向集群中的其他节 点发送Gossip消息,检查节点是否断线,或者检查是否需要对下线节点 进行自动故障转移等。
  • 节点会继续使用数据库来保存键值对数据,键值对依然会是各种 不同类型的对象。
  • 节点会继续使用RDB持久化模块和AOF持久化模块来执行持久化 工作。
  • 节点会继续使用发布与订阅模块来执行PUBLISH、SUBSCRIBE等 命令。
  • 节点会继续使用复制模块来进行节点的复制工作。
  • 节点会继续使用Lua脚本环境来执行客户端输入的Lua脚本。

除此之外,节点会继续使用redisServer结构来保存服务器的状态,使用redisClient结构来保存客户端的状态,至于那些只有在集群模式下才会用到的数据,节点将它们保存到了cluster.h/clusterNode结构、 cluster.h/clusterLink结构,以cluster.h/clusterState结构里面

槽指派

Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个 槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。

当数据库中的16384个槽都有节点在处理时,集群处于上线状态 (ok);相反地,如果数据库中有任何一个槽没有得到处理,那么集群 处于下线状态(fail)。

2.1 记录节点的槽指派信息

clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽:
结构
slots属性是一个二进制数据(bit array),这个数组的长度为16384/8=2048个字节,共包含16384个二进制位。
Redis以0为起始索引,16384为终止索引,对slots数组中的16384个二进制进行编号,并根据索引i上的二进制位来判断节点是否负责处理槽i:

  • 如果slots数组在索引i上的二进制位的值为1,那么表示节点负责处理
  • 如果slots数组在索引i上的二进制位的值为0,那么表示不负责处理

2.2 传播节点的槽指派信息

各个节点会通知其他节点本节点的槽指派信息,最终达到所有的节点都知道所有的槽指派信息。

2.3 记录集群所有槽的指派信息

clusterState结构中的slots数组记录了集群中所有的16384个槽的指派信息:
结构
slots数组包含16384个项,每个数组项都是一个指向clusterNode结构的指针:

  • 如果slots[i]指针指向null,那么表示槽i尚未指派给任何节点
  • 如果slots[i]指针指向一个clusterNode结构,那么表示槽i已经指派给了clusterNode结构所代表的节点。

在集群中执行命令

3.1 计算键属于哪个槽

def slot_number(key):
	return CRC16(key) & 16384

其中CRC16(key) 语句用于计算键key的CRC-16校验和,而&16384则用于计算出一个介于0到16384之间的整数作为键key的槽号。

3.3 节点数据库的实现

集群节点保存键值对以及键值对过期时间的方式,与第9章里面介 绍的单机Redis服务器保存键值对以及键值对过期时间的方式完全相同。

节点和单机服务器在数据库方面的一个区别是,节点只能使用0号数据库,而单机Redis服务器则没有这一限制。

另外除了将键值对保存在数据库里面之外,节点还会用 clusterState结构中的slots_to_keys跳跃表来保存槽和键之间的关系:

slots_to_keys跳跃表每个节点的分值(score)都是一个槽号,而每个节点的成员(member)都是一个数据库键:

  • 每当节点往数据库中添加一个新的键值对时,节点就会将这个键以及键的槽号关联到slots_to_keys跳跃表。
  • 当节点删除数据库中的某个键值对时,节点就会在slots_to_keys跳跃表解除被删除键与槽号的关联。

通过在slots_to_keys跳跃表中记录各个数据库键所属的槽,节点可 以很方便地对属于某个或某些槽的所有数据库键进行批量操作,例如命 令CLUSTER GETKEYSINSLOT <slot> <count>命令可以返回最多count个 属于槽slot的数据库键,而这个命令就是通过遍历slots_to_keys跳跃表来 实现的。

重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点 (源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。

重新分片操作可以在线(online)进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。

操作步骤:
1)redis-trib对目标节点发送CLUSTER SETSLOT <slot> IMPORTING <source_ id>命令,让目标节点准备好从源节点导入(import)属于槽slot的键值对。

2)redis-trib对源节点发送CLUSTER SETSLOT <sIot> MIGRATING <target id>命令,让源节点准备好将属于槽slot的键值对迁移(migrate)至目标节点。

3)redis-trib向源节点发送CLUSTERGETKEYSINSLOT <slot> <count>命令,获得最多count个属于槽slot的键值对的键名(key
name)

4)对于步骤3获得的每个键名,redis-tib都向源节点发送一个 MIGRATE <target_ ip> <starget_ port> <key name> 0<timeout>命令,将被选中的键原子地从源节点迁移至目标节点。

5) 重复执行步骤3和步骤4,直到源节点保存的所有属于槽slot的键值对都被迁移至目标节点为止。

6)redis-trib向集群中的任意一个节点发送CLUSTER SETSLOT <slot> NODE <target id>命令,将槽slot指派给目标节点,这一
指派信息会通过消息发送至整个集群,最终集群中的所有节点都会知道槽slot已经指派给了目标节点。

复制与故障转移

复制与故障迁移都类似于Sentinel的复制与故障迁移

都是采用Raft算法

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

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

相关文章

vp9协议笔记

vp9协议笔记&#x1f4d2; 本文主要是对vp9协议的梳理&#xff0c;协议的细节参考官方文档&#xff1a;VP9协议链接&#xff08;需要加速器&#xff09; vp9协议笔记 vp9协议笔记&#x1f4d2;1. 视频编码概述2. 超级帧superframe&#xff08;sz&#xff09;&#xff1a;2. fr…

ZK高可用架构涉及常用功能整理

ZK高可用架构涉及常用功能整理 1. zk的高可用系统架构和相关组件1.1 Quorum机制1.2 ZAB协议 2. zk的核心参数2.1 常规配置2.2 特殊优化配置 3. zk常用命令3.1 常用基础命令3.2 常用运维命令 4. 事务性4.1 数据写流程4.2 数据读流程 5. 疑问和思考5.1 zk不擅长处理哪些场景&…

springboot家乡特色推荐系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括家乡特色推荐的网络应用&#xff0c;在外国家乡特色推荐系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&#xff0…

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系&#xff0c;这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的&#xff0c;Mybatis中存在两级缓存。分别是一级缓存(会话级)&#xff0c;和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…

HCIP:不同VLAN下实现网络互相通信

配置pc1 配置pc2 配置pc3 将sw1划分到vlan3 将sw3划分到vlan3 在sw1上进行缺省 将sw1上&#xff08;g0/0/1&#xff09;的untagged改成 1 3 则在pc1上ping pc2可通 在sw1上进行缺省 在sw3上&#xff08;e0/0/1&#xff09;打标记 则在pc1上ping pc3可通&#xff08;实现互通&am…

阿里云Serverless 容器使用,以及常见问题处理

阿里云Serverless Kubernetes容器服务&#xff08;ASK&#xff09;是基于Kubernetes的Serverless容器产品&#xff0c;能够自动完成资源管理、弹性伸缩和按需计费。以下是一些基本使用步骤以及常见问题处理&#xff1a; 阿里云Serverless Kubernetes&#xff08;ASK&#xff0…

17.鸿蒙HarmonyOS App(JAVA)滑动选择器

每天进步一点点,成功在久不在速 滑动选择器 //设置文本样式 picker.setNormalTextFont(Font.DEFAULT_BOLD); picker.setNormalTextSize(40); picker.setNormalTextColor(new Color(Color.getIntColor("#FFA500"))); picker.setSelectedTextFont(Font.DEFAULT_BOLD)…

socket通信客户端收到16进制转换出现efbfbd乱码解决办法

socket客户端接收服务端发来的数据时&#xff0c;发现老有efbfbd乱码&#xff0c;如下图&#xff0c;服务端发送的是02040200013CF0&#xff0c;但是客户端接收到解析后却不一样 客户端接收解析并打印 在网上查原因后&#xff0c;原因是将接收的byte数组转换为String后&#…

C++:第十三讲BFS广度优先搜索

前言 今天带领大家学一下BFS。 DFS可以看——C:第十二讲DFS深搜&#xff08;二&#xff09;_c匿名函数dfs-CSDN博客 BFS简介 广度优先搜索&#xff08;breadth-first search&#xff0c;缩写为bfs&#xff09;又名宽度优先搜索&#xff0c;是最简便的图的搜索算法之一&…

Conda python运行的包和环境管理 入门

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装 Conda 是一个功能强大的命令行工具&#xff0c;用于在 Windows、macOS 和 Linux 上运行的包和环境管理。 本 conda 入门指南介绍了启动和使用 conda 创建环境和安装包的基础知识。 1. 准备…

优先级队列(堆) PriorityQueue

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.优先级队列 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的创建 2.3 堆的插入和删除 2.…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库&#xff0c;可对通信双方流通的字节序列进行加解密&#xff0c;保障通信的安全。本文以c编写的tcp server和tcp client为例子&#xff0c;openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

【软考】位示图

目录 一、基本概念二、位示图 一、基本概念 1.要将文件保存到外部存储器&#xff08;外存或辅存&#xff09;&#xff0c;首先得知道存储空间的使用情况 2.要清楚哪个物理块已经被占用&#xff0c;哪个物理块是空闲的 3.当对大容量的磁盘存储空间被多用户共享时&#xff0c;用户…

套接字通信(附带单线程TCP套接字通信代码)

套接字-Socket 1. 概念 1.1 局域网和广域网 局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09;是两种不同范围的计算机网络&#xff0c;它们用于连接多台计算机以实现数据共享和通信。 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1…

JUC-CAS

1. CAS概述 CAS(Compare ans swap/set) 比较并交换&#xff0c;实现并发的一种底层技术。它将预期的值和内存中的值比较&#xff0c;如果相同&#xff0c;就更新内存中的值。如果不匹配&#xff0c;一直重试&#xff08;自旋&#xff09;。Java.util.concurrent.atomic包下的原…

AMIS的组件学习使用

部分代码片段 {"id": "filterForm","className": " xysd-zbkb-pubquery","labelWidth": 130,"body": [{"type": "grid","className": "xysd-grid-query-input","c…

鲲鹏微认证——openEuler开源操作系统迁移实践

文章目录 为什么要系统搬迁为什么选择欧拉欧拉系统迁移概述实施路径工具实战 为什么要系统搬迁 2020年12月&#xff0c;CentOs作为由开源社区免费提供的操作系统&#xff0c;宣布将对CentO58于2021年底停止服务&#xff0c;CentO57则于2024年6月底停止服务。 这将直接导致操作…

MyBatis详解(1)-- ORM模型

MyBatis详解&#xff08;1&#xff09; JDBC的弊端&#xff1a; ORM 模型常见的ORM模型&#xff1a;mybatis和Hibernate的区别 ***优势&#xff1a;mybatis解决问题&#xff1a;优点&#xff1a; MyBatisMyBatis环境搭建项目架构mybatis生命周期 JDBC的弊端&#xff1a; 1.硬编…

dataGrip连接数据库mysql和intersystems的iris

intersystems公司的产品iris是cache的升级版本&#xff0c;目前绝大多数数据库工具都没法连接这个数据库 datagrip下载地址 https://download-cdn.jetbrains.com.cn/datagrip/datagrip-2023.3.3.exe 选择对应的数据库产品类型 新建数据库资源连接 填上对应的数据库连接和账…

12.前端--CSS-背景属性

1.背景颜色 样式名称&#xff1a; background-color 定义元素的背景颜色 使用方式: background-color:颜色值; 其他说明&#xff1a; 元素背景颜色默认值是 transparent&#xff08;透明&#xff09;      background-color:transparent; 代码演示&#xff1a; 背景色…