上线第一天,Redis和Docker联手给我上了一课

本地跑得好好的,一上生产两个坑同时炸了。一个藏在RediSearch的设计约束里,一个是Docker部署的老问题。

背景

我的AI简历优化工具用的是Spring AI + Redis Stack做向量存储和语义搜索。

本地开发环境跑了快一个月,向量检索、模板加载、简历解析都正常。心想功能差不多了,准备Docker打包上生产。

我本地就是用docker compose部署的,我以为直接把docker-compose.yml复制上去改改密码和路径就ok了。

结果刚部署就连续踩了两个坑,排查+修复花了大半天。


第一个坑:换向量模型后想切Redis数据库,结果索引建不了

事情起因

开发中途我换了一次embedding模型。老模型的向量维度和新模型不一样,直接替换的话,旧的向量数据和新模型生成的向量维度对不上,搜索的时候会出问题。

我想着:干脆换个Redis数据库(比如从db 0切到db 1)来隔离新旧数据,这样旧数据不受影响,新模型从db 1重新开始。

改完配置,重启应用,新数据正常写入了。

翻车

但当我重新加载简历模板的时候,直接报错了------RediSearch不让我在非0号数据库上创建索引。

这个限制我之前完全不知道。

排查

查了一圈才发现,RediSearch对数据库的选择是有硬性要求的:索引必须在db 0上创建。这不是配置问题,是RediSearch本身的设计约束。

所以切数据库这条路从一开始就走不通。

最终解法

老老实实回到db 0,改用新索引前缀来隔离新旧数据:

代码层面加个版本标记,加载新模型时自动切到新前缀,搜索时只查新前缀的数据。旧数据保留在db 0里不删,需要回退的时候改个配置就行。

教训

  • 换向量模型 ≠ 换个数据库就行。RediSearch的索引对数据库有要求,不能想当然。
  • 更稳妥的做法是用索引前缀做版本隔离,而不是依赖Redis的db号。
  • 如果项目里用了RediSearch,建议提前确认索引创建对数据库的约束,别等到上线才发现。

第二个坑:Docker部署后数据库报权限错误

事情起因

第一个坑修完,满心欢喜docker-compose up。

结果应用容器起来后,连数据库直接报权限错误。日志里显示类似 root@172.x.x.x 被拒绝访问。

排查

本地开发一直用root账号直连,没遇到过这问题。但Docker环境不一样------容器的网络走的是Docker bridge网络,出口IP是 172.x.x.x 段,和本地localhost完全是两回事。

root账号的权限只给了localhost,Docker容器的IP不在白名单里,自然连不上。

解法

给应用创建一个专用的数据库账号:

sql 复制代码
CREATE USER 'resumeai'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON resume_ai.* TO 'resumeai'@'%';
FLUSH PRIVILEGES;

然后把Docker部署配置里的连接信息改成这个新账号。

resume@% 里的 % 是通配符,表示允许从任意IP连接。这样不管Docker容器分配到哪个IP,都能正常访问。

教训

  • 本地用root直连没问题,Docker里大概率会翻车。Docker的网络环境和localhost不是一回事。
  • 生产环境本来就不该用root连数据库,专用账号 + 最小权限是基本功。
  • 建议从一开始就配置专用账号,别等到部署时才发现。

两个坑串起来的反思

回头看,这两个坑有一个共同点:都是"本地好好的,上生产就翻车"的典型。

第一个坑的根源是我对RediSearch的索引机制理解不够深,以为换个db号就能隔离数据。实际上RediSearch的设计约束在开发文档里写了,只是我没仔细看。

第二个坑更经典------Docker网络环境和本地不一样,这在容器化部署里几乎是必踩的坑。以前用Docker部署其他项目也遇到过类似的问题,但每次都会忘,所以这次记下来。

如果你也在用Spring AI + Redis Stack做向量检索,两个建议:

  1. 换向量模型时,优先用key前缀做版本隔离,别依赖Redis db号
  2. 数据库从一开始就用专用账号,别用root裸奔

你上线部署的时候踩过什么"本地好好的"坑?评论区聊聊 👇

相关推荐
余槐i7 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF10 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala11 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna11 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈11 小时前
因为太想讨好你,所以AI会骗你
后端
吴凡wudianmei11 小时前
每调一次模型都花钱?如何用工程手段把调用压到最少?
前端·后端·架构