当前位置: 首页 > news >正文

Redis 三大架构模式详解:主从复制、哨兵、Cluster 搭建全指南

一、引言

Redis 作为高性能的内存数据库,被广泛应用于缓存、消息队列、排行榜等场景。为了提升其可用性与扩展性,Redis 提供了三种核心架构模式:

  1. 主从复制(Master-Slave Replication)

  2. 哨兵模式(Sentinel)

  3. 集群模式(Cluster)

本文将详细介绍这三种模式的原理、优缺点及搭建方法,帮助你根据业务场景选择合适的架构。


二、主从复制:高可用的基石

✅ 原理简述

主从复制是 Redis 最基本的高可用方案。主节点负责写操作,从节点复制主节点的数据,提供读服务。

✅ 主要作用

  • 数据冗余与备份

  • 读写分离,提升读并发能力

  • 故障恢复(手动)

✅ 复制流程

  1. 从节点发送 SYNC 命令请求同步

  2. 主节点执行 BGSAVE 生成 RDB 文件并发送给从节点

  3. 从节点加载 RDB 文件并完成初始化

  4. 主节点持续将写命令同步给从节点

✅ 搭建步骤(CentOS 示例)

   设置主机名,从机名

    Master节点: 192.168.10.150
Slave1节点: 192.168.10.100
Slave2节点: 192.168.10.80

关闭防火墙

systemctl stop firewalld
setenforce 0

安装redix

