深入剖析 Redis 的三种集群方式以及实战配置

Redis作为高性能内存数据库,其集群化部署是解决单节点性能瓶颈与实现高可用的关键。本篇将深入剖析三种主流的集群方式:主从复制、哨兵模式(Sentinel)与官方集群(Cluster),并为您提供详细的搭建指南与配置示例。

一、主从复制 (Master-Slave Replication)

主从复制是最基础的集群模式,通过一个主节点(Master)和一个或多个从节点(Slave)实现读写分离。主节点负责处理写操作,从节点负责处理读操作,并实时从主节点同步数据。

1. 核心原理

  • 数据同步:从节点启动后,向主节点发送 `SYNC` 命令。主节点执行 `bgsave` 生成RDB快照并发送给从节点,同时将快照期间的写命令记录到复制积压缓冲区。从节点加载RDB并执行缓冲区中的命令,完成初始化同步。
  • 增量同步:初始化后,主节点每次执行的写命令都会同步发送给从节点,实现增量同步。

2. 搭建步骤与配置

以下以单机伪集群为例,在一台服务器上启动3个Redis实例(1个主节点,2个从节点)。

主节点配置 (redis-master.conf):

bash 复制代码
# 端口
port 6379
# 后台运行
daemonize yes
# PID文件
pidfile /var/run/redis_6379.pid
# 日志文件
logfile "/usr/local/redis-cluster/logs/redis_6379.log"
# 工作目录
dir /usr/local/redis-cluster/data
# 持久化
dbfilename dump-6379.rdb
# 开启AOF
appendonly yes
appendfilename "appendonly-6379.aof"

从节点1配置 (redis-slave1.conf):

bash 复制代码
# 端口
port 6380
# 后台运行
daemonize yes
# PID文件
pidfile /var/run/redis_6380.pid
# 日志文件
logfile "/usr/local/redis-cluster/logs/redis_6380.log"
# 工作目录
dir /usr/local/redis-cluster/data
# 持久化
dbfilename dump-6380.rdb
# 开启AOF
appendonly yes
appendfilename "appendonly-6380.aof"
# 指定主节点
replicaof 127.0.0.1 6379
# 主节点密码(如果设置了)
masterauth 123456

从节点2配置 (redis-slave2.conf):

bash 复制代码
# 端口
port 6381
# 后台运行
daemonize yes
# PID文件
pidfile /var/run/redis_6381.pid
# 日志文件
logfile "/usr/local/redis-cluster/logs/redis_6381.log"
# 工作目录
dir /usr/local/redis-cluster/data
# 持久化
dbfilename dump-6381.rdb
# 开启AOF
appendonly yes
appendfilename "appendonly-6381.aof"
# 指定主节点
replicaof 127.0.0.1 6379
# 主节点密码(如果设置了)
masterauth 123456

3. 启动服务

bash 复制代码
redis-server /usr/local/redis-cluster/conf/redis-master.conf
redis-server /usr/local/redis-cluster/conf/redis-slave1.conf
redis-server /usr/local/redis-cluster/conf/redis-slave2.conf

4. 验证主从关系

bash 复制代码
# 连接主节点
redis-cli -p 6379
127.0.0.1:6379> info replication
# 连接从节点
redis-cli -p 6380
127.0.0.1:6380> info replication

5. 全量复制与增量复制对比

二、哨兵模式 (Sentinel)

哨兵模式在主从复制的基础上增加了高可用(HA)能力。通过多个哨兵进程监控主从节点,当主节点故障时,哨兵会自动选举一个从节点升级为新的主节点,并通知其他从节点切换主节点,实现故障转移。

1. 核心原理

  • 监控:哨兵进程持续监控主节点和从节点的健康状态。
  • 通知:当某个节点(主或从)出现故障时,哨兵会向系统管理员发送通知。
  • 故障转移:当主节点故障时,哨兵会选举一个从节点成为新的主节点,并让其他从节点指向新的主节点。

2. 搭建步骤与配置

同样以单机伪集群为例,部署1个主节点、2个从节点和3个哨兵节点。

主节点配置 (redis-master.conf):

bash 复制代码
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/usr/local/redis-cluster/logs/redis_6379.log"
dir /usr/local/redis-cluster/data
dbfilename dump-6379.rdb
appendonly yes
appendfilename "appendonly-6379.aof"
# 设置密码(可选)
requirepass 123456

从节点1配置 (redis-slave1.conf):

bash 复制代码
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/usr/local/redis-cluster/logs/redis_6380.log"
dir /usr/local/redis-cluster/data
dbfilename dump-6380.rdb
appendonly yes
appendfilename "appendonly-6380.aof"
# 指向主节点
replicaof 127.0.0.1 6379
# 如果主节点有密码
masterauth 123456

哨兵1配置 (sentinel1.conf):

bash 复制代码
port 26379
daemonize yes
pidfile /var/run/redis-sentinel_26379.pid
logfile "/usr/local/redis-cluster/logs/sentinel_26379.log"
dir /usr/local/redis-cluster/data
# 监控主节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 密码(如果主节点有)
sentinel auth-pass mymaster 123456
# 故障转移超时时间
sentinel down-after-milliseconds mymaster 5000
# 故障转移后最多保留的失败次数
sentinel failover-timeout mymaster 10000
# 故障转移时最多同时迁移的key数量
sentinel parallel-syncs mymaster 1

