【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)(二)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)(一)https://developer.aliyun.com/article/1471080


槽(slot)

在Redis集群中,哈希槽(hash slot)是一种用于进行数据分区和数据共享的机制。

Redis集群中的数据被分割成 16384 个哈希槽,每个槽可以存储一个或多个键值对。在集群中的每个节点都负责一部分槽的数据存储和处理。当一个节点接收到一个操作命令时,它会根据命令操作的键(key)使用一致性哈希算法来决定该键属于哪个哈希槽,然后将该操作转发给负责管理该槽的节点进行处理。

哈希槽的设计使得Redis集群能够进行水平扩展和负载均衡。通过将数据分布在多个节点上,集群可以同时处理更多的请求,提高系统的吞吐量和并发能力。此外,当需要扩展集群时,可以通过添加新的节点,并将未分配的槽分配给新节点来实现扩展。 在Redis集群中管理哈希槽的分配是通过集群管理命令来完成的,例如cluster addslots用于将槽分配给节点,cluster delslots用于从节点中删除槽,cluster countkeysinslot用于计算槽中的键值对数量等等。这些命令使得管理员可以灵活地管理集群中的数据分布和节点调度。

cluster addslots

cluster addslots是Redis集群中的一个命令,用于将一个或多个哈希槽(hash slot)分配给当前节点。

bash

复制代码

cluster addslots <slot>[slot ...]

在Redis集群中,数据被分割为16384个哈希槽,每个槽都可以存储一个或多个键值对。这种分区方式使得数据能够在集群中进行水平扩展和负载均衡,每个节点负责一部分槽的数据。

当你在Redis集群中添加一个新的节点时,这个节点默认是没有分配任何哈希槽的。因此,你可以使用cluster addslots命令手动将特定的哈希槽分配给该节点。你可以指定一个或多个槽的范围,例如cluster addslots 0 1 2 3 4 1000-2000,这将将槽0、1、2、3、4以及1000到2000之间的槽分配给当前节点。

在执行cluster addslots命令后,Redis集群将会更新集群的分配信息,并将这些槽分配给指定的节点。集群会自动将新分配的槽信息同步给其它节点,以确保哈希槽的分配在整个集群中保持一致。

cluster delslots

cluster delslots <slot>[slot...] 是用于在Redis集群中移除指定哈希槽(slot)的命令。

在Redis集群中,每个节点都负责管理一部分哈希槽,并处理与这些槽相关的操作。通过移除槽,你可以调整集群中节点之间的数据分布,以满足不同的需求。

使用cluster delslots命令,你可以指定一个或多个哈希槽来进行移除。语法如下:

bash

复制代码

cluster delslots <slot>[slot...]

其中,<slot>[slot...]指定了要移除的槽的编号。你可以一次指定一个或多个槽,用空格分隔它们的编号。

请注意,执行此命令将导致所选槽内的数据被删除或不可访问。在移除槽之前,请确保你了解操作的后果,并确保有适当的备份和数据迁移策略。

以下是一个使用cluster delslots命令的示例:

bash

复制代码

cluster delslots 1234 5678

该示例将从当前节点中移除槽1234和5678。移除后,这些槽内的数据将不再由该节点负责处理。

CLUSTER FLUSHSLOTS

CLUSTER FLUSHSLOTS 是一个 Redis 集群命令,用于清空集群中所有节点所负责的哈希槽(slots)。当执行该命令时,集群将会移除所有键值对,并将所有哈希槽设置为空,从而实现集群中数据的清空操作。

使用 CLUSTER FLUSHSLOTS 命令需要注意以下几点:

  1. 需要连接到集群主节点执行:CLUSTER FLUSHSLOTS命令只能在连接到集群的主节点上执行。如果你连接到一个从节点上,需要先使用 CLUSTER FAILOVER 命令切换到主节点上。
  2. 数据删除是不可逆操作:执行 CLUSTER FLUSHSLOTS 命令后,集群中存储的所有键值对都将被永久地删除,无法恢复。确保在执行该命令前,你已经做好了备份或确认数据不再需要。
  3. 需要集群处于正常工作状态:在执行 CLUSTER FLUSHSLOTS 命令前,确保集群处于正常工作状态,所有节点都在线,并且所有哈希槽都有主节点。如果集群中有节点失效或哈希槽未分配给主节点,需要先修复集群再执行该命令。

