Redis 扩容:Redis 集群设置指南

了解如何设置和管理 Redis 集群,以实现高可用性和水平扩展。本分步指南涵盖安装、多个 Redis 节点的配置、使用 redis-trib.rb 创建集群、添加副本以实现容错,以及基本的管理命令。这是扩展您的 Redis 部署的必备读物。

86 浏览量

扩展 Redis:设置 Redis 集群指南

Redis 是一种强大的内存数据结构存储,被广泛用作数据库、缓存和消息代理。虽然单个 Redis 实例可以处理大量负载,但许多应用程序最终需要更高的可用性和横向扩展能力,以适应不断增长的数据量和流量。Redis Cluster 提供了一个原生解决方案来实现这两个目标。

本指南将引导您完成 Redis 集群的设置、配置和管理过程。我们将介绍基本概念,提供安装和配置的分步说明,并讨论必要的管理任务,以确保您的集群保持稳健和高性能。

了解 Redis 集群概念

在深入设置之前,理解支撑 Redis Cluster 的核心概念至关重要:

  • 分片 (Sharding / Partitioning):Redis Cluster 将您的数据集分散到多个 Redis 节点上。每个节点负责哈希槽的子集(总共 16384 个)。当客户端需要访问一个键时,客户端库会计算该键属于哪个哈希槽,并将请求定向到相应的节点。
  • 复制 (Replication):为了实现高可用性,集群中的每个主节点可以有一个或多个副本节点。如果主节点发生故障,其副本之一可以被提升以取代其位置,从而最大限度地减少停机时间。
  • Gossip 协议 (Gossip Protocol):Redis Cluster 节点使用 Gossip 协议相互通信。这使得节点可以相互发现、交换有关其状态的信息并检测故障。
  • 共识 (Consensus):当主节点失败时,集群需要在其余主节点之间达成共识,从其副本中选举出新的主节点。此过程确保了集群保持运行状态。

先决条件

要设置 Redis Cluster,您需要:

  • 多台服务器或虚拟机(建议至少 6 个节点用于生产环境设置:3 个主节点和 3 个副本节点)。
  • 在每台服务器上安装 Redis。确保您使用的是 Redis 3.0 或更高版本。
  • 所有节点之间具有网络连接。节点需要在其客户端端口和集群总线端口(客户端端口 + 10000)上能够相互通信。
  • redis-cli(Redis 命令行界面),其中包括用于集群创建的 redis-trib.rb 脚本。

设置 Redis Cluster:分步指南

本节提供了创建基本 Redis Cluster 的实用分步指南。为简单起见,我们假设您在单台机器上使用不同的端口为每个节点设置集群。在生产环境中,您通常会将这些节点分布在不同的物理或虚拟机上。

1. 安装 Redis

如果尚未安装 Redis,请按照您操作系统的官方 Redis 安装指南进行操作。例如,在 Debian/Ubuntu 上:

sudo apt update
sudo apt install redis-server

2. 配置 Redis 实例以启用集群模式

对于集群中的每个节点,您需要一个单独的 Redis 配置文件。为每个节点创建目录并复制默认的 redis.conf 文件。

假设我们正在设置一个 3 节点主集群,初始设置不带副本。我们将使用端口 7000、7001 和 7002。

# 为每个节点创建目录
mkdir cluster
cd cluster
mkdir 7000 7001 7002

# 将 redis.conf 复制到每个目录
cp /etc/redis/redis.conf ./7000/
cp /etc/redis/redis.conf ./7001/
cp /etc/redis/redis.conf ./7002/

现在,编辑每个节点的配置文件。对于 7000/redis.conf7001/redis.conf7002/redis.conf,进行以下更改:

  • port 700X(其中 X 为 0、1 或 2)
  • cluster-enabled yes
  • cluster-config-file nodes-700X.conf(此文件由 Redis 自身管理,不应手动编辑。它存储集群状态。)
  • cluster-node-timeout 5000(建议的毫秒级超时时间,超过此时间节点被视为失败。)
  • appendonly yes(建议用于数据持久性,尤其是在生产环境中)

7000/redis.conf 示例:

port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
# 确保 bind 设置为 0.0.0.0 或在远程机器上运行时设置为正确的 IP
bind 0.0.0.0

7001/redis.conf(端口 7001)和 7002/redis.conf(端口 7002)重复这些更改。

3. 启动 Redis 实例

使用其特定的配置文件启动每个 Redis 实例:

redis-server ./7000/redis.conf
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf

如果您将 Redis 作为服务运行,您可能需要停止默认实例(sudo systemctl stop redis-server),并如上所示手动启动它们,或者配置多个服务文件。

4. 使用 redis-trib.rb 创建集群

redis-trib.rb 脚本是一个 Ruby gem,有助于自动化 Redis Cluster 的创建。它包含在 Redis 发行版中。

