集群模式下的分片扩展

Redis 集群架构通过在多个分片之间分布数据来提供水平可扩展性。随着工作负载要求的演变,您可能需要调整分片数量以优化性能、资源利用率和数据分布。本文档概述了分片扩展操作的技术考虑、资源要求和实施指南。

目录

先决条件

在修改 Redis 集群的分片配置之前,请确保满足以下条件:

  • 操作状态:集群必须处于稳定的 运行中 状态,所有节点正常运行。
  • 资源可用性:集群中必须有足够的内存资源,以在扩展过程中容纳数据重新分配。
  • 维护窗口:在流量低的时间段安排扩展操作,以最小化潜在的服务影响。
  • 网络带宽:确认 Redis 节点之间有足够的网络带宽,以支持高效的数据迁移。
  • 基础设施稳定性:确保底层基础设施稳定,以防止在扩展操作过程中节点故障,从而妨碍数据完整性。

资源要求

适当的资源规划对于成功的分片扩展操作至关重要。以下与内存相关的概念重要:

术语定义备注
数据内存Redis 数据集实际占用的内存通过 info memory 命令可观察到;随着 Redis 执行内存优化和垃圾回收,该值会波动
最大数据内存所有 Redis 节点观察到的最高内存消耗用作容量规划的参考点
最大运行内存最大数据内存 ÷ 0.8系数(0.8)表示 maxmemory 和总实例内存分配之间的推荐比率;较低的比率会增加开销宽限,但会降低内存效率
迁移数据内存被退役分片的聚合数据量在缩减扩展操作期间,必须将这些数据重新分配到剩余的分片

扩展操作

当增加分片数量时,每个实例应满足:

实例内存分配 ≥ 最大运行内存

该公式确保在平衡数据分布的场景下成功添加分片。在存在 数据不平衡 或大键(BigKeys)的环境中,需要额外的容量规划,因为数据迁移模式可能会使特定分片的负载集中。

缩减操作

当减少分片数量时,每个剩余实例应满足:

实例内存分配 ≥ (保留分片的最大数据内存 + 迁移数据内存) ÷ 0.8

该公式考虑了来自退役分片的数据重新分配。与扩展操作不同,缩减过程对资源要求 严格,以适应潜在的数据集中情况,即使数据分布不平衡。

步骤

命令行接口
Web 控制台

通过 Redis 自定义资源中的 spec.replicas.cluster.shard 字段控制分片扩展(有关详细的参数规范,请参见 API 文档)。

# 配置集群使用 4 个分片
$ kubectl -n default patch redis c6 --type=merge --patch='{"spec": {"replicas":{"cluster":{"shard": 4}}}}'

要监控扩展操作的进度:

$ kubectl -n default get redis c6 -w

提交分片配置更改后,系统将实例状态切换为 数据均衡,并自动管理槽迁移过程。在此状态下,所有实例修改(除了删除)均受到限制。

扩展期间的客户端连接

在分片重新分配期间,Redis 槽迁移会影响客户端请求处理,具体如下:

  1. 当客户端请求访问正在迁移的槽中的键时:

    • 如果该键已迁移到目标分片,Redis 将返回 MOVED 重定向错误。
    • 如果该键尚未迁移,则将由原始分片处理。
  2. 支持 Redis 集群的客户端可以自动处理这些重定向错误,通过重新发起请求到适当的分片。

性能提醒:在高流量期间进行分片扩展可能会使有效的客户端请求量翻倍,导致网络拥堵。因此,尽可能在活动减少的时间段安排扩展操作。

操作持续时间

完成分片扩展操作所需的时间取决于多个因素:

  • 总数据量的重新分配
  • 节点之间的网络吞吐量
  • 实例资源规格
  • 需要迁移的大键(BigKeys)的存在
  • 持续的工作负载强度

通常,分片扩展操作需要 20 分钟到几个小时才能完成。更大的数据集和更复杂的迁移模式会延长此持续时间。