Redis —— 架构概览
文章目录
- Redis 架构概览
- 一、单机架构
- 二、主从复制架构
- 三、哨兵(Sentinel)架构
- 四、Redis Cluster(集群)架构
Redis 架构概览
Redis 有多种架构模式,每种架构适用于不同的业务场景。以下详细介绍常见的 Redis 架构及其搭建过程:
一、单机架构
架构说明:单一 Redis 实例,最简单的部署方式,适用于开发环境或低并发场景。
搭建步骤:
-
下载并解压 Redis
wget http://download.redis.io/releases/redis-6.2.6.tar.gz tar xzf redis-6.2.6.tar.gz cd redis-6.2.6 -
编译安装
make make install PREFIX=/usr/local/redis -
配置 Redis
cp redis.conf /usr/local/redis/bin/ cd /usr/local/redis/bin/ # 修改配置文件 vi redis.conf # 主要配置: # daemonize yes(后台运行) # bind 0.0.0.0(允许远程访问) # requirepass your_password(设置密码) -
启动服务
./redis-server redis.conf -
验证
./redis-cli -a your_password 127.0.0.1:6379> ping PONG
二、主从复制架构
架构核心:通过 “1 主多从” 实现数据冗余和读负载均衡,主节点负责读写,从节点仅读并同步主节点数据。当主节点故障时,需手动将从节点晋升为主节点(需配合人工操作实现高可用)。
环境准备:
- 服务器:1 台服务器(或 3 台独立服务器,此处以单服务器多端口模拟,端口:6379(主)、6380(从)、6381(从))
- Redis 版本:推荐 6.x 及以上(本文以 6.2.6 为例)
- 依赖:gcc 环境(编译 Redis 需用)
搭建步骤:
步骤 1:安装 Redis(所有节点通用)
-
下载并解压 Redis 源码
wget http://download.redis.io/releases/redis-6.2.6.tar.gz # 下载源码包 tar -zxvf redis-6.2.6.tar.gz # 解压 cd redis-6.2.6 # 进入源码目录 -
编译安装(需 gcc 环境,若未安装先执行
yum install gcc -y或apt install gcc -y)make # 编译(根据系统自动编译,生成可执行文件) make install PREFIX=/usr/local/redis # 安装到指定目录(/usr/local/redis) -
验证安装:进入
/usr/local/redis/bin,查看是否有redis-server(服务端)、redis-cli(客户端)等文件,若存在则安装成功。 -
为避免配置冲突,为每个节点创建独立目录:
mkdir -p /usr/local/redis-cluster/{master,slave1,slave2} # 主节点、从节点1、从节点2目录
步骤 2:配置主节点(6379 端口)
-
复制默认配置文件到主节点目录:
cp /root/redis-6.2.6/redis.conf /usr/local/redis-cluster/master/ # 假设源码在/root目录 -
编辑主节点配置文件
vi /usr/local/redis-cluster/master/redis.conf,修改以下配置(关键配置及解释):# 端口号(默认6379,主节点用6379) port 6379# 是否后台运行(生产环境建议开启,避免终端关闭后服务停止) daemonize yes# 日志文件路径(记录服务运行日志,便于排查问题) logfile "/usr/local/redis-cluster/master/redis-6379.log"# 数据存储目录(RDB/AOF文件及集群配置文件存放路径,需提前创建) dir "/usr/local/redis-cluster/master/data" # 提前创建data目录:mkdir -p /usr/local/redis-cluster/master/data# 绑定IP(默认绑定127.0.0.1,仅本地可访问;生产环境需改为0.0.0.0允许远程访问) bind 0.0.0.0# 保护模式(默认yes,仅允许绑定的IP访问;若bind为0.0.0.0,需关闭保护模式或设置密码) protected-mode no# 访问密码(生产环境必须设置,避免未授权访问) requirepass "redis@123" # 主节点密码# 开启AOF持久化(默认no,建议开启,与RDB配合提高数据安全性) appendonly yes# AOF文件名(默认appendonly.aof) appendfilename "appendonly-6379.aof"# RDB文件名(默认dump.rdb) dbfilename "dump-6379.rdb"配置说明:
port:区分不同节点,避免端口冲突;daemonize:后台运行是生产环境的基本要求;logfile和dir:明确日志和数据路径,便于管理和排查问题;bind 0.0.0.0和protected-mode no:允许其他节点(从节点、哨兵)远程连接;requirepass:密码是安全的基础,所有连接该节点的客户端(包括从节点)必须验证密码;- 持久化配置(AOF+RDB):防止节点宕机后数据丢失,AOF 实时性更高,RDB 适合备份。
步骤 3:配置从节点(6380、6381 端口)
-
复制配置文件(从节点1):
cp /usr/local/redis-cluster/master/redis.conf /usr/local/redis-cluster/slave1/ -
编辑配置文件
vi /usr/local/redis-cluster/slave1/redis.conf,修改:port 6380 # 端口与主节点不同 logfile "/usr/local/redis-cluster/slave1/redis-6380.log" # 日志路径 dir "/usr/local/redis-cluster/slave1/data" # 数据路径(需创建:mkdir -p .../data) requirepass "redis@123" # 从节点自身密码(客户端连接从节点需验证)# 关键:指定主节点地址和端口(Redis 5.0+ 推荐用replicaof,替代旧版slaveof) replicaof 127.0.0.1 6379 # 指向主节点(IP为服务器实际IP,此处本地模拟用127.0.0.1)# 主节点的密码(从节点同步数据时需验证主节点密码) masterauth "redis@123" # 与主节点requirepass一致配置说明:
replicaof:定义从节点的 “主节点”,从节点启动后会自动连接主节点并同步数据;masterauth:从节点向主节点发送同步请求时,需携带主节点密码,否则主节点会拒绝连接。
-
从节点 2 配置与从节点 1 类似,仅端口和路径不同:
port 6381 logfile "/usr/local/redis-cluster/slave2/redis-6381.log" dir "/usr/local/redis-cluster/slave2/data" requirepass "redis@123" replicaof 127.0.0.1 6379 masterauth "redis@123"
步骤4:启动主从节点
-
启动所有节点
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/master/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/slave1/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/slave2/redis.conf -
验证启动:
ps -ef | grep redis-server,应显示 3 个进程(6379、6380、6381)。
步骤 5:验证主从复制状态
-
连接主节点,查看复制信息:
/usr/local/redis/bin/redis-cli -p 6379 -a redis@123 # -p指定端口,-a指定密码 127.0.0.1:6379> info replication # 查看复制状态输出中应包含从节点信息(示例):
# Replication role:master # 角色为主节点 connected_slaves:2 # 有2个从节点 slave0:ip=127.0.0.1,port=6380,state=online,offset=144,lag=1 # 从节点1 slave1:ip=127.0.0.1,port=6381,state=online,offset=144,lag=1 # 从节点2 -
测试数据同步:在主节点写入数据,从节点验证是否同步:
# 主节点写入 127.0.0.1:6379> set test_key "主从复制测试" OK# 连接从节点6380,读取数据 /usr/local/redis/bin/redis-cli -p 6380 -a redis@123 127.0.0.1:6380> get test_key "主从复制测试" # 成功同步
三、哨兵(Sentinel)架构
架构核心:在主从架构基础上增加哨兵节点(Sentinel),哨兵实时监控主从节点健康状态,当主节点故障时,自动将从节点晋升为新主节点,实现 “无人值守” 的高可用。
环境准备:
- 已搭建主从架构(1 主 2 从:6379、6380、6381);
- 3 个哨兵节点(推荐奇数个,避免脑裂,端口:26379、26380、26381)。
搭建步骤:
步骤 1:创建哨兵节点目录
-
创建哨兵节点目录
mkdir -p /usr/local/redis-cluster/sentinel/{s1,s2,s3} # 3个哨兵目录
步骤 2:配置哨兵节点(以 s1 为例,26379 端口)
-
复制哨兵默认配置文件(源码包中自带):
cp /root/redis-6.2.6/sentinel.conf /usr/local/redis-cluster/sentinel/s1/ -
编辑哨兵配置
vi /usr/local/redis-cluster/sentinel/s1/sentinel.conf,修改:# 哨兵端口(26379,与其他节点端口区分) port 26379# 后台运行 daemonize yes# 哨兵日志文件 logfile "/usr/local/redis-cluster/sentinel/s1/sentinel-26379.log"# 数据目录(哨兵自身状态文件存放路径) dir "/usr/local/redis-cluster/sentinel/s1/data" # 需创建data目录# 关键:监控主节点(格式:sentinel monitor <主节点名称> <主节点IP> <主节点端口> <quorum>) sentinel monitor mymaster 127.0.0.1 6379 2 # 解释如下: # mymaster:主节点的逻辑名称(自定义); # 127.0.0.1 6379:主节点的IP和端口; # 2:quorum值(至少2个哨兵认为主节点故障,才判定为真故障)。# 主节点的密码(哨兵连接主节点需验证) sentinel auth-pass mymaster redis@123 # 与主节点requirepass一致# 判定主节点“主观下线”的时间(毫秒):若主节点超过30秒无响应,哨兵认为其主观下线 sentinel down-after-milliseconds mymaster 30000# 故障转移超时时间(毫秒):若180秒内未完成故障转移,视为失败 sentinel failover-timeout mymaster 180000# 同一时间最多有1个从节点向新主节点同步数据(避免网络拥堵) sentinel parallel-syncs mymaster 1配置说明:
quorum:奇数哨兵节点数的情况下,通常设为(n/2)+1(n 为哨兵总数),3 个哨兵设为 2,确保多数同意;down-after-milliseconds:主观下线时间,过短可能误判,过长影响故障转移速度,推荐 30 秒;parallel-syncs:控制从节点同步新主节点的并发数,1 表示串行同步,减少网络压力。
-
配置其他哨兵节点(s2、s3),与 s1 配置类似,仅端口和路径不同:
s2(26380 端口):
port 26380 logfile "/usr/local/redis-cluster/sentinel/s2/sentinel-26380.log" dir "/usr/local/redis-cluster/sentinel/s2/data" sentinel monitor mymaster 127.0.0.1 6379 2 sentinel auth-pass mymaster redis@123 # 其他配置(daemonize、down-after-milliseconds等)与s1一致s3(26381 端口):
port 26381 logfile "/usr/local/redis-cluster/sentinel/s3/sentinel-26381.log" dir "/usr/local/redis-cluster/sentinel/s3/data" sentinel monitor mymaster 127.0.0.1 6379 2 sentinel auth-pass mymaster redis@123 # 其他配置与s1一致
步骤 3:启动所有哨兵节点
-
启动哨兵
# 启动s1 /usr/local/redis/bin/redis-sentinel /usr/local/redis-cluster/sentinel/s1/sentinel.conf # 启动s2 /usr/local/redis/bin/redis-sentinel /usr/local/redis-cluster/sentinel/s2/sentinel.conf # 启动s3 /usr/local/redis/bin/redis-sentinel /usr/local/redis-cluster/sentinel/s3/sentinel.conf验证启动:
ps -ef | grep redis-sentinel,应显示 3 个进程。
步骤 4:验证哨兵状态
-
连接任意哨兵节点,查看监控状态:
/usr/local/redis/bin/redis-cli -p 26379 # 哨兵无密码(默认不设置,若需密码可配置requirepass) 127.0.0.1:26379> info sentinel # 查看哨兵信息输出应包含:
# Sentinel sentinel_masters:1 # 监控的主节点数量 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3 # 显示主节点状态正常,2个从节点,3个哨兵
步骤 5:测试故障转移(核心验证)
-
手动停止主节点(模拟故障):
/usr/local/redis/bin/redis-cli -p 6379 -a redis@123 shutdown -
查看哨兵日志(以 s1 为例):
tail -f /usr/local/redis-cluster/sentinel/s1/sentinel-26379.log日志中会显示:
- 检测到主节点 6379 下线;
- 哨兵协商后发起故障转移;
- 从 6380、6381 中选举一个新主节点(假设 6380 被选中)。
-
验证新主节点:连接原从节点 6380,查看角色:
/usr/local/redis/bin/redis-cli -p 6380 -a redis@123 127.0.0.1:6380> info replication # 输出中role:master,且connected_slaves:1(原6381变为其从节点) -
重启原主节点 6379,查看角色:
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/master/redis.conf # 重启6379 /usr/local/redis/bin/redis-cli -p 6379 -a redis@123 127.0.0.1:6379> info replication # 角色变为slave,replicaof指向新主节点6380(哨兵自动更新配置)
四、Redis Cluster(集群)架构
架构核心:多主多从 + 数据分片,将数据分散到多个主节点(通过 16384 个槽位分片),每个主节点有从节点备份,支持水平扩展和自动故障转移,适合大规模数据场景。
环境准备:
- 6 个节点(3 主 3 从,端口:6379、6380、6381(主);6382、6383、6384(从));
- 所有节点开启集群模式。
搭建步骤:
步骤 1:创建 6 个节点目录
-
创建 6 个节点目录:
mkdir -p /usr/local/redis-cluster/cluster/{79,80,81,82,83,84} # 对应端口6379-6384
步骤 2:配置集群节点(以 79 为例,6379 端口)
-
复制配置文件:
cp /root/redis-6.2.6/redis.conf /usr/local/redis-cluster/cluster/79/ -
编辑配置
vi /usr/local/redis-cluster/cluster/79/redis.conf,修改:port 6379 daemonize yes logfile "/usr/local/redis-cluster/cluster/79/redis-6379.log" dir "/usr/local/redis-cluster/cluster/79/data" # 需创建data目录 bind 0.0.0.0 protected-mode no requirepass "redis@123" # 节点密码 masterauth "redis@123" # 主节点密码(从节点同步用)# 关键:开启集群模式 cluster-enabled yes # 必须设为yes,否则不是集群节点# 集群配置文件(自动生成,记录集群节点信息,无需手动修改) cluster-config-file nodes-6379.conf # 每个节点文件名不同(含端口)# 节点超时时间(毫秒):超过此时间未响应,视为节点故障 cluster-node-timeout 15000 # 推荐15秒# 开启AOF持久化 appendonly yes配置说明:
cluster-enabled yes:标志该节点为集群节点,参与槽位分配和数据分片;cluster-config-file:集群自动维护的配置文件(记录节点 ID、槽位分布等),重启后会加载;cluster-node-timeout:故障检测的超时阈值,影响故障转移速度。
-
复制并修改其他 5 个节点的配置(仅端口和路径不同):
- 6380:
port 6380,cluster-config-file nodes-6380.conf,路径对应 80 目录; - 6381:
port 6381,cluster-config-file nodes-6381.conf,路径对应 81 目录; - 6382-6384:同上,端口依次为 6382-6384,路径对应 82-84 目录。
- 6380:
步骤 3:启动所有集群节点
-
启动所有节点
# 依次启动6个节点 /usr/local/redis/bin/redis-server /usr/local/redis-cluster/cluster/79/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/cluster/80/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/cluster/81/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/cluster/82/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/cluster/83/redis.conf /usr/local/redis/bin/redis-server /usr/local/redis-cluster/cluster/84/redis.conf验证启动:
ps -ef | grep redis-server,6 个节点进程均存在。
步骤 4:创建 Redis 集群(核心步骤)
-
创建集群
/usr/local/redis/bin/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 \ -a redis@123命令参数解释:
--cluster create:创建集群;- 后续为 6 个节点的 IP: 端口;
--cluster-replicas 1:每个主节点分配 1 个从节点(3 主 3 从,符合预期);-a redis@123:节点的密码(所有节点密码需一致)。
执行后,会显示节点角色分配(如 6379、6380、6381 为主节点,6382-6384 为其从节点),并提示 “Can I set the above configuration? (type ‘yes’ to accept)”,输入
yes确认。
步骤 5:验证集群状态
-
连接任意节点(需加
-c表示集群模式,自动路由):/usr/local/redis/bin/redis-cli -c -p 6379 -a redis@123 -
查看集群信息:
127.0.0.1:6379> cluster info # 集群整体状态 cluster_state:ok # 集群正常 cluster_slots_assigned:16384 # 所有槽位已分配 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 # 6个节点 ... -
查看节点列表(含角色和槽位):
127.0.0.1:6379> cluster nodes # 输出示例(精简): 999d... 127.0.0.1:6379@16379 master - 0 1680000000000 1 connected 0-5460 # 主节点,负责槽0-5460 a88b... 127.0.0.1:6380@16380 master - 0 1680000000000 2 connected 5461-10922 # 主节点,槽5461-10922 b77c... 127.0.0.1:6381@16381 master - 0 1680000000000 3 connected 10923-16383 # 主节点,槽10923-16383 c66d... 127.0.0.1:6382@16382 slave 999d... 0 1680000000000 4 connected # 6379的从节点 d55e... 127.0.0.1:6383@16383 slave a88b... 0 1680000000000 5 connected # 6380的从节点 e44f... 127.0.0.1:6384@16384 slave b77c... 0 1680000000000 6 connected # 6381的从节点
步骤 6:测试数据分片与故障转移
-
数据分片测试:
127.0.0.1:6379> set name "redis-cluster" # 自动路由到对应槽位的节点 -> Redirected to slot [5798] located at 127.0.0.1:6380 # 路由到6380(负责5461-10922槽) OK127.0.0.1:6380> get name # 直接读取 "redis-cluster"127.0.0.1:6379> cluster keyslot key1 # 查看键所在的槽位 -
故障转移测试(停止主节点 6380):
/usr/local/redis/bin/redis-cli -p 6380 -a redis@123 shutdown查看集群节点状态:
127.0.0.1:6379> cluster nodes # 6383(原6380的从节点)会晋升为主节点,负责5461-10922槽; # 重启6380后,会变为6383的从节点。
各架构对比及适用场景
| 架构 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 单机 | 简单、资源占用少 | 无高可用、难扩展 | 开发环境、低并发场景 |
| 主从 | 提高读性能、数据备份 | 手动故障转移、难扩展 | 读多写少、需数据备份 |
| 哨兵 | 自动故障转移、高可用 | 难扩展、运维复杂 | 生产环境、需高可用 |
| 集群 | 高可用、水平扩展 | 跨槽操作限制、复杂 | 大规模数据、高并发 |
实际生产中,中小规模推荐哨兵架构,大规模数据推荐 Redis Cluster。所有架构均需配合持久化(AOF+RDB)和备份策略,进一步保障数据安全。