执行 CLUSTER FLUSHSLOTS 命令的示例:

  1. 使用 Redis 命令行客户端连接到 Redis 集群的主节点。
  2. 执行 CLUSTER FLUSHSLOTS 命令:CLUSTER FLUSHSLOTS

CLUSTER SETSLOT <slot> NODE <node id>

CLUSTER SETSLOT <slot> NODE <node id> 是一个 Redis 集群命令,用于将指定的哈希槽(slot)分配给指定的节点(node id)。如果槽已经被分配给其他节点,该命令会先要求另一个节点删除该槽,然后再指派给目标节点。

使用 CLUSTER SETSLOT <slot> NODE <node id> 命令需要注意以下几点:

  1. 集群正常工作状态:在执行 CLUSTER SETSLOT <slot> NODE <node id> 命令之前,确保 Redis 集群处于正常工作状态,所有节点都处于在线状态。
  2. 槽的范围:Redis 集群将所有的键值对分配到不同的哈希槽上,默认情况下,集群有16384个哈希槽。 <slot> 参数是一个整数,表示要操作的具体槽编号。
  3. 节点的标识:<node id> 参数是一个字符串,表示节点的标识,通常是节点的 ID 或节点的 IP 地址加端口。
  4. 数据迁移:如果目标槽(slot)已经被其他节点所指派,集群会先发送指令给该节点,要求它删除该槽的键值对。然后,集群会将该槽重新指派给目标节点。这意味着,在键值对迁移过程中,会有一段时间内数据可能会在集群中的其他节点之间进行迁移。

执行 CLUSTER SETSLOT <slot> NODE <node id> 命令的示例:

  1. 使用 Redis 命令行客户端连接到 Redis 集群的任意节点。
  2. 执行 CLUSTER SETSLOT <slot> NODE <node id> 命令,将指定的哈希槽分配给指定的节点。
  • 例如,将槽5指派给节点1234567890abcdef1234567890abcdef12345678:CLUSTER SETSLOT 5 NODE 1234567890abcdef1234567890abcdef12345678

CLUSTER SETSLOT <slot> MIGRATING <node id>

CLUSTER SETSLOT <slot> MIGRATING <node id> 是一个 Redis 集群命令,用于将本节点上的指定槽(slot)迁移至指定的节点(node id)。

使用 CLUSTER SETSLOT <slot> MIGRATING <node id> 命令时,需要注意以下几点:

  1. 迁移流程:在进行槽迁移之前,请确保 Redis 集群正常工作,并且源节点和目标节点都处于在线状态。迁移槽的过程包括以下几个步骤:
  • 源节点将指定的槽标记为正在迁移(migrating)状态。
  • 将该槽的键值对复制到目标节点。
  • 源节点从本地删除该槽的键值对。
  • 源节点将该槽的迁移状态(migrating)更新为迁移结束(importing)。
  1. 槽的范围:Redis 集群将所有的键值对分配到不同的哈希槽上,默认情况下,集群有16384个哈希槽。 <slot> 参数是一个整数,表示要操作的具体槽编号。
  2. 节点的标识:<node id> 参数是一个字符串,表示目标节点的标识,通常是节点的 ID 或节点的 IP 地址加端口。

执行 CLUSTER SETSLOT <slot> MIGRATING <node id> 命令的示例:

  1. 使用 Redis 命令行客户端连接到 Redis 集群的源节点。
  2. 执行 CLUSTER SETSLOT <slot> MIGRATING <node id> 命令,将指定槽迁移到指定的目标节点。
  • 例如,将本节点上的槽5迁移到目标节点1234567890abcdef1234567890abcdef12345678:CLUSTER SETSLOT 5 MIGRATING 1234567890abcdef1234567890abcdef12345678

CLUSTER SETSLOT <slot> IMPORTING <node_id> 是一个 Redis 集群命令,用于从指定节点(node_id)导入槽(slot)到当前节点。

CLUSTER SETSLOT <slot> IMPORTING <node_id>

CLUSTER SETSLOT <slot> IMPORTING <node_id> 从node id指定的节点中导入槽slot到本节点。

  1. 导入流程:在执行槽导入之前,请确保 Redis 集群处于正常工作状态,并且源节点和目标节点都在线。槽导入的流程如下:
  • 源节点将指定的槽标记为正在导入(importing)状态。
  • 目标节点从源节点获取该槽的键值对。
  • 目标节点将该槽的键值对加入自己的数据集中。
  • 源节点将该槽的导入状态(importing)更新为导入结束(stable)。
  1. 槽范围:Redis 集群将所有键值对分配到不同的哈希槽上。默认情况下,集群包含16384个哈希槽。<slot> 参数是一个整数,用于指定要操作的槽编号。
  2. 节点标识:<node_id> 参数是一个字符串,表示源节点的标识。通常,它可以是节点的 ID 或节点的 IP 地址加端口。

