ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Redis Stack部署与实战:从安装到高可用,解锁实时数据平台

2026/8/16 7:59:37 拓冰建站 浏览量
Redis Stack部署与实战:从安装到高可用,解锁实时数据平台 1. 从Redis到Redis Stack为什么你需要这个“全家桶”如果你接触过Redis大概率是从它的缓存功能开始的。一个简单的SET、GET命令就能让数据库查询压力骤降性能立竿见影。但如果你以为Redis只是个缓存中间件那可能就错过了它最近几年最激动人心的进化。我最初也是抱着“装个缓存”的心态去部署Redis直到在项目中遇到了更复杂的需求比如想对用户行为做实时统计和排名用原生的Sorted Set写起来异常繁琐又比如想对存储在Redis里的JSON文档进行灵活查询而不是一股脑儿取出来在应用层处理。这些场景让我开始寻找更强大的工具最终发现了Redis Stack。Redis Stack不是一个全新的数据库而是Redis官方推出的一个“增强版”发行版。你可以把它理解为一个预装了多个顶级扩展的Redis服务器开箱即用。它的核心是Redis本身但在此基础上捆绑了四个强大的模块RedisJSON、RedisSearch、RedisTimeSeries和RedisBloom。这意味着部署一个Redis Stack你就同时拥有了一个文档数据库、一个搜索引擎、一个时间序列数据库和一个概率数据结构库。对于现代应用开发尤其是微服务、实时分析、物联网这些场景这种“多合一”的能力极具吸引力。你不用再费心去分别寻找、编译、集成各种第三方模块官方已经为你做好了兼容性测试和打包稳定性和性能都有保障。最近在技术社区里关于“本地部署”、“一体化部署”的讨论非常热烈无论是ollama、dify还是minimax的本地部署核心诉求都是将强大的能力收归自有环境确保数据隐私、降低延迟和拥有完全的控制权。Redis Stack的部署理念与此高度契合。它让你能在自己的服务器、虚拟机甚至Docker容器里快速搭建起一个功能完备的实时数据平台。无论是作为微服务架构中的核心数据层还是为你的AI应用比如本地部署的LLM提供高速的向量检索支持通过RedisSearch的向量搜索功能Redis Stack都能扮演关键角色。接下来我将从一个实践者的角度带你完成从部署、安装到核心功能使用的完整旅程并分享那些官方文档里不会写的配置细节和避坑经验。2. 部署前的决策选择适合你的安装方式部署Redis Stack和部署传统Redis一样有多种路径可选。选择哪种方式取决于你的使用场景、技术栈和环境约束。没有最好的只有最合适的。这里我详细拆解三种主流方式Docker部署、原生包安装和源码编译并告诉你我通常在什么情况下会怎么选。2.1 Docker部署敏捷开发与云原生环境的首选Docker无疑是当前最流行的部署方式尤其适合开发、测试环境以及基于Kubernetes的云原生架构。它的优势在于环境隔离、依赖统一和极致的可重复性。操作步骤与核心命令拉取镜像Redis Stack的Docker镜像托管在Docker Hub和Redis自家的容器注册中心。官方推荐使用后者以获得最佳性能和支持。# 使用Docker Hub镜像通用 docker pull redis/redis-stack:latest # 或使用Redis官方容器注册中心推荐 docker pull redis/redis-stack-server:latest这里有一个关键细节redis/redis-stack镜像包含了RedisInsight一个图形化管理工具的Web界面而redis/redis-stack-server是纯服务器版本更轻量。对于生产环境或无UI需求的容器我强烈建议使用-server版本。运行容器最基本的运行命令如下它将容器内的6379端口映射到主机的6379端口。docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest解释一下参数和端口-p 6379:6379这是Redis服务的默认端口你的应用程序将通过这个端口连接。-p 8001:8001这是RedisInsight Web管理界面的端口。如果你用的是-server镜像则不需要映射8001端口。数据持久化是生产部署的生命线。Redis默认将所有数据保存在内存中虽然也支持RDB快照和AOF日志两种持久化方式但在Docker中你必须将数据目录挂载到宿主机否则容器重启后数据将全部丢失。docker run -d --name redis-stack \ -p 6379:6379 \ -p 8001:8001 \ -v /your/local/data:/data \ redis/redis-stack:latest这条命令将容器内的/data目录挂载到了宿主机的/your/local/data路径。Redis的持久化文件dump.rdb或appendonly.aof就会写在这里。请务必确保宿主机目录存在且Docker进程有写入权限。Docker部署的避坑经验内存与交换空间在Docker或Kubernetes中务必为容器设置明确的内存限制-m或resources.limits.memory。Redis的性能极度依赖内存如果容器内存不足被系统OOM Killer终止或者频繁使用交换空间性能会急剧下降。我的经验法则是限制值应略高于你预估的业务数据量并为RDB快照创建等操作留出余量。网络模式在Docker Compose或K8s中确保相关服务你的应用容器与Redis Stack容器在同一个自定义网络中使用容器名进行服务发现这比依赖固定的主机IP和端口要稳定得多。生产环境配置通过环境变量或自定义配置文件来覆盖默认配置。例如设置密码、调整持久化策略docker run -d --name redis-stack \ -p 6379:6379 \ -v /your/local/data:/data \ -v /your/local/redis-stack.conf:/etc/redis-stack.conf \ -e REDIS_ARGS--requirepass your-strong-password --appendonly yes \ redis/redis-stack-server:latest这里我通过REDIS_ARGS环境变量传递了Redis服务器的启动参数设定了密码并开启了AOF持久化。更复杂的配置建议使用挂载配置文件的方式。2.2 原生包安装追求极致性能与控制力的选择如果你在物理机或虚拟机上部署并且希望获得最直接的控制和潜在的最佳性能那么使用系统包管理器如apt、yum安装是最佳选择。这种方式服务以系统守护进程运行管理起来更符合运维习惯。Ubuntu/Debian 系统安装步骤导入GPG密钥并添加仓库这是为了确保软件包的来源可信。curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg echo deb [signed-by/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/redis.list更新并安装sudo apt-get update sudo apt-get install redis-stack-server安装完成后服务会自动启动。你可以使用systemctl status redis-stack-server来检查运行状态。RHEL/CentOS/Rocky Linux 系统安装步骤添加仓库并安装curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /etc/yum.repos.d/redis.repo echo [redis-stack] nameRedis Stack baseurlhttps://packages.redis.io/redislabs/redislabs-rpm/rhel/8/x86_64/ enabled1 gpgcheck1 gpgkeyhttps://packages.redis.io/gpg | sudo tee /etc/yum.repos.d/redis-stack.repo sudo yum install redis-stack-server原生安装后的关键配置安装包通常会提供一个默认的配置文件位置在/etc/redis-stack/redis-stack.conf。在投入生产前你必须修改它。绑定地址默认的bind 127.0.0.1只允许本地连接。如果你需要从其他服务器访问需要将其改为bind 0.0.0.0监听所有接口并务必配合防火墙和密码认证否则等于将数据库暴露在公网。守护进程与日志确保daemonize yes并以合适的日志级别loglevel notice和路径logfile /var/log/redis/redis-stack.log运行。数据目录检查dir /var/lib/redis确保该目录有足够的磁盘空间和正确的权限redis用户可写。内存策略maxmemory参数必须设置。一个常见的误区和灾难是忘记设置此参数导致Redis无限使用内存最终拖垮整个服务器。根据你的系统内存设置一个安全值例如maxmemory 4gb。同时设置maxmemory-policy allkeys-lru或volatile-lru来定义内存满时的淘汰策略。2.3 源码编译针对特定系统或深度定制的最后手段除非你有非常特殊的需求比如需要针对特定的CPU架构进行优化或者想使用某个尚未发布到稳定版的分支否则我不推荐初学者或生产环境使用源码编译。这个过程涉及依赖管理、编译选项复杂度较高。如果你确实需要大致流程如下安装编译依赖gcc、make、libc6-dev等。从Redis GitHub仓库下载Redis Stack的源码注意Redis Stack的模块源码集成在同一个仓库中。进入源码目录执行make和make install。手动处理服务脚本、配置文件和数据目录。这种方式将配置和管理的所有责任都交给了你需要深厚的Linux系统管理知识。对于绝大多数场景Docker或原生包安装已经足够优秀。3. 验证部署与初识RedisInsight部署完成后第一件事不是急着写代码而是验证服务是否正常运行并熟悉一下这个强大的管理工具——RedisInsight。它能让你直观地看到Redis Stack的“全家桶”能力。3.1 基础连接与服务状态检查无论通过哪种方式安装都可以使用Redis自带的命令行工具redis-cli进行连接测试。# 连接本地默认端口的Redis redis-cli # 如果设置了密码使用-a参数注意密码会出现在历史命令中生产环境不建议 # 更安全的方式是先连接再使用AUTH命令 redis-cli 127.0.0.1:6379 AUTH your-password OK # 执行一个简单的PING-PONG测试 127.0.0.1:6379 PING PONG # 查看服务器信息这里包含了Redis版本、运行模式、模块列表等关键信息 127.0.0.1:6379 INFO server # Server redis_version:7.2.0 redis_mode:standalone ...看到PONG回应和正常的INFO输出说明Redis服务本身已经就绪。3.2 RedisInsight你的可视化控制中心如果你部署的是包含UI的镜像非-server版或单独安装了RedisInsight现在可以通过浏览器访问http://你的服务器IP:8001。首次打开需要添加数据库连接。添加连接时的注意事项Host如果RedisInsight和Redis Stack在同一台机器用127.0.0.1或localhost。如果在容器网络或不同主机需填写正确的IP或容器名。Port默认6379。Name给这个连接起个有意义的名字如“生产环境-主节点”。Username/Password如果配置了ACL访问控制列表或简单密码在此处填写。默认安装可能没有密码但生产环境必须设置。连接成功后RedisInsight的界面会让你眼前一亮。左侧是导航栏核心功能包括Browser以树状结构浏览所有键支持按模式搜索直观展示不同类型键String, Hash, List, Set, JSON等的值。CLI一个增强版的Web命令行界面不仅支持所有Redis命令还提供语法高亮、命令提示和历史记录比单纯的redis-cli友好得多。Profiler实时监控服务器接收到的所有命令用于性能分析和调试可以清晰看到每个命令的执行时间和客户端信息。Slow Log查看执行时间超过阈值的慢查询是优化性能的关键工具。Memory Analysis分析内存使用情况找出哪些键占用了大量空间。通过RedisInsight验证模块加载这是确认Redis Stack“全家桶”功能是否就位的关键一步。在CLI或Browser中输入命令127.0.0.1:6379 MODULE LIST你会看到一个列表其中应该包含类似以下输出1) 1) name 2) ReJSON 3) ver 4) 20009 2) 1) name 2) search 3) ver 4) 20409 3) 1) name 2) timeseries 3) ver 4) 10499 4) 1) name 2) bf 3) ver 4) 20407这分别对应了RedisJSON、RedisSearch、RedisTimeSeries和RedisBloomBF四个模块。看到它们就意味着你可以开始使用这些扩展命令了。4. 核心模块实战超越简单键值对现在服务已经跑起来了管理工具也熟悉了。是时候深入核心看看Redis Stack的四个模块如何解决实际问题。我将通过具体的场景和命令示例来展示它们的威力。4.1 RedisJSON把Redis当作文档数据库传统Redis处理复杂对象时通常需要序列化成字符串如JSON字符串存储查询和更新部分字段非常低效需要反序列化-修改-再序列化。RedisJSON引入了原生JSON支持。场景存储用户Profile信息。# 1. 直接存储一个JSON文档 127.0.0.1:6379 JSON.SET user:1000 $ {name:Alice,age:30,email:aliceexample.com,address:{city:Shanghai,zip:200000},tags:[engineer,redis]} OK # 2. 点符号获取整个文档或特定字段 127.0.0.1:6379 JSON.GET user:1000 {\name\:\Alice\,\age\:30,\email\:\aliceexample.com\,\address\:{\city\:\Shanghai\,\zip\:\200000\},\tags\:[\engineer\,\redis\]} 127.0.0.1:6379 JSON.GET user:1000 .name \Alice\ 127.0.0.1:6379 JSON.GET user:1000 .address.city \Shanghai\ # 3. 原子性地更新特定字段无需读取整个文档 127.0.0.1:6379 JSON.SET user:1000 .age 31 OK 127.0.0.1:6379 JSON.ARRAPPEND user:1000 .tags developer (integer) 3 # 返回更新后数组的长度 # 4. 数字运算 127.0.0.1:6379 JSON.NUMINCRBY user:1000 .age 1 32实操心得JSON.SET的路径参数$表示文档根目录。对于嵌套字段使用点符号.访问如.address.city。数组操作有专门的命令如JSON.ARRAPPEND,JSON.ARRINSERT等非常方便。这极大地简化了缓存用户会话、商品详情等半结构化数据的逻辑。4.2 RedisSearch全文检索与二级索引这是我认为最强大的模块之一。它让Redis具备了像Elasticsearch那样的全文搜索和复杂查询能力但延迟是亚毫秒级的。场景为博客文章建立搜索索引。# 1. 创建一个索引定义schema模式 127.0.0.1:6379 FT.CREATE blogIdx ON JSON PREFIX 1 post: SCHEMA $.title AS title TEXT $.content AS content TEXT $.author AS author TAG $.created_at AS created_at NUMERIC SORTABLE OK这条命令创建了一个名为blogIdx的索引作用于所有以post:为前缀的JSON键。它从JSON文档中提取字段title和content作为可全文搜索的TEXT类型author作为可精确过滤的TAG类型created_at作为可排序的NUMERIC类型。# 2. 添加几篇博客文章JSON文档 127.0.0.1:6379 JSON.SET post:1 $ {title:Getting Started with Redis Stack,content:This is a tutorial about Redis Stack...,author:alice,created_at:1698765432} OK 127.0.0.1:6379 JSON.SET post:2 $ {title:Advanced Search Patterns,content:Deep dive into FT.SEARCH queries...,author:bob,created_at:1698770000} OK # 索引会自动更新无需手动操作 # 3. 执行搜索 # 3.1 简单全文搜索 127.0.0.1:6379 FT.SEARCH blogIdx tutorial 1) (integer) 1 # 匹配到的文档数量 2) post:1 # 键名 3) 1) $ 2) {\title\:\Getting Started with Redis Stack\,\content\:\This is a tutorial about Redis Stack...\,\author\:\alice\,\created_at\:1698765432} # 3.2 带过滤条件的搜索作者是alice且内容包含Redis 127.0.0.1:6379 FT.SEARCH blogIdx author:{alice} content:redis 1) (integer) 1 2) post:1 ... # 3.3 范围查询与排序创建时间在某个范围按时间倒序 127.0.0.1:6379 FT.SEARCH blogIdx created_at:[1698760000 1698780000] SORTBY created_at DESC 1) (integer) 2 2) post:2 3) 1) $ 2) {\title\:\Advanced Search Patterns\,\content\:\Deep dive into FT.SEARCH queries...\,\author\:\bob\,\created_at\:1698770000} 4) post:1 ...避坑经验创建索引时PREFIX参数至关重要它定义了索引覆盖的键范围。如果漏掉或写错数据将不会被索引。另外对于TAG类型字段查询时值需要用花括号{}包裹且默认是精确匹配。RedisSearch还支持拼音搜索、同义词、停用词等高级特性对于中文搜索需要额外配置分词器如 Friso 或 Jieba但这通常需要从源码编译时加入支持是进阶话题。4.3 RedisTimeSeries高效处理时间序列数据专门为监控指标、物联网传感器数据、应用程序事件等时间序列场景优化。相比用Sorted Set或List来存时间戳-值对它提供了更专业的压缩算法、聚合查询和过期策略。场景记录服务器的CPU使用率。# 1. 创建一个时间序列 127.0.0.1:6379 TS.CREATE cpu_usage LABELS metric cpu host server-01 OK # 这里添加了标签LABELS便于后续按维度查询和聚合。 # 2. 添加数据点时间戳-值。时间戳可以自动生成*也可以指定毫秒级。 127.0.0.1:6379 TS.ADD cpu_usage * 45.6 (integer) 1698765432000 # 返回自动生成的时间戳 127.0.0.1:6379 TS.ADD cpu_usage 1698765433000 48.2 (integer) 1698765433000 # 3. 范围查询 127.0.0.1:6379 TS.RANGE cpu_usage 1698765432000 1698765433000 1) 1) (integer) 1698765432000 2) 45.6 2) 1) (integer) 1698765433000 2) 48.2 # 4. 聚合查询例如查询最近1小时的数据每5分钟计算一个平均值 127.0.0.1:6379 TS.RANGE cpu_usage 1698765432000 1698765433000 AGGREGATION avg 300000 1) 1) (integer) 1698765432000 2) 46.9 # 这是45.6和48.2在5分钟窗口内的平均值示例核心优势内存效率极高支持降采样downsampling自动过期通过RETENTION参数设置并且与Grafana等监控工具有原生集成。对于需要实时查询历史趋势的场景比如“显示过去24小时API的99分位响应时间”RedisTimeSeries比直接往Redis里塞数据要专业和高效得多。4.4 RedisBloom概率数据结构解决大数据难题Bloom Filter布隆过滤器是一种空间效率极高的概率数据结构用于判断一个元素是否可能在一个集合中或者肯定不在集合中。它存在一定的误判率False Positive但绝不会漏判False Negative。RedisBloom模块提供了布隆过滤器、布谷鸟过滤器等数据结构。场景防止缓存穿透频繁查询一个不存在的数据导致请求直接打到数据库。# 1. 创建一个布隆过滤器指定初始容量和错误率 127.0.0.1:6379 BF.RESERVE recent_users 0.01 1000000 OK # 参数过滤器名错误率1%初始容量100万。错误率越低所需空间越大。 # 2. 将已存在的用户ID添加到过滤器中例如从数据库加载热门用户 127.0.0.1:6379 BF.ADD recent_users user123 (integer) 1 127.0.0.1:6379 BF.ADD recent_users user456 (integer) 1 # 3. 查询一个用户是否存在 127.0.0.1:6379 BF.EXISTS recent_users user123 (integer) 1 # 1表示“可能存在” 127.0.0.1:6379 BF.EXISTS recent_users user999 (integer) 0 # 0表示“肯定不存在” # 4. 批量添加和检查 127.0.0.1:6379 BF.MADD recent_users user789 user101112 1) (integer) 1 2) (integer) 1应用逻辑当收到查询请求userXYZ时先到布隆过滤器BF.EXISTS。如果返回0可以确定数据库中不存在此用户直接返回“未找到”无需查询数据库和缓存完美解决缓存穿透。如果返回1则可能存在此时再去查询缓存或数据库。即使有1%的误判也只是导致一次不必要的缓存/数据库查询而不会引起系统雪崩。注意事项布隆过滤器一旦创建其容量和错误率是固定的。如果实际元素数量远超初始容量误判率会急剧上升。因此预估容量时要留足余量。对于持续增长的数据集可以考虑使用可伸缩布隆过滤器BF.SCAND或定期重建过滤器。5. 生产环境配置、安全与监控指南让Redis Stack在开发环境跑起来只是第一步让它稳定、安全、高效地服务于生产环境才是真正的挑战。这部分内容往往是新手最容易忽略也最容易踩坑的地方。5.1 安全配置筑起第一道防线一个暴露在公网且没有密码的Redis服务器是黑客最爱的靶子之一。安全配置必须做且要做对。设置强密码这是最基本的要求。在配置文件redis-stack.conf中修改或添加requirepass YourSuperStrongPassword123!重启服务生效。之后所有客户端连接都需要使用AUTH命令或连接时提供密码。禁用危险命令一些命令如FLUSHALL清空所有数据、CONFIG修改配置在生产环境是极度危险的。可以通过重命名来禁用它们rename-command FLUSHALL rename-command CONFIG 这样即使攻击者获得了访问权限也无法执行这些破坏性操作。你也可以将它们重命名为一个复杂的、只有管理员知道的字符串而不是直接禁用。启用保护模式并绑定网络确保配置中包含protected-mode yes bind 127.0.0.1 # 或者绑定到特定的内部网络IP而非0.0.0.0protected-mode是Redis的一个安全网当没有设置密码且绑定在所有接口时它只接受本地回环连接。但绝不能依赖于此正确的做法是设置密码并严格限制bind地址。使用ACL进行更细粒度控制Redis 6.0ACL提供了用户级别的权限管理比单一密码强大得多。# 创建一个只能读特定键前缀的用户 127.0.0.1:6379 ACL SETUSER appuser on appuser_password ~app:* read OK这条命令创建了一个用户appuser密码为appuser_password只允许访问以app:开头的键并且只拥有读命令的权限。这符合最小权限原则。5.2 持久化策略在性能与可靠性间权衡Redis提供了RDB和AOF两种持久化机制理解它们的区别并合理配置至关重要。RDB快照在指定时间间隔内生成数据集的时间点快照。文件紧凑恢复速度快。但会丢失最后一次快照之后的所有数据。save 900 1 # 900秒内至少有1个key被更改则触发保存 save 300 10 # 300秒内至少有10个key被更改 save 60 10000 # 60秒内至少有10000个key被更改 dbfilename dump.rdb dir /var/lib/redisAOF追加文件记录每一个写操作命令以日志形式追加到文件末尾。数据安全性更高默认每秒同步一次appendfsync everysec最多丢失一秒数据。但文件通常比RDB大恢复速度慢。appendonly yes appendfilename appendonly.aof appendfsync everysec我的生产环境配置建议两者同时启用appendonly yes并配置合理的save规则。这样可以利用RDB快速恢复大部分数据再用AOF日志重放最近的操作兼顾速度和安全性。监控磁盘空间AOF文件会不断增长即使有重写机制。确保dir指向的目录有充足空间并设置监控告警。备份备份备份将RDB和AOF文件定期备份到异地如云存储。可以结合cron任务和SCP或rsync来实现自动化备份。5.3 内存管理与性能优化Redis是内存数据库内存管理是性能的核心。必须设置maxmemory如前所述这是防止系统崩溃的底线。根据系统总内存和应用需求设定例如留出20%给系统和其他进程。maxmemory 8gb选择合适的淘汰策略当内存达到maxmemory时根据maxmemory-policy决定如何淘汰数据。volatile-lru从已设置过期时间的键中淘汰最近最少使用的。allkeys-lru从所有键中淘汰最近最少使用的。这是最通用的策略。volatile-ttl淘汰剩余生存时间最短的键。noeviction不淘汰返回错误。适用于数据绝对不能丢失的场景但要求应用能妥善处理写错误。 根据你的数据特性选择。如果所有数据都有过期时间用volatile-*策略如果数据都有长期价值用allkeys-lru。监控慢查询使用SLOWLOG命令或RedisInsight的Slow Log面板来发现潜在的性能瓶颈。slowlog-log-slower-than 10000 # 单位微秒记录执行超过10毫秒的命令 slowlog-max-len 128 # 最多记录多少条慢日志定期检查慢日志优化那些耗时的命令或数据结构设计。合理使用Pipeline和连接池减少网络往返次数。对于批量操作使用Pipeline将多个命令打包一次发送。在客户端使用连接池避免频繁创建和销毁连接的开销。5.4 监控与告警让问题可视化“没有监控的系统就是在裸奔。” 对于Redis Stack除了基础的服务器监控CPU、内存、磁盘、网络还需要专门的Redis监控。Redis INFO命令这是最丰富的信息源。通过INFO all或INFO下的各个子部分如INFO memory,INFO stats,INFO replication可以获取几乎所有运行时指标。很多监控系统如Prometheus的Redis Exporter就是通过定期执行INFO命令来采集数据的。Prometheus Grafana这是当前最流行的监控组合。部署redis_exporter它会将Redis的INFO指标转换为Prometheus格式。在Prometheus配置中抓取redis_exporter的指标。在Grafana中导入现成的Redis监控仪表盘如ID 763你就能看到实时的命中率、内存使用、连接数、命令吞吐量、慢查询等关键图表。关键告警项内存使用率持续高于maxmemory的90%。连接数异常飙升可能意味着连接泄漏或攻击。命中率Keyspace命中率持续低于90%可能需要优化缓存策略或扩容。阻塞客户端数量长时间有阻塞客户端可能发生了慢查询或大Key操作。主从复制状态如果使用了主从监控复制延迟master_repl_offset与slave_repl_offset的差值。6. 从单机到高可用复制与哨兵模式入门单点部署有宕机风险。对于要求高可用的生产环境至少需要配置主从复制Replication。Redis通过简单的配置就能实现数据的异步复制。6.1 主从复制配置假设我们有两台服务器server-a(IP: 192.168.1.10) 作为主节点server-b(IP: 192.168.1.11) 作为从节点。在从节点server-b的配置文件redis-stack.conf中只需添加一行replicaof 192.168.1.10 6379 # 如果主节点有密码还需要添加 masterauth YourMasterPassword重启从节点的Redis服务。从节点会连接主节点进行全量数据同步RDB传输然后持续同步新的写命令。验证复制状态在主节点或从节点执行127.0.0.1:6379 INFO replication # Replication role:master # 在主节点上显示为master connected_slaves:1 slave0:ip192.168.1.11,port6379,stateonline,offset...,lag0 ... # 在从节点上显示为slave role:slave master_host:192.168.1.10 master_port:6379 master_link_status:up ...看到master_link_status:up和stateonline说明复制链路正常。从节点默认是只读的所有写操作必须发送到主节点。6.2 使用Redis Sentinel实现自动故障转移主从复制解决了数据备份和读扩展的问题但没有解决主节点自动故障转移。Redis Sentinel哨兵是一个分布式系统用于监控主从实例并在主节点故障时自动将一个从节点提升为新的主节点并让其他从节点指向新的主节点。部署Sentinel至少3个实例以形成多数派决策Sentinel实际上是一个特殊的Redis进程使用不同的配置文件如sentinel.conf。一个基本的sentinel.conf配置如下port 26379 # Sentinel默认端口 daemonize yes logfile /var/log/redis/sentinel.log # 监控名为 mymaster 的主节点2表示至少需要2个Sentinel同意才判定客观下线 sentinel monitor mymaster 192.168.1.10 6379 2 # 主节点密码 sentinel auth-pass mymaster YourMasterPassword # 故障转移超时时间毫秒 sentinel down-after-milliseconds mymaster 5000 # 故障转移时允许有多少个从节点同时对新主节点进行同步 sentinel parallel-syncs mymaster 1 # 故障转移超时时间 sentinel failover-timeout mymaster 180000在三个独立的服务器或容器中启动Sentinel进程redis-sentinel /path/to/sentinel.conf # 或 redis-server /path/to/sentinel.conf --sentinel工作原理每个Sentinel会定期向主节点、从节点以及其他Sentinel发送PING命令。如果主节点在down-after-milliseconds时间内没有有效回复该Sentinel会将其标记为“主观下线”。当足够数量quorum本例中为2的Sentinel都认为主节点主观下线则主节点被标记为“客观下线”。Sentinel集群会通过Raft算法选举出一个领导者Sentinel来执行故障转移。领导者Sentinel会选择一个合适的从节点通常数据最全、优先级高将其提升为新的主节点。通过发布订阅通知其他从节点和客户端关于新的主节点的信息。客户端集成支持Sentinel的客户端如Jedis、Lettuce、redis-py可以通过连接Sentinel节点来获取当前的主节点地址从而实现自动重连到新的主节点。这是实现高可用应用的关键。对于更复杂的场景如大规模数据分片和线性扩展则需要使用Redis Cluster。但Sentinel模式已经能满足大多数中小规模应用的高可用需求且配置和理解起来相对简单。部署完成后你可以通过redis-cli连接Sentinel端口使用SENTINEL masters、SENTINEL slaves mymaster等命令来查看监控状态。