Redis 扩容:Redis 集群设置指南

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

扩展Redis:Redis集群搭建指南

当单个Redis实例无法满足数据规模、流量或可用性目标时,Redis集群便派上用场。它通过将键分散到多个主节点,并在主节点故障时提升副本来实现高可用。

本指南将介绍当前使用的redis-cli --cluster工作流程、本地六节点示例,以及集群运行后所需的管理命令。

理解Redis集群概念

Redis集群基于几个实用理念构建:

  • 分片: Redis集群将键空间划分为16384个哈希槽。每个主节点负责一部分槽位,集群感知的客户端会将命令路由到负责该键所在槽位的节点。
  • 复制: 每个主节点可以有一个或多个副本。如果主节点故障且集群仍能达到法定人数,副本可以被提升为主节点。
  • 集群总线: 节点之间通过客户端端口和集群总线端口通信,集群总线端口通常是客户端端口加10000。例如端口7000,总线端口为17000
  • 客户端支持: 你的应用客户端必须支持Redis集群的重定向,如MOVEDASK。非集群感知的客户端在键分布在不同节点时会表现异常。

前提条件

对于生产级集群,建议至少使用六个Redis节点:三个主节点,每个主节点对应一个副本。你可以在单台机器上运行下面的示例进行练习,但生产节点应分布在不同的主机或可用区。

你还需要安装Redis,确保redis-cli可用,并且所有节点之间在Redis客户端端口和集群总线端口上网络互通。尽可能使用当前支持的Redis版本。

逐步搭建Redis集群

本示例使用六个本地Redis进程,端口分别为70007005

1. 安装Redis

在Debian或Ubuntu上,安装包如下:

sudo apt update
sudo apt install redis-server

不同发行版的软件包版本可能不同。如果需要更新的Redis版本,请使用官方Redis软件包或你平台上的托管Redis服务。

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

为每个Redis进程创建一个目录和配置文件:

mkdir cluster
cd cluster

for port in 7000 7001 7002 7003 7004 7005; do
  mkdir "$port"
  cp /etc/redis/redis.conf "$port/redis.conf"
done

编辑每个redis.conf,设置端口相关的值。对于7000/redis.conf,使用:

port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
bind 127.0.0.1

70017005重复相同模式,更改portcluster-config-filenodes-7000.conf文件由Redis管理,请勿手动编辑。

对于远程服务器,绑定到私有网络接口而不是127.0.0.1,并通过防火墙、身份验证和TLS(如果Redis构建或服务支持)来确保访问安全。

3. 启动Redis实例

使用各自的配置启动每个实例:

for port in 7000 7001 7002 7003 7004 7005; do
  redis-server "$port/redis.conf"
done

如果你的包管理器已经在端口6379上运行了默认的Redis服务,请将其与测试集群分开,或在实验期间停止它。

4. 使用redis-cli --cluster创建集群

使用redis-cli --cluster create分配槽位和副本:

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会显示建议的槽位布局并请求确认。如果主节点和副本的放置看起来正确,输入yes

5. 验证集群

从任意节点检查集群:

redis-cli -c -p 7000 CLUSTER INFO
redis-cli -c -p 7000 CLUSTER NODES
redis-cli --cluster check 127.0.0.1:7000

CLUSTER INFO应显示cluster_state:ok-c标志告诉redis-cli遵循集群重定向,这在测试属于其他节点的键的命令时很有用。

尝试基本的写入和读取:

redis-cli -c -p 7000 SET user:1 "Ada"
redis-cli -c -p 7001 GET user:1

即使键属于其他节点服务的槽位,集群感知的客户端也能跟随重定向。

向现有集群添加副本

如果你已有集群并想添加新副本,请启动一个启用了集群模式的新Redis实例。然后找到主节点ID:

redis-cli -p 7000 CLUSTER NODES

将新节点添加为该主节点的副本:

redis-cli --cluster add-node \
  127.0.0.1:7006 127.0.0.1:7000 \
  --cluster-slave \
  --cluster-master-id <master_node_id>

第一个地址是新节点。第二个地址是现有集群中任意可达的节点。将<master_node_id>替换为CLUSTER NODES中的ID。

管理集群

常见的管理任务包括:

  • 检查健康状态: redis-cli --cluster check 127.0.0.1:7000
  • 添加主节点: redis-cli --cluster add-node <new_host:port> <existing_host:port>
  • 重新分片槽位: redis-cli --cluster reshard <existing_host:port>
  • 移除节点: 如果节点是主节点,先将其槽位移走,然后运行 redis-cli --cluster del-node <existing_host:port> <node_id>
  • 手动故障转移测试: 在副本上运行 CLUSTER FAILOVER,而不是在主节点上

除非你完全了解迁移序列,否则避免使用低级命令手动移动槽位。redis-cli --cluster辅助工具减少了槽位处于不一致状态的风险。

Redis集群最佳实践

  • 至少使用六个节点: 三个主节点和三个副本使集群能够容忍一个主节点故障。
  • 跨故障域分布副本: 尽可能避免将主节点及其副本放在同一主机或可用区。
  • 保护Redis安全: 不要将Redis直接暴露给不受信任的网络。使用私有网络、防火墙规则、身份验证和TLS(如果可用)。
  • 规划每个主节点的内存: Redis集群分片键,但每个主节点仍需足够的内存来存储分配的数据、开销和增长。
  • 使用集群感知的客户端: 在切换流量之前,确认你的客户端库支持Redis集群。
  • 监控故障转移和槽位平衡: 跟踪内存、延迟、拒绝连接、复制滞后和集群状态。

总结

对于实用的Redis集群,从至少三个主节点和每个主节点一个副本开始,使用redis-cli --cluster create创建集群,并通过CLUSTER INFOredis-cli --cluster check进行验证。之后,日常工作就是监控内存、槽位平衡、故障转移行为和客户端兼容性。