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. 数据备份

创建备份目录(确保本地磁盘空间充足):

mkdir -p nexus-backup

设置环境变量:

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 数据库备份

  1. 进入:Admin Dashboard > System > Tasks
  2. 创建新任务:
    • 类型:Admin - Export databases for backup
    • 任务名称:[自定义]
    • 备份位置:[指定路径] - 目录路径必须在 Nexus 数据卷目录内
    • 频率:手动
  3. 执行任务并确认完成状态

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. 验证步骤

  1. 检查 Pod 状态:

    kubectl -n ${INSTANCE_NAMESPACE} get pods -l app.kubernetes.io/instance=${INSTANCE_NAME}
  2. 验证清单:

    • Web UI 可访问
    • 仓库可见
    • 构件上传功能
    • 构件下载功能
    • 用户认证
    • 仓库权限
  3. 迁移后清理:

    • 验证成功后删除旧实例(需重新安装旧版本 operator 以完成旧实例资源清理)
    • 按保留策略归档备份数据