redis作为高性能内存数据库,其集群化部署是解决单节点性能瓶颈与实现高可用的关键。本篇将深入剖析三种主流的集群方式:主从复制、哨兵模式(sentinel)与官方集群(cluster),并为您提供详细的搭建指南与配置示例。
一、主从复制 (master-slave replication)
主从复制是最基础的集群模式,通过一个主节点(master)和一个或多个从节点(slave)实现读写分离。主节点负责处理写操作,从节点负责处理读操作,并实时从主节点同步数据。
1. 核心原理
- 数据同步 :从节点启动后,向主节点发送 `sync` 命令。主节点执行 `bgsave` 生成rdb快照并发送给从节点,同时将快照期间的写命令记录到复制积压缓冲区。从节点加载rdb并执行缓冲区中的命令,完成初始化同步。
- 增量同步 :初始化后,主节点每次执行的写命令都会同步发送给从节点,实现增量同步。
2. 搭建步骤与配置
以下以单机伪集群为例,在一台服务器上启动3个redis实例(1个主节点,2个从节点)。
主节点配置 (redis-master.conf):
# 端口 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):
# 端口 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):
# 端口 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. 启动服务
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. 验证主从关系
# 连接主节点 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):
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):
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):
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):
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):
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. 启动服务
# 启动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. 测试故障转移
# 连接哨兵查看主节点 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):
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):
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. 启动服务
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. 创建集群
# 进入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. 连接集群
# 使用 -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>
四、总结与对比
| 特性 | 主从复制 | 哨兵模式 | 官方集群 |
|---|---|---|---|
| 读写分离 | ✅ | ✅ | ✅ |
| 数据分片 | ❌ | ❌ | ✅ |
| 高可用 | ❌ | ✅ (自动故障转移) | ✅ (内置) |
| 部署复杂度 | 低 | 中 | 高 |
| 适用场景 | 读多写少、简单扩展 | 需要高可用、读写分离 | 大数据量、高并发 |
到此这篇关于深入剖析 redis 的三种集群方式以及实战配置的文章就介绍到这了,更多相关redis 三种集群内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论