Nexus仓库迁移
下文主要介绍Nexus仓库迁移过程中遇到的一些问题和总结
需求描述: 需要将源主机的Nexus服务以及相关数据信息,迁移至目标主机,数据迁移完成测试验证后,切换域名,完成迁移.
环境介绍
源主机 | 目标主机 | 域名 | Nexus版本 |
---|---|---|---|
10.80.42.138 | 10.14.46.12 | repo.wecash.asia | 3.8.0 |
迁移步骤
- 在主机B生成一对私钥,同时将公钥添加到主机A上,配置免密登录;
- 在主机B安装Maven环境;
- Rsync增量方式同步数据
- 数据同步完成后,启动Nexus服务,本地写host绑定域名方式,进行验证;
- 验证通过后,切换域名,完全迁移;
⚠️: 强烈建议迁移时候,两台主机的Nexus数据及服务目录保持完全一致,仓库版本保持一致;
环境准备
- 安装JDK(略)
- 安装Maven
Maven – Welcome to Apache Maven安装配置参考: Maven – Users Centre1
2
3
4# cd /usr/local/src
# wget https://www-us.apache.org/dist/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
# tar -zxvf apache-maven-3.6.0-bin.tar.gz -C /data/services/
# cd /data/services/ && mv apache-maven-3.6.0 maven-3.6
配置环境变量:1
2
3export MAVEN_OPTS="-Xms1g -Xmx1g"
export MAVEN_HOME="/data/services/maven-3.6"
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH - Nexus安装
- 下载
Download Repository OSS - Nexus启动脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# cat /etc/systemd/system/nexus.service
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/data/services/nexus-8081/bin/nexus start
ExecStop=/data/services/nexus-8081/bin/nexus stop
User=nexus
Restart=on-abort
[Install]
WantedBy=multi-user.target - Nginx代理Nexus仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# cat /etc/nginx/conf.d/repo.wecash.asia-80.conf
server {
listen 80;
server_name repo.wecash.asia;
charset utf-8;
access_log /data/logs/nginx/repo.wecash.asia.access.log main;
error_log /data/logs/nginx/repo.wecash.asia.error.log warn;
# allow large uploads of files
client_max_body_size 1G;
# optimize downloading files larger than 1G
#proxy_max_temp_file_size 2G;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}迁移数据
1
# nohup rsync -vuazrtpP --progress --delete --exclude="blobs/docker-registry-sea" -e 'ssh' root@10.80.42.138:/data/nexus3data/nexus3/ /data/nexus3data/nexus3/ > /tmp/rsync.log 2>&1 &
Q&A
在同步完成Blob数据后,启动Nexus服务,在使用仓库构建包的时候存在包的Meta-data信息更新或获取失败问题,导致return的code为500问题,client返回的错误信息如下所示:1
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project indonesia-customer-center-biz-api: Failed to retrieve remote metadata net.wecash:indonesia-customer-center-biz-api:1.0-SNAPSHOT/maven-metadata.xml: Could not transfer metadata net.wecash:indonesia-customer-center-biz-api:1.0-SNAPSHOT/maven-metadata.xml from/to nexus-snapshots (http://repo.wecash.asia/repository/maven-snapshots/): Failed to transfer file: http://repo.wecash.asia/repository/maven-snapshots/net/wecash/indonesia-customer-center-biz-api/1.0-SNAPSHOT/maven-metadata.xml. Return code is: 500 , ReasonPhrase:javax.servlet.ServletException: org.sonatype.nexus.repository.storage.RetryDeniedException: Reached max retries: 8/8. -> [Help 1]
- 迁移后源主机与目标主机路径不一致
同步Blob数据至迁移后的主机B,通过修改Nexus配置文件中的karaf.data参数指定数据目录1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# cd /data/services/nexus-3.8/bin
# cat nexus.vmoptions
-Xms2G
-Xmx2G
-XX:MaxDirectMemorySize=2G
-XX:+UnlockDiagnosticVMOptions
-XX:+UnsyncloadClass
-XX:+LogVMOutput
-XX:LogFile=/data/nexus/logs/nexus.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=/data/nexus/nexus-data
-Djava.io.tmpdir=/data/nexus/tmp
-Dkaraf.startLocalConsole=false - 尝试解决方法一
此时,server段会存在一些异常log,如果log中出现soft-deleted关键字,需要将对应Blob下vol下的*.properties文件中的delete=true标示删除,如果需要Deploy的包比较多,此时,手动操作就会比较繁琐且容易出错,思考,尝试从全局来修复该问题,初步使用Compact的Task来进行修复Repository Management,并没有什么意义,问题依然存在… - 尝试解决方法二
通过OrientDB Console尝试修改repository_blobstore表中对应的Blob的path信息,修改为绝对路径,默认表中存储的信息为karaf.data路径的相对路径,此方法依然无效…
Relocating Blob Stores – Sonatype Support - 终极解决方法
全量同步$data-dir or ${karaf.data}下的所有文件至新机器以及nexus源码安装文件至新机器,强烈建议文件存放的目录结构保持一致,增量完全同步完成之后,修改环境变量和权限,启动服务,进行验证;
- 官方迁移指导
Moving a Nexus Repo 3 Installation to a New Location – Sonatype Support
扩展
- 一般在迁移完成后需要创建Task任务,重建repo的Index和MetaData信息
- Nexus仓库的元数据和配置信息存储在OrientDB(文件类型数据库)中
- Nexus仓库的索引信息存储在内置的elasticsearch中
- 如果在Nexus日志中查看到有关elasticsearch的Index错误信息,删除${karaf.data}参数对应目录下的elasticsearch目录,重新同步数据即可
Maven配置文件
Nexus仓库Maven配置文件settings.xml参数介绍
1 | cat settings.xml |
Maven基本命令
1 | # 构建 |