yum install -y gcc gcc-c++ make
wget -p /opt http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make PREFIX=/usr/local/redis installcd /opt/redis-5.0.7/utils
./install_server.sh
......
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server  	ln -s /usr/local/redis/bin/* /usr/local/bin/

修改主节点(master)配置文件

cp /etc/redis/6379.conf /etc/redis/6379.conf.bak
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持久化功能/etc/init.d/redis_6379 restart

修改从节点(slave)配置文件

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行,指定工作目录		
replicaof 192.168.10.150 6379       #288行,指定要同步的Master节点IP和端口
appendonly yes						#700行,开启AOF持久化功能/etc/init.d/redis_6379 restart

验证主从效果

1.看日志

tail -f /var/log/redis_6379.log 
Replica 192.168.10.100:6379 asks for synchronization
Replica 192.168.10.80:6379 asks for synchronization

2.在master节点上验证

redis-cli info replication# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.18,port=6379,state=online,offset=1246,lag=0
slave1:ip=192.168.10.19,port=6379,state=online,offset=1246,lag=1

3.在主机上输入看从机上是否有反应

三、哨兵模式:自动故障转移

✅ 原理简述

哨兵模式在主从复制的基础上,引入了自动故障转移机制。当主节点宕机,哨兵会自动选举新的主节点。

✅ 核心功能

  • 监控主从节点状态

  • 自动故障转移

  • 通知客户端新的主节点地址

✅ 故障转移流程

  1. 哨兵发现主节点主观下线(SDOWN)

  2. 多数哨兵确认客观下线(ODOWN)

  3. 选举 leader 哨兵

  4. 提升一个从节点为新主节点

  5. 通知其他从节点和客户端

✅ 配置示例(sentinel.conf)

Master节点:192.168.10.150
Slave1节点:192.168.10.100
Slave2节点:192.168.10.80

关闭防火墙

systemctl stop firewalld
setenforce 0

修改 Redis 哨兵模式的配置文件(所有节点操作)

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.10.150 6379 2	#84行,修改 指定该哨兵节点监控192.168.10.150:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000	#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000		#146行,故障节点的最大超时时间为180000(180秒)

启动哨兵

先启master,再启slave
先启master,再启slave
先启master,再启slave

cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

查看哨兵信息

redis-cli -p 26379 info Sentinel# Sentinelsentinel_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=192.168.20.23:6379,slaves=2,sentinels=3

故障模拟

#查看redis-server进程号:
ps -ef | grep redis
root      57031      1  0 15:20 ?        00:00:07 /usr/local/bin/redis-server 0.0.0.0:6379
root      57742      1  1 16:05 ?        00:00:07 redis-sentinel *:26379 [sentinel]
root      57883  57462  0 16:17 pts/1    00:00:00 grep --color=auto redis#杀死 Master 节点上redis-server的进程号
kill -9 57031			#Master节点上redis-server的进程号#验证结果
tail -f /var/log/sentinel.log
23062:X 18 Sep 2025 22:36:04.175 # +monitor master mymaster 192.168.10.150 6379 quorum 2
23062:X 18 Sep 2025 22:36:04.176 * +slave slave 192.168.10.100:6379 192.168.10.100 6379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:36:04.178 * +slave slave 192.168.10.80:6379 192.168.10.80 6379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:36:11.142 * +sentinel sentinel 2d97f3ac6e2ca4a7ecdf456264324b519edae80e 192.168.10.100 26379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:36:13.326 * +sentinel sentinel 0fef2cc38d8db8ccefad0466290bcd1057e16aa9 192.168.10.80 26379 @ mymaster 192.168.10.150 6379
23066:X 18 Sep 2025 22:36:19.027 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23066:X 18 Sep 2025 22:36:19.027 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=23066, just started
23066:X 18 Sep 2025 22:36:19.027 # Configuration loaded
23067:X 18 Sep 2025 22:36:19.028 * Increased maximum number of open files to 10032 (it was originally set to 1024).
23067:X 18 Sep 2025 22:36:19.028 # Could not create server TCP listening socket *:26379: bind: Address already in use
23062:X 18 Sep 2025 22:37:50.104 # +sdown master mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:37:50.178 # +new-epoch 1
23062:X 18 Sep 2025 22:37:50.179 # +vote-for-leader 0fef2cc38d8db8ccefad0466290bcd1057e16aa9 1
23062:X 18 Sep 2025 22:37:50.560 # +config-update-from sentinel 0fef2cc38d8db8ccefad0466290bcd1057e16aa9 192.168.10.80 26379 @ mymaster 192.168.10.150 6379
23062:X 18 Sep 2025 22:37:50.560 # +switch-master mymaster 192.168.10.150 6379 192.168.10.80 6379
23062:X 18 Sep 2025 22:37:50.561 * +slave slave 192.168.10.100:6379 192.168.10.100 6379 @ mymaster 192.168.10.80 6379
23062:X 18 Sep 2025 22:37:50.561 * +slave slave 192.168.10.150:6379 192.168.10.150 6379 @ mymaster 192.168.10.80 6379
23062:X 18 Sep 2025 22:38:20.584 # +sdown slave 192.168.10.150:6379 192.168.10.150 6379 @ mymaster 192.168.10.80 6379

查看是否被更换

redis-cli -p 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=192.168.10.100:6379,slaves=2,sentinels=3

四、Redis Cluster:真正的分布式方案

✅ 原理简述

Redis Cluster 是 Redis 官方提供的分布式解决方案,支持:

  • 数据分片(16384 个哈希槽)

  • 主从复制

  • 自动故障转移

✅ 数据分片机制

  • 每个 key 通过 CRC16 对 16384 取模,决定属于哪个槽

  • 每个节点负责一部分槽

  • 支持动态扩容、缩容

✅ 搭建步骤(单机模拟 6 节点)

节点规划:

  • 主节点:6001、6002、6003

  • 从节点:6004、6005、6006

配置要点(redis.conf):

搭建Redis 群集模式 ----------------------------------------
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。

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

开启群集功能:
其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。

cd /etc/redis/redis-cluster/redis6001
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节点

for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
doneps -ef | grep 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					#加-c参数,节点之间就可以互相跳转
127.0.0.1:6001> cluster slots			#查看节点的哈希槽编号范围
1) 1) (integer) 54612) (integer) 10922									#哈希槽编号范围3) 1) "127.0.0.1"2) (integer) 6003									#主节点IP和端口号3) "fdca661922216dd69a63a7c9d3c4540cd6baef44"4) 1) "127.0.0.1"2) (integer) 6004									#从节点IP和端口号3) "a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 02) (integer) 54603) 1) "127.0.0.1"2) (integer) 60013) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11"4) 1) "127.0.0.1"2) (integer) 60063) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 109232) (integer) 163833) 1) "127.0.0.1"2) (integer) 60023) "816ddaa3d1469540b2ffbcaaf9aa867646846b30"4) 1) "127.0.0.1"2) (integer) 60053) "f847077bfe6722466e96178ae8cbb09dc8b4d5eb"

测试

127.0.0.1:6001> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:6003
OK127.0.0.1:6001> cluster keyslot name					#查看name键的槽编号redis-cli -p 6004 -c
127.0.0.1:6004> keys *							#对应的slave节点也有这条数据,但是别的节点没有
1) "name"

看是否从1转到2


五、三种模式对比总结

表格

复制

特性/模式主从复制哨兵模式Cluster 集群
数据备份
读写分离
自动故障转移
写操作负载均衡
数据分片
单机内存限制

六、结语

  • 小型项目:主从复制足够

  • 中型项目:哨兵模式提供自动故障转移

  • 大型项目:Cluster 模式支持水平扩展与高可用

选择合适的架构,才能让 Redis 在你的系统中发挥最大价值。

http://www.dtcms.com/a/391883.html

相关文章:

  • [x-cmd] 如何安全卸载 x-cmd
  • 整体设计 语言拼凑/逻辑拆解/词典缝合 之 3 词典缝合(“他”):显露词典编纂行列式项的 “自然”三“然”:自然本然/ 自然而然/自然实然
  • linux配置ssh,亲测简单可用
  • SNMP 模块化设计解析
  • 2025的Xmind自定义安装(实测版)
  • AI“闻香识酒”:电子鼻+机器学习开启气味数字化新纪元
  • Coze工作流拆解:成语故事类小红书图文批量创作全流程
  • PyQt6之进度条
  • 【AI编程】Trae配置rules与配置和使用一些目前比较好用的MCP
  • 音乐家不会被束缚,MusicGPT+cpolar让创作更自由
  • python笔记之面向对象篇(六)
  • Linux中处理nohup日志太大的问题
  • vLLM应该怎么学习
  • 实测AI Ping,一个大模型服务选型的实用工具——技术原理与核心技巧解析
  • rag-anything —— 一站式 RAG 系统
  • 第十周文件包含漏洞和远程命令执⾏漏洞
  • 2021年下半年 系统架构设计师 综合知识
  • 佳易王宠物医院管理系统软件:核心功能详解
  • Berkeley DB: 一款高性能的嵌入式键值对数据库
  • BGE-large-zh-v1.5微调
  • Merkle Patricia Tree
  • 2003-2017年各地级市环境相关指标数据
  • 【开题答辩全过程】以 基于JAVA的视频分享管理系统为例,包含答辩的问题和答案
  • claude-code-和-codex-和-cursor-uniapp前端开发实测
  • 阿里新发布|Qwen3-Next-80B-A3B :MoE 架构破解大模型效率难题,vLLM 落地实测
  • 1型糖尿病中的胰岛细胞病变(β细胞与α细胞)
  • 工频干扰消除算法总结参考
  • 6.栈和队列(上)
  • C语言 ——— 数组
  • 卡尔曼Kalman滤波|基础学习(二)