哨兵2配置 (sentinel2.conf):

bash 复制代码
port 26380
daemonize yes
pidfile /var/run/redis-sentinel_26380.pid
logfile "/usr/local/redis-cluster/logs/sentinel_26380.log"
dir /usr/local/redis-cluster/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

哨兵3配置 (sentinel3.conf):

bash 复制代码
port 26381
daemonize yes
pidfile /var/run/redis-sentinel_26381.pid
logfile "/usr/local/redis-cluster/logs/sentinel_26381.log"
dir /usr/local/redis-cluster/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

3. 启动服务

bash 复制代码
# 启动Redis节点
redis-server /usr/local/redis-cluster/conf/redis-master.conf
redis-server /usr/local/redis-cluster/conf/redis-slave1.conf
redis-server /usr/local/redis-cluster/conf/redis-slave2.conf

# 启动哨兵
redis-sentinel /usr/local/redis-cluster/conf/sentinel1.conf
redis-sentinel /usr/local/redis-cluster/conf/sentinel2.conf
redis-sentinel /usr/local/redis-cluster/conf/sentinel3.conf
            

4. 测试故障转移

bash 复制代码
# 连接哨兵查看主节点
redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
# 关闭主节点
redis-cli -p 6379 shutdown
# 等待哨兵选举后,再次查看
127.0.0.1:26379> sentinel master mymaster

三、官方集群 (Redis Cluster)

Redis Cluster是官方提供的分布式解决方案,通过数据分片(Sharding)解决单节点内存限制问题,并内置高可用能力。它不需要中间件,节点间直接通信。

1. 核心原理

  • 数据分片:Redis Cluster将16384个哈希槽(Hash Slot)分布在多个主节点上。
  • 哈希槽分配:每个键通过CRC16算法计算后对16384取模,决定其所在的哈希槽。
  • 高可用:每个主节点都绑定一个或多个从节点。当主节点故障时,从节点会升级为新的主节点。

2. 搭建步骤与配置

以单机伪集群为例,部署3个主节点和3个从节点。

主节点1配置 (redis-7000.conf):

bash 复制代码
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile "/usr/local/redis-cluster/logs/redis_7000.log"
dir /usr/local/redis-cluster/data
dbfilename dump-7000.rdb
appendonly yes
appendfilename "appendonly-7000.aof"
# 开启集群模式
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
# 关闭集群完整性检查(单机测试)
cluster-require-full-coverage no

从节点1配置 (redis-7003.conf):

bash 复制代码
port 7003
daemonize yes
pidfile /var/run/redis_7003.pid
logfile "/usr/local/redis-cluster/logs/redis_7003.log"
dir /usr/local/redis-cluster/data
dbfilename dump-7003.rdb
appendonly yes
appendfilename "appendonly-7003.aof"
# 开启集群模式
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
# 指定主节点
replicaof 127.0.0.1 7000

依次创建 `redis-7001.conf`, `redis-7002.conf`, `redis-7004.conf`, `redis-7005.conf`, `redis-7006.conf`,并修改端口号。

3. 启动服务

bash 复制代码
redis-server /usr/local/redis-cluster/conf/redis-7000.conf
redis-server /usr/local/redis-cluster/conf/redis-7001.conf
redis-server /usr/local/redis-cluster/conf/redis-7002.conf
redis-server /usr/local/redis-cluster/conf/redis-7003.conf
redis-server /usr/local/redis-cluster/conf/redis-7004.conf
redis-server /usr/local/redis-cluster/conf/redis-7005.conf
redis-server /usr/local/redis-cluster/conf/redis-7006.conf

4. 创建集群

bash 复制代码
# 进入Redis源码目录
cd /path/to/redis-5.0.5/src
# 使用官方工具创建集群
./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

执行命令后,会提示输入 `yes` 来确认分配哈希槽和创建集群。

5. 连接集群

bash 复制代码
# 使用 -c 参数连接集群
redis-cli -c -p 7000
# 设置key
127.0.0.1:7000> set name "redis-cluster"
# 读取key(可能重定向到其他节点)
127.0.0.1:7000> get name
-> Redirected to slot [12182] located at 127.0.0.1:7002
"redis-cluster"
127.0.0.1:7002>

四、总结与对比

特性 主从复制 哨兵模式 官方集群
读写分离
数据分片
高可用 ✅ (自动故障转移) ✅ (内置)
部署复杂度
适用场景 读多写少、简单扩展 需要高可用、读写分离 大数据量、高并发
相关推荐
0xDevNull2 小时前
RabbitMQ 完整技术指南
分布式·rabbitmq
q5431470872 小时前
Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
数据库·redis·缓存
姓蔡小朋友3 小时前
RabbitMQ
分布式·rabbitmq
南梦浅3 小时前
网站redis从开发到部署方案
java·jvm·redis
深蓝轨迹3 小时前
Redis 分布式锁实现流程
数据库·redis·分布式
zjeweler3 小时前
redis_tools_gui_v1.2 —Redis图形化漏洞利用工具
数据库·redis·web安全·缓存·安全性测试
摇滚侠3 小时前
Spring Data Redis 主从集群 哨兵集群 分片集群 yml 配置
redis·python·spring
凸头3 小时前
后过滤召回塌陷:Redis 先召回 → ES 再过滤,如果全部被过滤掉怎么办?
数据库·redis·elasticsearch