扩展 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.conf、7001/redis.conf 和 7002/redis.conf,进行以下更改:
port 700X(其中 X 为 0、1 或 2)cluster-enabled yescluster-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:ok。CLUSTER NODES 命令将列出集群中的所有节点、它们的角色以及分配的哈希槽。
提示:使用 redis-cli 时的 -c 标志(redis-cli -c)以启用集群模式。这允许 redis-cli 在需要哈希槽迁移或重定向时自动将命令重定向到正确的节点。
向现有集群添加副本
为了实现高可用性,您应该添加副本。让我们为端口 7000 上的节点(主节点)在端口 7003 上添加一个副本。
- 配置新节点:创建一个新目录(例如
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 - 启动新节点:
redis-server ./7003/redis.conf -
使用
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/NODE和MIGRATE命令在主节点之间手动移动哈希槽。这对于重新平衡集群或准备移除节点非常有用。
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。请记住规划您的集群拓扑结构、监控其健康状况并遵循最佳实践,以确保最佳性能和可靠性。