redis 部署模式详解
redis 支持多种部署模式,主要包括单机模式(single)、哨兵模式(sentinel)、集群模式(cluster)及增强代理集群,分别适用于不同场景,以下是它们的详细介绍。以下说明仅适用于 redis 7.0+。
一、单机模式(single)
1. 简介
(1)最简单的部署方式,仅运行单个 redis 实例。
(2)无高可用性,如果实例崩溃,服务不可用。
(3)适用场景:开发环境。
2. 配置方法
(1)修改 redis.conf
# 绑定 ip(默认仅本地访问) bind 0.0.0.0 # 允许远程访问 # 设置密码(可选) requirepass yourpassword # 持久化配置(默认启用 rdb) save 900 1 # 15 分钟内至少 1 次修改则保存 save 300 10 # 5 分钟内至少 10 次修改则保存 save 60 10000 # 1 分钟内至少 10000 次修改则保存 # 启用 aof(可选) appendonly yes appendfilename "appendonly.aof"
(2)启动 redis
redis-server /path/to/redis.conf
(3)客户端连接
redis-cli -h 127.0.0.1 -p 6379 -a yourpassword
二、哨兵模式(sentinel)
1. 简介
(1)整体设计:主从架构 + 自动故障转移,提供高可用性(ha)。
(2)部署方式:1 个主节点(master) + n 个从节点(replica)+ m 个 sentinel 节点。
(3)适用场景:需要高可用但不需要数据分片(水平扩展)的场景。
2. 整体架构
组成部分:
(1)1 个主节点(master):负责写入和数据存储。
(2)n 个从节点(replica):复制主节点数据,提供读能力。
(3)m 个哨兵节点(sentinel):监控主从状态,触发故障转移。
执行流程:
(1)监控(monitoring)
- 每个 sentinel 定期检查 master 和 replica 是否存活(默认每秒 1 次)。
- 若 master 未响应超过 down-after-milliseconds(如 30 秒),sentinel 标记其为 主观下线(sdown)。
(2)选举(leader election)
- 当多数 sentinel(>=
quorum
配置值)确认 master 下线,标记为 客观下线(odown)。 - sentinel 集群通过 raft 协议选举一个 leader sentinel 来执行故障转移。
(3)故障转移(failover)
- leader sentinel 选择一个最优的 replica 提升为新的 master。
- 通知其他 replica 复制新 master。
- 更新客户端连接信息(通过
+switch-master
事件通知)。
(4)客户端重定向
- 客户端通过 sentinel 获取最新的 master 地址(如
sentinel get-master-addr-by-name mymaster
)。
交互流程:
3. 配置方法
(1)主节点配置(redis-master.conf
)
bind 0.0.0.0 requirepass yourpassword masterauth yourpassword # 从节点访问主节点的密码
(2)从节点配置(redis-replica.conf
)
bind 0.0.0.0 requirepass yourpassword replicaof 127.0.0.1 6379 # 指向主节点 masterauth yourpassword # 主节点密码
(3)哨兵配置(sentinel.conf
)
sentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点,2 表示至少 2 个 sentinel 同意才触发故障转移 sentinel auth-pass mymaster yourpassword # 主节点密码 sentinel down-after-milliseconds mymaster 5000 # 5 秒无响应视为下线 sentinel failover-timeout mymaster 60000 # 故障转移超时时间(60 秒)
(4)启动服务
# 启动主节点 redis-server redis-master.conf # 启动从节点 redis-server redis-replica.conf # 启动 sentinel redis-sentinel sentinel.conf
(5)验证故障转移
# 查看主从信息 redis-cli -p 6379 info replication # 手动关闭主节点,观察 sentinel 日志 tail -f /var/log/redis/sentinel.log
(6)客户端配置示例
无需配置全部 sentinel 地址:客户端只需连接任意一个正常工作的 sentinel 即可获取集群状态(sentinel 之间通过 gossip 协议自动同步信息)。
推荐配置多个 sentinel 地址:仅用于容灾,避免某个 sentinel 不可用时客户端无法初始化。
set<string> sentinels = new hashset<>(); sentinels.add("sentinel1:26379"); // 只需 1 个 sentinel 即可工作 sentinels.add("sentinel2:26379"); // 额外添加用于容灾 sentinels.add("sentinel3:26379"); // 非必须,但建议 jedissentinelpool pool = new jedissentinelpool("mymaster", sentinels);
4. 特点
(1)高可用:sentinel 确保主节点故障时自动切换。
(2)无分片:仅解决 ha 问题,不扩展写性能。
(3)最少 3 节点:建议部署 3 个 sentinel 以避免脑裂问题。
三、集群模式(cluster)
1. 简介
(1)整体设计:支持主从实现高可用,将数据分片到 16384 个槽(slot),每个节点负责部分槽,已实现水平扩展。
(2)适用场景:大数据量、高并发、需要横向扩展的场景。
2. 整体架构
组成部分:
(1)master 节点(主节点)
- 负责处理客户端读写请求。
- 管理分配的哈希槽(slot)范围(如
slots 0-5460
)。 - 通过 gossip 协议 与其他节点交换集群状态信息。
(2)slave 节点(从节点)
- 异步复制对应 master 的数据(通过
-->|replication|
箭头表示)。 - 当 master 故障时,slave 可自动晋升为新的 master(故障转移)。
- 可处理读请求(需客户端配置
readonly
)。
(3)通信协议
- 节点间通过 gossip 协议(ping/pong 消息)交换集群拓扑、槽分配、节点状态等信息。
数据机制:
(1)哈希槽(slots)分布
- redis cluster 将所有数据划分为 16384 个槽位,每个 master 负责一部分槽范围(如
0-5460
)。 - 客户端通过
crc16(key) mod 16384
计算键所属的槽位。
(2)move 重定向
- 若客户端访问的键不属于当前连接的节点,节点会返回
moved
错误并指引正确节点。
3. 配置方法
(1)修改 redis.conf
(每个节点)
bind 0.0.0.0 cluster-enabled yes # 启用集群模式 cluster-config-file nodes-6379.conf # 集群节点配置文件 cluster-node-timeout 15000 # 节点超时时间(15 秒) requirepass yourpassword # 集群密码 masterauth yourpassword # 主节点间认证密码
(2)启动所有节点
redis-server /path/to/redis-6379.conf redis-server /path/to/redis-6380.conf
(3)创建集群
# 6 个节点(3 主 3 从) redis-cli --cluster create \ 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 \ 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 \ # --cluster-replicas 1 表示每个主节点有 1 个从节点 --cluster-replicas 1 -a yourpassword
(4)验证集群状态
redis-cli -c -p 6379 -a yourpassword 127.0.0.1:6379> cluster info 127.0.0.1:6379> cluster nodes
(5)客户端配置示例
支持集群协议:客户端需实现 redis cluster 的 moved/ask 重定向逻辑(主流客户端库已内置支持)。
种子节点配置:只需配置集群中任意 1-2 个节点地址(客户端会自动发现其他节点)。
认证信息:若集群启用密码,需统一所有节点的密码。
public class redisclusterexample { public static void main(string[] args) { // 1. 配置至少一个集群节点地址(多个更容错) set<hostandport> nodes = new hashset<>(); nodes.add(new hostandport("127.0.0.1", 6379)); nodes.add(new hostandport("127.0.0.1", 6380)); // 2. 创建集群连接(带密码) jediscluster jediscluster = new jediscluster(nodes, 2000, 2000, 5, "yourpassword"); // 3. 执行命令(自动处理重定向) jediscluster.set("foo", "bar"); string value = jediscluster.get("foo"); system.out.println(value); // 输出 "bar" // 4. 关闭连接 jediscluster.close(); } }
4. 特点
(1)在 redis cluster 中,扩充主节点时,必须重新分配槽(slots),这是由集群的分布式数据分片机制决定的。
(2)节点故障时,槽是否要重新分配,具体场景如下:
场景 | 槽是否重新分配 | 解决方案 |
---|---|---|
主节点故障,有从节点 | 否(从节点继承槽) | 自动故障转移 |
主节点及所有从节点故障 | 是(槽处于 fail 状态) | 手动恢复或重新分配槽 |
网络分区导致脑裂 | 可能部分槽不可用 | 等待恢复或强制修复 |
四、增强代理集群模式
上述三种部署模式特点如下:
模式 | 数据分片 | 高可用 | 适用场景 |
---|---|---|---|
单机 | ❌ | ❌ | 开发测试、低流量生产 |
哨兵 | ❌ | ✅ | 高可用但不需分片(横向扩展) |
集群 | ✅ | ✅ | 大数据量、高并发、横向扩展 |
在实际生产环境中,推荐采用 redis 集群模式(cluster)部署,以确保集群高可用(主从)与水平扩展(数据分片),但该模式存在客户端配置繁琐、无法兼容历史配置等问题,所以官方推出了 redis cluster proxy,旨在简化客户端与 redis cluster 的交互,它允许客户端像连接单节点 redis 一样访问 redis cluster,无需处理 moved/ask 重定向和集群拓扑变更。
1. redis cluster proxy 核心功能
(1)透明集群访问
- 客户端无需感知集群拓扑,proxy 自动处理请求路由和重定向。
- 兼容标准 redis 协议,支持所有单节点命令(除部分集群管理命令如
cluster
)。
(2)连接池管理
- 复用后端连接,减少客户端与多个节点直接建连的开销。
(3)协议兼容性
- 支持旧版 redis 客户端(如仅支持单节点模式的 sdk)。
(4)性能较好
- 基于 c 开发,性能损耗低(官方测试延迟增加约 10%)。
2. redis cluster proxy 配置方法
(1) 安装 redis cluster proxy
# 从官方仓库编译安装 git clone https://github.com/redislabs/redis-cluster-proxy.git cd redis-cluster-proxy make ./src/redis-cluster-proxy -c proxy.conf
(2) 配置文件 proxy.conf
# 绑定端口 bind 0.0.0.0 port 7777 # 后端 redis cluster 节点 cluster-node-timeout 5000 cluster 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003
(3) 启动 proxy
./src/redis-cluster-proxy -c proxy.conf
3. redis cluster proxy 部署增强
实际部署 proxy 时,为确保整个系统高可用,应部署多个 proxy 实例,通过 haproxy(或 lvs、envoy)实现 proxy 的高可用与水平扩展,整体架构如下:
负载均衡层:
(1)作用:
- 将请求分发到多个 proxy 实例(轮询/最小连接数)。
- 健康检查自动剔除故障 proxy。
(2)配置示例(以 haproxy 为例):
frontend redis-proxy bind *:6379 mode tcp default_backend proxy_servers backend proxy_servers mode tcp balance roundrobin server proxy1 192.168.1.100:7777 check inter 2s server proxy2 192.168.1.101:7777 check inter 2s
为保证 haproxy 的高可用,我们一般会部署两套 haproxy,通过 keepalived 互为主备,即增强代理集群,整体架构如下:
该集群具备 redis cluster 的高可用与水平扩展能力,以及 redis cluster proxy 的透明访问特性(兼容历史配置,简化客户端调用)。此外,借助 keepalived 和 haproxy(或 lvs、envoy),实现 redis cluster proxy 节点及集群的高可用,同时简化了集群调用代码的配置复杂度。
五、总结与建议
哨兵模式不支持水平扩展,且与集群模式一样,存在与客户端配置代码强耦合,难以兼容历史配置,无法实现透明访问等问题。因此在实际使用中,推荐采用 keepalived + haproxy(lvs 或 envoy) + redis cluster proxy + redis cluster 增强代理集群模式部署,以实现集群高可用、水平扩展、透明访问及兼容历史配置等必要功能。
到此这篇关于redis 部署模式详解的文章就介绍到这了,更多相关redis 部署模式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论