Redis 集群管理

RedisRedisBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在这个实验中,你将学习如何管理 Redis 集群。这个实验侧重于基本的集群管理任务,包括初始化集群、添加节点、检查集群健康状况以及重新分片(resharding)槽(slot)。

我们将首先使用 redis-cli --cluster 命令初始化 Redis 集群,该命令可以自动完成初始配置。然后,你将学习如何使用 CLUSTER MEET 添加新节点。接下来,你将使用 CLUSTER INFO 检查集群的健康状况。最后,你将使用 CLUSTER SETSLOT 在节点之间重新分片槽,以平衡集群。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL redis(("Redis")) -.-> redis/RedisGroup(["Redis"]) redis/RedisGroup -.-> redis/setup_redis("Install Redis") redis/RedisGroup -.-> redis/launch_server("Start Redis Server") redis/RedisGroup -.-> redis/access_cli("Connect Using CLI") subgraph Lab Skills redis/setup_redis -.-> lab-552095{{"Redis 集群管理"}} redis/launch_server -.-> lab-552095{{"Redis 集群管理"}} redis/access_cli -.-> lab-552095{{"Redis 集群管理"}} end

初始化 Redis 集群

在这一步中,你将使用 redis-cli --cluster create 命令初始化 Redis 集群。此命令简化了设置功能性 Redis 集群的过程。

什么是 Redis 集群?

Redis 集群是一种分布式设置,可以自动将数据分配到多个 Redis 节点上。这使你可以水平扩展 Redis 部署,并管理比单个 Redis 实例可以处理的更大的数据集。

为什么使用 redis-cli --cluster create

redis-cli --cluster create 命令提供了一种直接的方式来创建、管理 Redis 集群并与之交互。它可以自动完成初始配置和节点发现,从而简化了集群的创建。

步骤:

  1. 启动 Redis 实例:

    首先,你需要配置并启动多个 Redis 实例。在这个实验中,我们将使用 6 个实例,它们运行在 7000 到 7005 端口上。每个实例都需要配置 cluster-enabled yes

    为此,你可以使用以下命令来创建配置文件并启动 Redis 实例。请注意,这些命令仅用于演示目的。设置脚本已经为你配置并启动了这些实例。

    REDIS_CONF="/etc/redis/redis.conf"
    for port in 7000 7001 7002 7003 7004 7005; do
      CONF_FILE="/etc/redis/redis-${port}.conf"
      sudo cp "$REDIS_CONF" "$CONF_FILE"
      sudo sed -i "s/^port 6379/port ${port}/g" "$CONF_FILE"
      sudo sed -i "s/^#cluster-enabled yes/cluster-enabled yes/g" "$CONF_FILE"
      sudo sed -i "s/^#cluster-config-file nodes.conf/cluster-config-file nodes-${port}.conf/g" "$CONF_FILE"
      sudo sed -i "s/^#cluster-node-timeout 15000/cluster-node-timeout 15000/g" "$CONF_FILE"
      sudo sed -i "s/^#appendonly no/appendonly yes/g" "$CONF_FILE"
      sudo redis-server "$CONF_FILE" &
    done
    sleep 5
  2. 创建集群:

    现在,使用 redis-cli --cluster create 命令来创建集群。此命令需要初始节点的 IP 地址和端口。

    打开你的终端并执行以下命令:

    redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
    • redis-cli --cluster create:启动集群创建过程。
    • 127.0.0.1:7000 127.0.0.1:7001 ... 127.0.0.1:7005:Redis 实例的地址和端口。
    • --cluster-replicas 1:指定每个主节点应具有 1 个副本(replica)。
  3. 确认集群创建:

    redis-cli 工具将要求你确认集群创建。键入 yes 并按 Enter 键。

    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    >>> Master[0] -> Slots 0 - 5460
    >>> Master[1] -> Slots 5461 - 10922
    >>> Master[2] -> Slots 10923 - 16383
    >>> Adding replica node to Master[0]
    >>> Adding replica node to Master[1]
    >>> Adding replica node to Master[2]
    >>> M: 49a4928719291928192819281928192819281928 127.0.0.1:7000
       slots:[0-5460] (5461 slots) master
    >>> M: 9281928192819281928192819281928192819281 127.0.0.1:7001
       slots:[5461-10922] (5462 slots) master
    >>> M: 19281928192819281928192819281928192819281 127.0.0.1:7002
       slots:[10923-16383] (5461 slots) master
    >>> S: 81928192819281928192819281928192819281928 127.0.0.1:7003
       replicates 49a4928719291928192819281928192819281928
    >>> S: 28192819281928192819281928192819281928192 127.0.0.1:7004
       replicates 9281928192819281928192819281928192819281
    >>> S: 928192819281928192819281928192819281928192 127.0.0.1:7005
       replicates 19281928192819281928192819281928192819281
    >>> Can I set the above configuration? (type 'yes' to accept): yes
    >>> Slots 0-5460 assigned to node 49a4928719291928192819281928192819281928
    >>> Slots 5461-10922 assigned to node 9281928192819281928192819281928192819281
    >>> Slots 10923-16383 assigned to node 19281928192819281928192819281928192819281
    >>> Adding replica 81928192819281928192819281928192819281928 to 49a4928719291928192819281928192819281928
    >>> Adding replica 28192819281928192819281928192819281928192 to 9281928192819281928192819281928192819281
    >>> Adding replica 928192819281928192819281928192819281928192 to 19281928192819281928192819281928192819281
    >>> [OK] All nodes agree about the cluster configuration.
    >>> >>> Check cluster info
    >>> >>> Nodes
    >>> M: 49a4928719291928192819281928192819281928 127.0.0.1:7000
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    >>> M: 9281928192819281928192819281928192819281 127.0.0.1:7001
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    >>> M: 19281928192819281928192819281928192819281 127.0.0.1:7002
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    >>> S: 81928192819281928192819281928192819281928 127.0.0.1:7003
       replicates 49a4928719291928192819281928192819281928
    >>> S: 28192819281928192819281928192819281928192 127.0.0.1:7004
       replicates 9281928192819281928192819281928192819281
    >>> S: 928192819281928192819281928192819281928192 127.0.0.1:7005
       replicates 19281928192819281928192819281928192819281
    >>> [OK] All nodes agree about the cluster configuration.
    >>> All 16384 slots covered.

    此输出显示了槽到每个主节点的分配以及副本的分配。

  4. 连接到集群:

    使用 redis-cli 连接到 Redis 集群。这使你可以针对集群执行命令。

    redis-cli -h 127.0.0.1 -p 7000
  5. 退出 redis-cli

    退出 redis-cli 会话以确保该命令已记录。

    exit