导航到 redis-trib.rb 所在的目录(通常在 /usr/share/redis/ 中,或者您可能需要在 Redis 安装目录中找到它)。如果未安装 Ruby,您可能需要安装它(sudo apt install ruby-full)。

运行脚本以创建具有 3 个主节点的集群:

# 确保您在集群目录中或提供完整路径
# ruby /path/to/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

# 或者如果 redis-trib.rb 在您的 PATH 中
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

此命令:
* create:告诉 redis-trib.rb 创建一个新集群。
* --replicas 0:指定我们希望每个主节点有 0 个副本。对于生产设置,您将使用 --replicas 1(或更多)。
* 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002:列出将参与集群的节点。

该脚本将要求确认。输入 yes 以继续。然后它将为每个主节点分配哈希槽并配置集群。

5. 验证集群

redis-trib.rb 完成后,您可以连接到任何节点并检查集群状态:

redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES

CLUSTER INFO 命令应显示 cluster_state:okCLUSTER NODES 命令将列出集群中的所有节点、它们的角色以及分配的哈希槽。

提示:使用 redis-cli 时的 -c 标志(redis-cli -c)以启用集群模式。这允许 redis-cli 在需要哈希槽迁移或重定向时自动将命令重定向到正确的节点。

向现有集群添加副本

为了实现高可用性,您应该添加副本。让我们为端口 7000 上的节点(主节点)在端口 7003 上添加一个副本。

  1. 配置新节点:创建一个新目录(例如 cluster/7003),复制 redis.conf,并为端口 7003 更新它,启用集群模式并设置 cluster-config-file
    ini port 7003 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0
  2. 启动新节点redis-server ./7003/redis.conf
  3. 使用 redis-trib.rb 添加副本:使用 redis-cli -c -p 7000 连接到现有集群,并使用 CLUSTER REPLICATE 命令,或再次使用 redis-trib.rb。对于初始设置,使用 redis-trib.rb 通常更简单。

    ```bash

    使用 redis-trib.rb 为节点 7000 添加副本的示例

    您需要复制的主节点 ID。

    首先,获取节点 ID:redis-cli -p 7000 CLUSTER NODES

    假设主节点 ID 是 'your_master_node_id'

    redis-trib.rb --cluster-add-node 127.0.0.1:7003 --cluster-slave --cluster-master-id 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
    `` *注意*:用于添加节点的redis-trib.rb命令可能有些复杂。添加副本的一个更简单方法是首先启动新的副本实例,然后通过redis-cli连接到主节点并发出CLUSTER REPLICATE ` 命令。

    或者,您可以使用 redis-trib.rb 重新配置具有副本的现有集群:

    ```bash

    为现有 3 主节点集群添加副本的示例

    redis-trib.rb replace-node-master --replicas 1 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
    ```
    此命令涉及更多步骤,并假设您已将附加节点(7003、7004、7005)配置为副本。

6. 管理集群

  • 添加/移除节点:您可以添加新的主节点和副本以扩展集群。可以使用 redis-trib.rb 或手动命令。移除节点涉及首先将哈希槽从该节点迁移出去。
  • 故障转移 (Failover):Redis Cluster 会自动处理故障转移。如果主节点变得不可达,其副本将尝试被提升。您可以使用 CLUSTER FAILOVER(在副本上)或通过停止节点来模拟故障。
  • 移动哈希槽 (Moving Slots):您可以使用 CLUSTER SETSLOT <slot> IMPORTING/NODEMIGRATE 命令在主节点之间手动移动哈希槽。这对于重新平衡集群或准备移除节点非常有用。

Redis Cluster 最佳实践

  • 至少使用 6 个节点:一个生产就绪的集群应至少有 3 个主节点和 3 个副本(每个主节点一个副本),以实现容错能力。
  • 跨可用区分布节点:对于云部署,将节点放置在不同的可用区中,以防止区域级故障。
  • 监控您的集群:使用 Redis 的监控工具和外部监控系统来跟踪性能、内存使用情况和节点健康状况。
  • 配置 protected-mode no:如果在网络上运行 Redis Cluster,请确保在 redis.conf 中设置了 protected-mode no,并使用防火墙限制访问。
  • 使用 appendonly yes:为了数据持久性,确保启用了 AOF(Append-Only File)持久化。
  • 客户端库支持:确保您的 Redis 客户端库支持 Redis Cluster 并正确处理重定向。

结论

设置 Redis Cluster 是对要求高可用性和横向扩展的应用程序至关重要的一步。通过理解分片、复制和集群通信的核心概念,您可以成功部署和管理一个稳健的 Redis Cluster。请记住规划您的集群拓扑结构、监控其健康状况并遵循最佳实践,以确保最佳性能和可靠性。