1. 博客/

记录一次 Nexus3 Pypi 私服 Blob Storage 异常的修复

·1234 字·3 分钟· ·
devops neuxs3 fix pypi jenkins pipeline
Johny
作者
Johny
熟练的 云原生搬砖师
Table of Contents

说明
#

在 devops 集成环境中的 测试环境 中,今天发现有几条 pipeline 一直是在构建超时状态。初步查看了一下,以为是哪个 依赖版本的兼容性有些问题, 导致 pip 一直是找不到合适的版本,和开发一起进行了一次排查,在 开发环境上即正常,测试环境就不行了,而且使用的是同一套代码 和 Dockerfile 文件,排除与版本有关,具体错误表现如下图所示:

image-20210721170700491

滚动的检查 nexus3 私服日志

docker logs  -f --tail 100 nexus3

image-20210721171037634

image-20210721171052792

去对应的 blob 看对应的文件内容也是空的,初步结合日志得出,是 blobstorage 的对应的 存储数据 丢失导致。

修复过程
#

尝试修复方法 (一)
#

尝试对数据库进行重建索引看看,看是否能修复成功。( 内部 nexus3 使用的是一个叫做 orientdb 的数据库,相关的 文档 查看。)

docker exec -it nexus3 bash

cd /nexus-data

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

# U/P: 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 的数据进行备份,将老的数据删除,然后基于备份好的数据进行恢复。

创建 备份数据 task 任务

image-20210721172844252

选择 备份导出数据库

image-20210721172857718

设置备份任务

image-20210721173128605

启动备份任务

image-20210721173158292

等待任务执行 成功

image-20210722160039770

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

尝试修复方法 (三)
#

此方法为: 尝试创建 task 任务 进行一个 blob storage 存储的 元数据修复 工作

选择创建 修复 blob 元数据 task

image-20210722160512127

选择需要修复的 blob storage

image-20210722160931972

等待 task 任务的执行完毕

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

docker exec -it nexus3 bash

cd /nexus-data

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

# U/P: 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 问题
#

新建 重建私服的 浏览 & 搜索 task

创建相关 task

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

# U/P: 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

# U/P: 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 包依赖了。

参考链接
#

https://community.sonatype.com/t/unable-to-reach-metadata-file-instead-get-http-404-nof-found-error/5357

https://issues.sonatype.org/browse/NEXUS-21814?jql=text%20~%20%22AssetCreatedEvent%22

https://orientdb.com/docs/last/index.html?q=delete

总结
#

在经过此次事件后,感觉 nexus3 的 bug 还是非常多的,建议生产使用的版本,是使用社区反响较好的 bug 较少的版本。此次事件其实我在一年前的时候也是有碰到过,不过当时的解决的方式用的不是这一种,使用的方式是是 创建新的 blob 存储,而将有问题的 blog 私服进行迁移,这种方式比较简单,但是如果你 有很多个私服 并多使用在 一个 blob 存储上时,数据需要重新上传,迁移起来就比较麻烦和繁琐了。建议是 对 不同环境不同类型 私服设置不同的 blob storage 来分散风险。

相关文章

记录一次 JupyterLab 插件打包问题的修复
·1485 字·3 分钟·
k8s devops jupyterlab jenkins
Docker-Compose 部署 Nexus3 Docker 私服,配置使用 Traefik 进行代理管理
·1228 字·3 分钟·
devops docker-compose proxy neuxs3 traefik mkcert https
Centos 7 Yum 安装 Jenkins 及常用配置的说明
·1419 字·3 分钟·
devops jenkins ci-cd install
Rancher 开启监控后,exporter/metrics 的添加说明 (二)
·2662 字·6 分钟·
devops k8s prometheus rancher prometheus operator k8s kubekey exporter metrics
Rancher 开启监控,及生产应用的优化配置工作说明 (一)
·2785 字·6 分钟·
devops k8s prometheus rancher prometheus operator k8s kubekey exporter
Gitlab 和 jira 之间的集成
·257 字·1 分钟·
devops jira gitlab