你现在已经成功初始化了一个 Redis 集群。在接下来的步骤中,我们将探讨如何添加节点、检查集群健康状况以及重新分片槽。

向集群添加新节点

在这一步中,你将学习如何使用 CLUSTER MEET 命令向现有 Redis 集群添加新节点。此命令对于扩展集群的容量和确保高可用性至关重要。

理解 CLUSTER MEET

CLUSTER MEET 命令将新的 Redis 节点引入集群。当一个节点收到此命令时,它会尝试连接到指定的节点,并启动握手过程以成为集群的一部分。

前提条件:

  • 按照上一步所述初始化的 Redis 集群。
  • 一个新的 Redis 实例正在运行,并且已配置为集群的一部分,但尚未连接。对于这个实验,我们假设你有一个新的实例运行在 7006 端口上。该实例应该使用 cluster-enabled yes 配置选项启动。设置脚本已经为你配置并启动了这个实例。

步骤:

  1. 连接到现有节点:

    使用 redis-cli 连接到集群中的一个现有节点。连接到哪个节点并不重要,因为 CLUSTER MEET 命令会将信息传播到整个集群。

    redis-cli -h 127.0.0.1 -p 7000
  2. 使用 CLUSTER MEET 命令:

    现在你已经连接到集群中的一个节点,使用 CLUSTER MEET 命令来引入新节点(端口 7006)。

    CLUSTER MEET 127.0.0.1 7006
    • CLUSTER MEET:用于添加新节点的命令。
    • 127.0.0.1:新节点的 IP 地址。
    • 7006:新节点的端口号。

    你应该看到以下输出:

    OK

    这表明该命令已成功发送。

  3. 退出 redis-cli

    退出 redis-cli 会话以确保该命令已记录。

    exit

你已成功向 Redis 集群添加了一个新节点。在下一步中,我们将检查集群的健康状况。

检查集群健康状况

在这一步中,你将学习如何使用 CLUSTER INFO 命令检查 Redis 集群的健康状况和状态。此命令提供了对集群整体状态的宝贵见解。

理解 CLUSTER INFO

CLUSTER INFO 命令返回有关 Redis 集群的信息,这些信息可用于监视其健康状况和诊断问题。

