本地跑得好好的,一上生产两个坑同时炸了。一个藏在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做向量检索,两个建议:
- 换向量模型时,优先用key前缀做版本隔离,别依赖Redis db号
- 数据库从一开始就用专用账号,别用root裸奔
你上线部署的时候踩过什么"本地好好的"坑?评论区聊聊 👇