执行 CLUSTER SETSLOT <slot> IMPORTING <node_id> 命令的示例:

  1. 使用 Redis 命令行客户端连接到目标节点的 Redis 集群。
  2. 执行 CLUSTER SETSLOT <slot> IMPORTING <node_id> 命令,将指定槽从源节点导入到当前节点。
  • 例如,从源节点1234567890abcdef1234567890abcdef12345678中导入槽5到当前节点:CLUSTER SETSLOT 5 IMPORTING 1234567890abcdef1234567890abcdef12345678

cluster setslot <slot>stable

"cluster setslot <slot> stable" 是 Redis 集群命令之一,用于将指定的槽位(slot)标记为稳定(stable)状态。

在 Redis 集群中,数据被分布在不同的槽位上。每个槽位都有一个负责人(slot owner),负责处理该槽位上的数据。当一个槽位被标记为稳定状态时,意味着该槽位的负责人已经确定,不会再发生变动。

使用 "cluster setslot <slot> stable" 命令,可以手动将一个槽位标记为稳定状态。这在某些情况下是有用的,例如当你需要手动指定槽位的负责人,或者在进行集群维护时需要暂时固定槽位的负责人。

需要注意的是,只有当槽位被标记为稳定状态后,才能进行一些特定的操作,例如迁移槽位或添加节点到集群中。

总结起来,"cluster setslot <slot> stable" 命令用于将指定的槽位标记为稳定状态,确保该槽位的负责人不会再发生变动。

键(key)

在 Redis 集群中,key 是用于标识存储在数据库中的数据的唯一标识符。每个 key 都与一个对应的值(value)相关联,所有的 key 被分布在不同的槽位(slot)上。每个槽位负责处理一部分 key。这种分布方式使得数据可以在集群中进行水平扩展,并允许集群中的多个节点共同处理请求。

在使用 Redis 集群时,需要注意以下几点:

  1. key 的分布是由集群自动处理的,开发者无需手动指定 key 的槽位。
  2. 当执行命令时,Redis 集群会根据 key 的槽位将请求路由到正确的节点上进行处理。
  3. 在集群中添加或删除节点时,部分 key 可能会被重新分配到不同的槽位上,但这对于应用程序来说是透明的。

总结起来,Redis 集群中的 key 是用于标识存储在数据库中的数据的唯一标识符,它们被分布在不同的槽位上,并且可以与各种数据类型相关联。

cluster keyslot <key>

"cluster keyslot " 是 Redis 集群命令之一,用于计算给定键(key)应该被放置在哪个槽位(slot)上。

在 Redis 集群中,数据被分布在不同的槽位上。每个槽位负责处理一部分键值对。当执行命令时,Redis 集群会根据键的槽位将请求路由到正确的节点上进行处理。

使用 "cluster keyslot <key>" 命令,可以通过计算给定键的哈希值来确定它应该被放置在哪个槽位上。这个命令对于开发者来说是有用的,因为它可以帮助他们了解给定键的分布情况,以及确定它应该被路由到哪个节点上。

注意,计算键的槽位是根据 Redis 集群的哈希槽位分配算法进行的。这个算法使用 CRC16 校验和函数对键进行哈希计算,然后将哈希值对槽位总数取模来确定槽位编号。

总结起来,"cluster keyslot <key>" 命令用于计算给定键应该被放置在哪个槽位上。它通过计算键的哈希值并使用哈希槽位分配算法来确定槽位编号。这个命令对于了解键的分布情况和路由到正确节点上是很有帮助的。

cluster countkeysinslot <slot>

cluster countkeysinslot <slot> 是一个Redis命令,用于返回指定槽位(slot)中当前包含的键值对数量。

在 Redis 集群中,数据被分布在不同的槽位上。每个槽位负责存储一部分数据。custer countkeysinslot 命令可以帮助我们查看指定槽位中当前包含的键值对数量。

