跳过正文
  1. 博客文章/

Nexus3 PyPI 私服 Blob Storage 异常修复记录

·260 字·2 分钟·
DevOps Nexus3 Fix Pypi Jenkins Pipeline
Zayn
作者
Zayn
专注 Kubernetes、CI/CD、可观测性等云原生技术栈,记录生产环境中的实战经验与踩坑复盘。
目录

问题描述
#

在 DevOps 集成环境的测试环境中,发现多条 Pipeline 持续处于构建超时状态。初步排查以为是依赖版本兼容性问题导致 pip 无法找到合适版本,与开发团队联合排查后发现:开发环境正常,测试环境异常,且使用相同的代码和 Dockerfile 文件,排除了版本相关问题。具体错误表现如下:

image-20210721170700491

检查 Nexus3 私服日志

docker logs -f --tail 100 nexus3

image-20210721171037634

image-20210721171052792

检查对应 blob 中的文件内容发现为空,结合日志分析,初步判断是 blob storage 对应的存储数据丢失导致。

修复过程
#

方法一:重建数据库索引
#

尝试对数据库进行重建索引修复。Nexus3 内部使用 OrientDB 数据库,相关文档可供参考。

docker exec -it nexus3 bash

cd /nexus-data

java -jar /opt/sonatype/nexus/lib/support/nexus-orient-console.jar

# 用户名/密码: admin admin(默认密码)
CONNECT PLOCAL:/nexus-data/db/component/ admin admin
REBUILD INDEX *
REPAIR DATABASE --fix-graph
REPAIR DATABASE --fix-links
REPAIR DATABASE --fix-ridbags
REPAIR DATABASE --fix-bonsai
DISCONNECT

image-20210721172248837

重新触发 Pipeline 测试,问题依然存在,此方法无效。

image-20210721172720110

方法二:备份恢复数据
#

备份 Nexus3 数据,删除旧数据,然后基于备份数据进行恢复。

创建备份数据任务

image-20210721172844252

选择备份导出数据库

image-20210721172857718

设置备份任务

image-20210721173128605

启动备份任务

image-20210721173158292

等待任务执行成功

image-20210722160039770

由于导出过程中被中断,数据无法导出,此方法暂时放弃。

方法三:Blob Storage 元数据修复
#

创建任务对 Blob Storage 存储进行元数据修复。

创建修复 Blob 元数据任务

image-20210722160512127

选择需要修复的 Blob Storage

image-20210722160931972

等待任务执行完毕。

再次执行数据重建索引任务

docker exec -it nexus3 bash

cd /nexus-data

java -jar /opt/sonatype/nexus/lib/support/nexus-orient-console.jar

# 用户名/密码: admin admin(默认密码)
CONNECT PLOCAL:/nexus-data/db/component/ admin admin
REBUILD INDEX *
REPAIR DATABASE --fix-graph
REPAIR DATABASE --fix-links
REPAIR DATABASE --fix-ridbags
REPAIR DATABASE --fix-bonsai
DISCONNECT

重建索引后出现新问题

部分包显示 404 错误。

image-20210722100816785

image-20210722100943816

image-20210722100716967

修复依赖拉取 404 问题
#

创建重建私服浏览和搜索功能的任务。

创建相关任务

image-20210722162439277

选择对所有仓库生效

image-20210722101653481

image-20210722162501026

启动重建任务

image-20210722101719109

等待任务结束

image-20210722101954917

image-20210722162536184

再次启动 Pipeline 测试,仍然报错,开启 TRACE 级别日志查看详情

注意:TRACE 日志级别建议仅在测试时开启,使用后及时关闭,日志内容过多。

image-20210722162741547

image-20210722162807053

image-20210722122658097

从日志中可以看到 Could not dispatch event AssetCreatedEvent 报错。在社区寻找解决方案,暂未找到合适的方法。

继续尝试重建索引

docker exec -it nexus3 bash

cd /nexus-data

java -jar /opt/sonatype/nexus/lib/support/nexus-orient-console.jar

# 用户名/密码: admin admin(默认密码)
CONNECT PLOCAL:/nexus-data/db/component/ admin admin
REBUILD INDEX *

image-20210722140438216

执行重建索引时直接报错,提示发现重复的 key。

执行删除操作,重启系统后将自动完成索引重建

drop class browse_node
DISCONNECT

exit

再次进行数据库重建索引及修复操作

docker exec -it nexus3 bash

cd /nexus-data

java -jar /opt/sonatype/nexus/lib/support/nexus-orient-console.jar

# 用户名/密码: admin admin(默认密码)
CONNECT PLOCAL:/nexus-data/db/component/ admin admin
REBUILD INDEX *
REPAIR DATABASE --fix-graph
REPAIR DATABASE --fix-links
REPAIR DATABASE --fix-ridbags
REPAIR DATABASE --fix-bonsai
DISCONNECT

docker restart nexus3

image-20210722142059307

再次执行时,已不再出现重复 key 的报错。

重启后查看系统日志

image-20210722142718148

从日志中可以看到,Nexus 正在对存储库浏览树进行重建工作,此时已从日志中看出重建完成。

观察后续日志输出无相关错误,尝试触发 Pipeline 测试

image-20210722152904777

可以看到已能正常拉取 PyPI 包依赖。

参考链接
#

总结
#

经过此次事件,发现 Nexus3 的 bug 确实较多,建议生产环境使用社区反响较好、bug 较少的稳定版本。

此类问题我在一年前也遇到过,当时采用的解决方式是创建新的 Blob 存储,将有问题的私服进行迁移。这种方式相对简单,但如果有多个私服共用一个 Blob 存储时,数据需要重新上传,迁移过程会比较麻烦和繁琐。

建议:为不同环境和不同类型的私服设置独立的 Blob Storage,以分散风险。

相关文章

企业级 Jenkins CI/CD 平台部署与配置完整指南
·4484 字·22 分钟
DevOps Jenkins CI/CD Devops Automation Pipeline
记录一次 JupyterLab 插件打包问题的修复
·506 字·3 分钟
Kubernetes DevOps Jupyterlab Jenkins
使用 Docker Compose 部署 Nexus3 Docker 私服并配置 Traefik 代理
·574 字·3 分钟
DevOps Docker Compose 网络 Nexus3 Traefik Mkcert Https