前提条件:

  • 按照之前的步骤初始化并添加了新节点的 Redis 集群。

步骤:

  1. 连接到集群节点:

    使用 redis-cli 连接到集群中的任何节点。

    redis-cli -h 127.0.0.1 -p 7000
  2. 执行 CLUSTER INFO 命令:

    使用 CLUSTER INFO 命令检索集群信息。

    CLUSTER INFO

    你应该看到类似于以下内容的输出:

    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:7
    cluster_size:3
    cluster_current_epoch:7
    cluster_my_epoch:7
    ...
  3. 解释输出:

    以下是一些关键指标的细分:

    • cluster_state:ok:集群处于健康状态。
    • cluster_slots_assigned:16384:分配给节点的槽(slot)数。
    • cluster_slots_ok:16384:正常运行的槽数。
    • cluster_slots_pfail:0:处于“可能失败(potentially failing)”状态的槽数。
    • cluster_slots_fail:0:处于“失败(failing)”状态的槽数。
    • cluster_known_nodes:7:当前节点知道的节点总数。
    • cluster_size:3:集群中的主节点数。
  4. 退出 redis-cli

    退出 redis-cli 会话以确保该命令已记录。

    exit

你已使用 CLUSTER INFO 命令成功检查了 Redis 集群的健康状况。

将槽(Slot)重新分片到新节点

在这一步中,你将学习如何使用 redis-cli --cluster reshard 命令在 Redis 集群中重新分片槽。这对于均匀分配数据非常重要,尤其是在添加新节点之后。

理解 Redis 槽和重新分片(Resharding)

Redis 集群将键空间划分为 16384 个槽。每个主节点负责这些槽的子集。当你添加一个新节点时,它最初不拥有任何槽。重新分片将槽从现有节点移动到新节点,从而平衡数据和工作负载。

步骤:

  1. 使用 redis-cli --cluster 连接到集群:

    要执行重新分片操作,你将使用 redis-cli --cluster reshard 命令。此命令提供了一种交互式方式来在集群中重新分配槽。

    打开你的终端并执行以下命令:

    redis-cli --cluster reshard 127.0.0.1:7000

    此命令通过 127.0.0.1:7000 上的节点连接到 Redis 集群,并启动重新分片过程。

  2. 指定要移动的槽数:

    redis-cli 工具将提示你输入要移动的槽数。对于此示例,让我们将 101 个槽移动到新节点。

    How many slots do you want to move? (default: all)

    输入 101 并按 Enter 键。

  3. 输入目标节点 ID:

    接下来,该工具将要求你输入目标节点的节点 ID,即你在上一步中添加的新节点(端口 7006)。要查找节点 ID,你可以使用前面步骤中显示的 CLUSTER NODES 命令,也可以使用以下命令直接获取节点 ID:

    redis-cli -h 127.0.0.1 -p 7006 cluster nodes | grep myself | awk '{print $1}'

    从输出中复制节点 ID。redis-cli 工具将提示你:

    What is the receiving node ID?

    粘贴节点 ID 并按 Enter 键。

  4. 指定源节点:

    该工具将要求你指定从中获取槽的源节点。你可以输入 all 以从所有现有主节点重新分配槽。

    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' to stop entering IDs.

    输入 all 并按 Enter 键。

  5. 确认重新分片计划:

    redis-cli 工具将显示重新分片计划,并要求你确认。

    Do you want to proceed with the reshard plan? (type 'yes' to accept):

    输入 yes 并按 Enter 键以启动重新分片过程。

  6. 等待重新分片完成:

    redis-cli 工具现在会将槽从源节点移动到目标节点。此过程可能需要一些时间,具体取决于集群中的数据量。你将看到在移动槽时的进度消息。

  7. 退出 redis-cli

    重新分片完成后,退出 redis-cli 会话。

    exit

你现在已使用 redis-cli --cluster reshard 命令成功地在 Redis 集群中重新分片了槽。这确保了数据在整个集群中(包括新节点)更加均匀地分布。

总结

在这个实验中,你学习了如何管理 Redis 集群。你首先使用 redis-cli --cluster create 初始化了一个集群,然后使用 CLUSTER MEET 添加了一个新节点。你使用 CLUSTER INFO 检查了集群的健康状况,最后使用 redis-cli --cluster reshard 重新分片了槽,以平衡集群。这些是管理 Redis 集群并确保其可伸缩性和高可用性的基本任务。