上线第一天,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裸奔

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

相关推荐
清秋冷雨2 小时前
Harness Engineer系列(三):Harness工程化——AI编程的最后一里地
后端
Csvn2 小时前
itertools —— Python 最强迭代器工具箱实战
后端
冰暮流星2 小时前
flask之定义URL
后端·python·flask
程序员爱钓鱼3 小时前
为什么学习 Rust?Rust 能做什么?
后端·rust
二宝哥4 小时前
创建Gradle多模块SpringBoot项目
java·spring boot·后端
掘金者阿豪4 小时前
Docker命令太多记不住?用Portainer把容器管理变成可视化操作
后端
用户69371750013844 小时前
AI Agent 里的 Loop 到底是什么?
android·前端·后端
Rain的Java大神之路4 小时前
高并发下的抢优惠券如何设计
后端
钟智强4 小时前
AWS CloudGoat 实战:一个 SSRF 如何撬动整个云账户
后端