Nexus 迁移指南:3.69.0 到 3.76.0(Alauda Build of Nexus Operator 版本 v3.76.z)
目录
Overview
本文档提供了从 Nexus Repository Manager 版本 3.69.0 升级到 3.76.0 的详细迁移步骤。由于 Nexus 在 3.70 版本后停止支持 OrientDB,需进行手动数据迁移。
Prerequisites
Migration Process
1. 数据备份
创建备份目录(确保本地磁盘空间充足):
设置环境变量:
export INSTANCE_NAME=<nexus 实例名称>
export INSTANCE_NAMESPACE=<nexus 实例命名空间>
export POD_NAME=$(kubectl -n ${INSTANCE_NAMESPACE} get pod -l release=${INSTANCE_NAME} | grep ${INSTANCE_NAME} | awk '{print $1}')
1.1 服务关闭
删除前需先卸载旧版本 operator,否则删除后服务会被自动重建。
kubectl -n ${INSTANCE_NAMESPACE} delete service -l release=${INSTANCE_NAME}
1.2 备份 Blob 存储
mkdir -p nexus-backup/blobs
kubectl -n ${INSTANCE_NAMESPACE} cp ${POD_NAME}:/nexus-data/blobs nexus-backup/blobs
1.3 数据库备份
- 进入:Admin Dashboard > System > Tasks
- 创建新任务:
- 类型:Admin - Export databases for backup
- 任务名称:[自定义]
- 备份位置:[指定路径] - 目录路径必须在 Nexus 数据卷目录内
- 频率:手动
- 执行任务并确认完成状态
2. 数据库迁移
2.1 OrientDB 到 H2 转换
设置环境变量:
export INSTANCE_NAME=<旧 nexus 实例名称>
export INSTANCE_NAMESPACE=<旧 nexus 实例命名空间>
export POD_NAME=$(kubectl -n ${INSTANCE_NAMESPACE} get pod -l release=${INSTANCE_NAME} | grep ${INSTANCE_NAME} | awk '{print $1}')
进入容器并下载迁移工具:
kubectl -n ${INSTANCE_NAMESPACE} exec -it ${POD_NAME} -- bash
cd /nexus-data/backup
wget https://download.sonatype.com/nexus/nxrm3-migrator/nexus-db-migrator-3.70.3-01.jar -O nexus-db-migrator.jar
若无法直接网络下载,可先本地下载后复制至容器:
kubectl -n ${INSTANCE_NAMESPACE} cp nexus-db-migrator.jar ${POD_NAME}:/nexus-data/backup
执行迁移:
# 迁移完成后,backup 目录下会生成 nexus.mv.db 文件
java -Xmx16G -Xms16G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator.jar --migration_type=h2
备份转换后的数据库:
kubectl -n ${INSTANCE_NAMESPACE} cp ${POD_NAME}:/nexus-data/backup/nexus.mv.db nexus-backup/nexus.mv.db
3. 新实例部署
由于数据和存储均从原实例导入,部署新实例时只需保持与原实例相同的访问方式。
注意: 使用与旧版本相同的 NodePort 和 Ingress 配置会导致冲突,无法创建。请配置新的值,迁移成功后删除旧实例,再修改对外暴露配置。
3.1 配置选项
NodePort 访问示例:
helmValues:
service:
nexus:
enabled: true
nodePort: <端口>
HTTP ingress 示例:
service:
nexus:
enabled: true
type: ClusterIP
ingress:
enabled: true
host: <域名>
defaultRule: true
HTTPS ingress 示例:
helmValues:
service:
nexus:
enabled: true
type: ClusterIP
ingress:
enabled: true
host: <域名>
defaultRule: true
tls:
- secretName: <tls-secret>
hosts:
- <域名>
3.2 数据导入
设置新实例变量:
export INSTANCE_NAME=<新 nexus 实例名称>
export INSTANCE_NAMESPACE=<新 nexus 实例命名空间>
export POD_NAME=$(kubectl -n ${INSTANCE_NAMESPACE} get pod -l app.kubernetes.io/instance=${INSTANCE_NAME} | grep ${INSTANCE_NAME} | awk '{print $1}')
清理现有数据(新数据卷为空时可跳过):
kubectl -n ${INSTANCE_NAMESPACE} exec -it ${POD_NAME} -- rm -rf /nexus-data/blobs /nexus-data/db/nexus.mv.db
导入备份数据:
kubectl -n ${INSTANCE_NAMESPACE} cp nexus-backup/blobs ${POD_NAME}:/nexus-data
kubectl -n ${INSTANCE_NAMESPACE} cp nexus-backup/nexus.mv.db ${POD_NAME}:/nexus-data/db
然后重启 Nexus Pod。
4. 验证步骤
-
检查 Pod 状态:
kubectl -n ${INSTANCE_NAMESPACE} get pods -l app.kubernetes.io/instance=${INSTANCE_NAME}
-
验证清单:
-
迁移后清理:
- 验证成功后删除旧实例(需重新安装旧版本 operator 以完成旧实例资源清理)
- 按保留策略归档备份数据