Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

    • 安装配置
    • Redis 集群部署
    • redis大key分析
    • Redis手动进行主从切换
    • Redis集群添加节点之后数据重新均匀分配
    • Redis槽位slot解读
    • redis新增节点slot迁移报错故障修复
    • Redis集群的创建、剔除节点与新增节点操作过程
    • redis抓包分析脚本
    • Redis配置文件解读
    • redis cluster压测
    • redis慢查询告警脚本
    • Redis 的可用内存过高时的自动驱逐 key 策略详解
  • Keydb

  • TiDB

  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • Redis
Carry の Blog
2022-03-17

Redis槽位slot解读

Redis中的槽位(slot)是Redis Cluster用来实现分布式功能的核心概念。Redis Cluster将数据分片存储在不同的节点上,每个节点存储一部分槽位,节点之间通过Gossip协议进行信息交换,以保证数据的一致性和可用性。

在Redis Cluster中,每个节点负责一部分槽位,槽位的数量固定为16384个,每个槽位对应一个整数编号,从0到16383。例如,节点A负责槽位0到5460,节点B负责槽位5461到10922,以此类推。当客户端发送请求时,Redis Cluster通过槽位号将请求路由到相应的节点。

当一个Redis Cluster节点加入到集群中时,它会接收到所有槽位的信息,并根据槽位的数量平均分配槽位。如果有节点离开集群,它的槽位会被重新分配到其他节点。这种动态分配槽位的方式使得Redis Cluster具有高可用性和可扩展性。

可以使用以下命令在Redis Cluster中查看槽位的分配情况:

cluster slots

1
2

该命令将返回每个节点负责的槽位范围,例如:

1) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6379
      3) "abcdefghijk123456"
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 6380
      3) "abcdefghijk123457"

1
2
3
4
5
6
7
8
9
10
11

这表示第一个节点负责槽位0到5460,第二个节点负责槽位5461到10922。

在使用Redis Cluster时,应该避免使用槽位0到16383中的部分槽位,以便后续扩容时能够有效利用这些槽位。此外,每个键被分配到槽位的算法可以通过修改Redis配置文件中的hash-tag选项进行自定义。默认情况下,该选项设置为{},表示使用键中的整个字符串作为哈希函数的输入。如果将该选项设置为{foo},则表示只使用键中包含{foo}的部分作为哈希函数的输入。这可以帮助开发人员在Redis Cluster中实现特定的数据分布策略。

除了上述基本的槽位信息之外,Redis Cluster还支持一些其他的槽位操作和命令:

  1. 节点手动迁移槽位

    可以使用以下命令将槽位从一个节点迁移到另一个节点:


CLUSTER SETSLOT <slot> IMPORTING <node-id>
CLUSTER SETSLOT <slot> MIGRATING <node-id>


1
2
3
4
5

其中,表示要迁移的槽位编号,表示目标节点的ID。在迁移过程中,槽位处于MIGRATING或IMPORTING状态,直到数据完全迁移到目标节点上。

  1. 获取槽位的分配情况

    可以使用以下命令获取每个槽位的分配情况:


CLUSTER NODES

1
2
3

该命令将返回所有节点的信息,其中包括节点负责的槽位信息。

  1. 手动设置槽位的分配情况

可以使用以下命令手动设置节点负责的槽位信息:

CLUSTER ADDSLOTS <slot> [slot ...]
CLUSTER DELSLOTS <slot> [slot ...]

1
2
3

其中,ADDSLOTS命令将指定的槽位分配给当前节点,DELSLOTS命令将指定的槽位从当前节点中移除。

  1. 槽位迁移的状态

可以使用以下命令查看当前槽位迁移的状态:

CLUSTER GETKEYSINSLOT <slot> <count>

1
2

该命令将返回当前正在迁移的槽位中的键列表和当前迁移的进度。

总的来说,槽位是Redis Cluster实现分布式存储的核心概念,掌握槽位的分配和操作方法可以帮助开发人员更好地使用Redis Cluster来实现高可用和高性能的分布式存储方案。

在 Redis 集群中,槽位是将数据分配到不同节点的一种方式。默认情况下,Redis 集群将所有槽位均匀地分配给集群中的节点。如果您想要预留部分槽位,可以通过以下步骤来实现:

  • 确定要预留的槽位范围。例如,如果您想要预留前 100 个槽位,则槽位范围是 0-99。
  • 在 Redis 集群中选择一个节点,该节点将用于托管预留的槽位。
  • 在所选节点上使用 CLUSTER ADDSLOTS 命令将预留的槽位分配给节点。例如,如果您要将前 100 个槽位分配给节点,则可以使用以下命令:

redis-cli -p <port> cluster addslots {0..99}
1
2

其中 是节点的端口号。

确认节点已成功分配了预留的槽位。您可以使用 CLUSTER NODES 命令查看集群节点的信息,并确保节点已托管预留的槽位。

将其他节点从集群中移除,并将它们重新加入集群,以便重新分配剩余的槽位。

注意,预留槽位可能会导致集群中的负载不平衡。因此,您应该仔细考虑是否需要预留槽位,并根据实际情况进行调整。

上次更新: 4/24/2025

← Redis集群添加节点之后数据重新均匀分配 redis新增节点slot迁移报错故障修复→

最近更新
01
tidb fast ddl
04-04
02
TiDB配置文件调优 原创
04-03
03
如何移除TiDB中的表分区 原创
04-03
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式