Redis 扩容:Redis 集群设置指南
了解如何设置和管理 Redis 集群,以实现高可用性和水平扩展。本分步指南涵盖安装、多个 Redis 节点的配置、使用 redis-trib.rb 创建集群、添加副本以实现容错,以及基本的管理命令。这是扩展您的 Redis 部署的必备读物。
扩展Redis:Redis集群搭建指南
当单个Redis实例无法满足数据规模、流量或可用性目标时,Redis集群便派上用场。它通过将键分散到多个主节点,并在主节点故障时提升副本来实现高可用。
本指南将介绍当前使用的redis-cli --cluster工作流程、本地六节点示例,以及集群运行后所需的管理命令。
理解Redis集群概念
Redis集群基于几个实用理念构建:
- 分片: Redis集群将键空间划分为16384个哈希槽。每个主节点负责一部分槽位,集群感知的客户端会将命令路由到负责该键所在槽位的节点。
- 复制: 每个主节点可以有一个或多个副本。如果主节点故障且集群仍能达到法定人数,副本可以被提升为主节点。
- 集群总线: 节点之间通过客户端端口和集群总线端口通信,集群总线端口通常是客户端端口加10000。例如端口
7000,总线端口为17000。 - 客户端支持: 你的应用客户端必须支持Redis集群的重定向,如
MOVED和ASK。非集群感知的客户端在键分布在不同节点时会表现异常。
前提条件
对于生产级集群,建议至少使用六个Redis节点:三个主节点,每个主节点对应一个副本。你可以在单台机器上运行下面的示例进行练习,但生产节点应分布在不同的主机或可用区。
你还需要安装Redis,确保redis-cli可用,并且所有节点之间在Redis客户端端口和集群总线端口上网络互通。尽可能使用当前支持的Redis版本。
逐步搭建Redis集群
本示例使用六个本地Redis进程,端口分别为7000到7005。
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
对7001到7005重复相同模式,更改port和cluster-config-file。nodes-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 INFO和redis-cli --cluster check进行验证。之后,日常工作就是监控内存、槽位平衡、故障转移行为和客户端兼容性。