Redis 高可用架构全解析:主从复制、哨兵与集群模式
文章目录
- 前言
- 一、Redis 三种模式概述
- 二、Redis 主从复制
- 2.1 什么是主从复制?
- 2.2 主从复制的作用
- 2.3 主从复制流程
- 2.4 搭建主从复制(示例)
- 三、Redis 哨兵模式
- 3.1 哨兵模式概述
- 3.2 哨兵的作用
- 3.3 故障转移机制
- 3.4 搭建哨兵模式(示例)
- 四、Redis 集群模式
- 4.1 集群模式概述
- 4.2 集群的作用
- 4.3 数据分片与哈希槽
- 4.4 搭建集群模式(示例)
- 五、总结
前言
Redis 作为高性能的键值数据库,广泛应用于缓存、会话存储、消息队列等场景。随着业务规模的扩大,单机 Redis 在性能、可用性和数据安全性方面逐渐成为瓶颈。为此,Redis 提供了多种集群化方案来实现高可用与分布式存储。本文将系统介绍 Redis 的三种核心架构模式:主从复制、哨兵模式和集群模式,深入解析其原理、优缺点及搭建方法,帮助开发者根据实际业务需求选择合适的架构。
一、Redis 三种模式概述
Redis 支持三种主要的集群模式,分别适用于不同场景:
- 主从复制:实现数据的多机备份和读写分离,是高可用的基础。
- 哨兵模式:在主从复制基础上引入自动故障转移,提高系统的可用性。
- 集群模式:通过数据分片和分布式存储,解决写负载均衡和存储扩展问题。
这三种模式层层递进,共同构建了 Redis 的高可用生态系统。
二、Redis 主从复制
2.1 什么是主从复制?
主从复制是指将一台 Redis 服务器(主节点)的数据复制到其他 Redis 服务器(从节点)。数据复制是单向的,只能由主节点流向从节点。
2.2 主从复制的作用
- 数据冗余:实现数据热备份,提高数据安全性。
- 故障恢复:主节点故障时,可从节点快速接管服务。
- 负载均衡:实现读写分离,提升读并发能力。
- 高可用基石:是哨兵和集群模式的基础。
2.3 主从复制流程
- 从节点向主节点发送
SYNC
命令请求同步。 - 主节点执行
BGSAVE
生成 RDB 快照,并缓存期间的写命令。 - 主节点将 RDB 文件和缓存的命令发送给从节点。
- 从节点加载数据至内存,完成同步。
2.4 搭建主从复制(示例)
# Master 配置
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0
daemonize yes #137行,开启守护进程
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
appendonly yes #700行,开启AOF持久化功能# Slave 配置
replicaof 192.168.172.150 6379 #288行,指定要同步的Master节点IP和端口
配置完成重启:
/etc/init.d/redis_6379 restart
验证命令:
redis-cli info replication
三、Redis 哨兵模式
3.1 哨兵模式概述
哨兵模式用于监控主从节点,并在主节点故障时自动进行故障转移,实现高可用。
3.2 哨兵的作用
- 监控:定期检查节点状态。
- 自动故障转移:主节点宕机时,选举新主节点。
- 通知:将故障转移结果通知客户端。
3.3 故障转移机制
- 哨兵通过心跳检测判断主节点是否下线。
- 超过半数哨兵认为主节点下线,则触发客观下线。
- 通过 Raft 算法选举 Leader 哨节点执行故障转移。
- 将最优从节点提升为主节点,并通知其他从节点切换。
3.4 搭建哨兵模式(示例)
# sentinel.conf
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no #17行,关闭保护模式
port 26379 #21行,Redis哨兵默认的监听端口
daemonize yes #26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log" #36行,指定日志存放路径
dir "/var/lib/redis/6379" #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.172.150 6379 2 #84行,修改 指定该哨兵节点监控192.168.172.150:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000(180秒)
启动命令:
redis-sentinel sentinel.conf &
查看哨兵信息:
redis-cli -p 26379 info Sentinel
四、Redis 集群模式
4.1 集群模式概述
Redis Cluster 通过数据分片(sharding)实现分布式存储,支持横向扩展和高可用。
4.2 集群的作用
- 数据分区:将数据分散到多个节点,突破单机内存限制。
- 高可用:支持主从复制和自动故障转移。
4.3 数据分片与哈希槽
Redis 集群使用 16384 个哈希槽,每个键通过 CRC16 取模决定所属槽位。节点负责一部分槽位,实现数据分布。
4.4 搭建集群模式(示例)
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
#复制6个节点文件
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done# 配置示例(以6001端口为例)
vim redis.conf
#bind 127.0.0.1 #69行,注释掉bind 项,默认监听所有网卡
protected-mode no #88行,修改,关闭保护模式
port 6001 #92行,修改,redis监听端口,
daemonize yes #136行,开启守护进程,以独立进程启动
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000 #846行,取消注释群集超时时间设置
appendonly yes #700行,修改,开启AOF持久化
#启动redis节点
分别进入那六个文件夹,执行命令:redis-server redis.conf ,来启动redis节点
# 启动集群
redis-cli --cluster create \127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 \127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 \--cluster-replicas 1
测试命令:
redis-cli -p 6001 -c
cluster slots
五、总结
模式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
主从复制 | 简单易用,读写分离 | 无法自动故障转移,写负载集中 | 读多写少,容灾备份 |
哨兵模式 | 自动故障转移,高可用 | 写负载集中,存储受单机限制 | 对可用性要求较高的场景 |
集群模式 | 数据分片,写负载均衡,横向扩展 | 部署复杂,客户端需支持集群协议 | 大数据量、高并发场景 |
在实际项目中,应根据业务需求选择合适的架构。若只需读写分离和备份,主从复制即可;若需自动故障转移,可选择哨兵模式;若数据量大且需横向扩展,则应使用集群模式。
Redis 的高可用架构为我们提供了灵活而强大的解决方案,合理运用这些模式,可以有效提升系统的稳定性、可用性和扩展性。