使用该命令时,需要替换 <slot> 为实际的槽位号。例如,如果我们想要查看槽位号为 123 的槽位中包含的键值对数量,可以执行以下命令:

cluster countkeysinslot 123

执行该命令后,Redis 会返回槽位号为 123 的槽位中当前包含的键值对数量。这个数量可以帮助我们了解该槽位中存储的数据量,从而更好地管理和优化 Redis 集群的性能。

cluster getkeysinslot <slot> <count>

cluster getkeysinslot <slot> <count> 是一个 Redis 命令,用于返回指定槽位(slot)中的键。

在 Redis 集群中,数据被分布在不同的槽位上。每个槽位负责存储一部分数据。cluster getkeysinslot 命令可以帮助我们获取指定槽位中的键。

使用该命令时,需要替换 <slot> 为实际的槽位号,<count> 为需要返回的键的数量。例如,如果我们想要获取槽位号为 123 的槽位中的前 10 个键,可以执行以下命令:

bash

复制代码

cluster getkeysinslot 123 10

执行该命令后,Redis 会返回槽位号为 123 的槽位中的前 10 个键。这些键可以帮助我们了解该槽位中存储的具体数据,从而进行进一步的操作和分析。

注意,由于 Redis 集群的数据分布是动态的,所以在执行 cluster getkeysinslot 命令时,返回的键可能会有变化。因此,该命令主要用于调试和分析,不适合用于生产环境中的正式操作。

Redis集群总结

Redis集群提供了可靠的高可用性和扩展性,能够满足大规模分布式应用中对于高性能和数据可靠性的要求。通过节点间的数据分片、主从复制和自动迁移,Redis集群能够实现数据的平衡分布和故障恢复。

  • 节点自动发现:Redis Cluster可以自动发现新加入的节点,并将其加入到集群中。当一个新的节点加入集群时,其他节点会自动感知到并进行相应的配置更新。
  • slave->master选举和集群容错:Redis Cluster支持主从复制机制,当一个主节点宕机时,集群会自动选举一个从节点作为新的主节点,以保证集群的高可用性和容错性。
  • Hot resharding:Redis Cluster支持在线分片,即在运行过程中动态地增加或减少分片。这意味着可以在不停机的情况下对集群进行扩容或缩容操作,以适应不同的负载需求。
  • 进群管理:Redis Cluster提供了cluster xxx命令,用于管理集群中的节点。通过该命令,可以查看集群的状态、节点的信息、分片的分布情况等。
  • 基于配置(nodes-port.conf)的集群管理:Redis Cluster使用一个配置文件(nodes-port.conf)来管理集群中的节点。该配置文件包含了集群中所有节点的信息,包括节点的IP地址、端口号、角色等。
  • ASK转向/MOVED转向机制:当一个客户端请求的数据位于其他节点上时,Redis Cluster会返回一个ASK转向或MOVED转向的响应,告诉客户端应该去访问哪个节点来获取数据。这种机制保证了数据的一致性和高效性。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
NoSQL Redis Windows
windows服务器重装系统之后,Redis服务如何恢复?
windows服务器重装系统之后,Redis服务如何恢复?
75 6
|
19天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
28 5
|
1月前
|
存储 SQL NoSQL
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
41 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
3月前
|
NoSQL Linux 测试技术
redis的安装步骤及前台,后台redis服务启动
这篇文章介绍了Redis的安装步骤,包括在Linux系统中下载、传输、解压、编译、安装Redis,以及Redis服务的前台和后台启动方法。
redis的安装步骤及前台,后台redis服务启动
|
3月前
|
NoSQL Linux Redis
Linux Redis 服务设置开机自启动
【9月更文挑战第2天】在 Linux 系统中,可使用两种方法设置 Redis 开机自启动:一是通过创建 `redis.service` 文件并利用 systemd 进行管理,包括定义服务参数和启动脚本;二是编辑 `/etc/rc.local` 文件,在其中添加启动命令。推荐使用 systemd 方法,因为它更符合现代 Linux 系统的设计理念。设置完成后,可通过 `sudo systemctl status redis.service` 检查服务状态。
534 3
|
4月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
|
7月前
|
机器学习/深度学习 NoSQL Redis
Redis高可用之集群架构(第三部分)
Redis高可用之集群架构(第三部分)
|
Kubernetes NoSQL Redis
教你在 Kubernetes 上部署 Redis 高可用集群?
教你在 Kubernetes 上部署 Redis 高可用集群?
280 0