一、Redis 主从复制 (Replication)
主从复制是 Redis 提供的一种高可用性和数据冗余的机制。一个主节点 (master) 可以拥有多个从节点 (slave)。主节点负责处理写操作,并将写操作的数据变更异步地传播给所有从节点。从节点默认是只读的,用于处理读请求或作为故障转移的备胎。
主从设置步骤
-
准备节点:
- 启动多个 Redis 服务器实例(可以是在同一台机器的不同端口,也可以是不同机器)。假设我们有三个实例:
- 主节点:
127.0.0.1:6379 - 从节点1:
127.0.0.1:6380 - 从节点2:
127.0.0.1:6381
- 主节点:
- 启动多个 Redis 服务器实例(可以是在同一台机器的不同端口,也可以是不同机器)。假设我们有三个实例:
-
配置主节点 (可选):
-
主节点通常不需要特殊配置即可作为主节点启动。但为了安全或持久化,你可能需要配置
requirepass(主节点密码) 和daemonize(后台运行) 等选项。主节点配置文件 (redis-6379.conf) 示例片段:iniport 6379 daemonize yes requirepass your_master_password # 如果设置了密码,从节点连接时需要 -
启动主节点:
bashredis-server /path/to/redis-6379.conf
-
-
配置从节点:
-
这是关键步骤。在每个从节点的配置文件中,需要指定它要复制的主节点信息。从节点配置文件 (
redis-6380.conf/redis-6381.conf) 示例片段:iniport 6380 # 或 6381 daemonize yes slaveof 127.0.0.1 6379 # 指向主节点的 IP 和端口 masterauth your_master_password # 如果主节点设置了 requirepass,这里需要填写相同的密码 -
启动从节点:
bashredis-server /path/to/redis-6380.conf redis-server /path/to/redis-6381.conf
-
-
验证主从状态:
-
连接到任意节点(主或从),使用
INFO replication命令查看复制状态。 -
在主节点执行:
bashredis-cli -h 127.0.0.1 -p 6379 -a your_master_password > INFO replication输出中应看到
role:master和connected_slaves:2(或其他实际数字),以及从节点的连接信息。 -
在从节点执行:
bashredis-cli -h 127.0.0.1 -p 6380 > INFO replication输出中应看到
role:slave,master_host:127.0.0.1,master_port:6379,master_link_status:up(表示连接正常),以及slave_repl_offset(复制偏移量)。
-
关键点:
- 主节点写,从节点读。
- 复制是异步的,存在短暂的数据不一致窗口期。
- 从节点可以级联 (slave of slave)。
- 故障转移需要手动干预或借助 Redis Sentinel / Redis Cluster 等方案。
二、Redis 集群 (Cluster)
Redis Cluster 是 Redis 官方提供的分布式方案,用于解决单机 Redis 在内存容量、并发处理能力和故障恢复方面的瓶颈。它将数据分片存储在多个节点上,并提供自动的故障转移。
核心概念
- 分片 (Sharding) :数据被自动分片到多个主节点上存储。默认将整个数据集划分为 16384 个哈希槽 (
hash slot)。 - 主节点 (Master Node):负责存储一部分哈希槽的数据和处理读写请求。
- 从节点 (Slave Node):作为主节点的副本,在主节点故障时通过选举成为新的主节点。
- 集群总线 (Cluster Bus):节点间通过 TCP 端口 (默认主端口 + 10000) 进行通信(如Gossip协议、故障检测、配置更新)。
集群搭建步骤 (以三主三从为例)
-
准备节点:
-
启动六个 Redis 服务器实例。每个节点都需要一个配置文件。
-
每个节点的配置文件 (
redis-7000.conf到redis-7005.conf) 需要启用集群模式并设置节点端口。示例片段 (redis-7000.conf):iniport 7000 daemonize yes cluster-enabled yes # 启用集群模式 cluster-config-file nodes-7000.conf # 节点自动生成的集群配置文件 cluster-node-timeout 5000 appendonly yes # 建议开启持久化 -
启动所有六个节点:
bashredis-server /path/to/redis-7000.conf redis-server /path/to/redis-7001.conf ... # 启动 redis-7002.conf, redis-7003.conf, redis-7004.conf, redis-7005.conf
-
-
创建集群:
-
使用
redis-cli提供的集群管理命令--cluster create来初始化集群。你需要指定所有节点的地址,并告诉工具哪些节点是主节点,哪些是它的从节点(通常按顺序排列,前三个是主,后三个分别对应前三个主)。 -
命令格式:
bashredis-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--cluster create:创建集群。127.0.0.1:7000 ...:列出所有节点地址。--cluster-replicas 1:指定每个主节点分配 1 个从节点。工具会自动将前N个节点视为主节点,后N * replicas个节点作为它们的从节点。这里 N=3。
-
执行命令后,工具会显示它计划分配的槽位分布(每个主节点分配约 5461 个槽)。确认无误后输入
yes。
-
-
验证集群状态:
-
连接到任意节点:
bashredis-cli -c -p 7000 # -c 表示以集群模式连接 > CLUSTER INFO # 查看集群整体状态,应为 "cluster_state:ok" > CLUSTER NODES # 查看所有节点信息,包括角色 (master/slave)、负责的槽位范围、连接状态等 -
测试读写:尝试写入一个 key。集群模式下的客户端会自动重定向到正确的节点。
bash> SET mykey "hello world" -> Redirected to slot [14687] located at 127.0.0.1:7002 OK > GET mykey -> Redirected to slot [14687] located at 127.0.0.1:7002 "hello world"
-
关键点:
- 最小配置要求:至少 3 个主节点才能形成集群(因为故障转移需要多数投票)。
- 数据分片:客户端需要理解集群协议(如
redis-cli -c或支持集群的客户端库),否则操作会因MOVED错误而失败。 - 自动故障转移:当主节点故障且被大多数主节点判定为下线时,其对应的从节点会发起选举成为新主节点。
- 节点发现:新节点加入集群或节点间通信通过集群总线和 Gossip 协议自动完成。
- 槽位迁移:支持运行时动态添加/删除节点和重新分片 (
redis-cli --cluster reshard)。
注意事项:
- 版本:确保所有节点使用相同的主要 Redis 版本。
- 网络:集群节点间需要双向网络通信(客户端端口和集群总线端口)。
- 工具 :
redis-cli --cluster help查看所有集群管理命令(添加节点、删除节点、修复、重新分片等)。 - 生产环境 :强烈建议将节点部署在不同物理机或虚拟机,避免单点故障。配置合理的
cluster-node-timeout。
通过以上步骤,你应该能够成功配置 Redis 主从复制和 Redis Cluster。主从复制提供数据备份和读写分离,而 Redis Cluster 则提供了高可用、高并发、大容量的分布式解决方案。