Nexus仓库数据高可用备份与恢复方案(上)
#作者:闫乾苓
文章目录
- 1、要解决的问题
- 2、解决方案
- 方案说明
- 3、方案验证
- 部署nexus pvc
- 部署nexus deployment
- 部署nexus svc
- 查看部署状态
- 访问UI页面
- 创建基于minio 的Blob Store 库
- 准备测试数据
1、要解决的问题
- Nexus使用容器化部署并使用NFS或者HostPath作为数据持久化存储方案时,因NFS/HostPath为非分布式存储解决方案,本身不具备数据高可用存储能力,如何解决其故障发生时业务数据恢复的问题。
- 如何保证nexus运行时其业务数据的高可用性、数据量持续增长的问题。
2、解决方案
架构图
方案说明
- Nexus3服务使用k8s Deployment 部署1副本,通过nodeName选定k8s Node节点。
- Blob Store 通过s3协议使用mimio高可用分布式存储作为底层二进制文件的存储,确保了上传到Nexus中的构件的数据可用性。
- 因为mimio原生不支持文件系统挂载,在不具备Ceph,Glusterfs等分布式环境的情况下,本例将Nexu3 服务的数据目录nexus-data 挂载到通过NFS storageClass 动态绑定的PV中,存储到NFS server. 因NFS原生不具备数据高可用能力,所以这里选择通过cronjob定时备份、Rsync实时同步两种方式进行数据备份,以确保在NFS serve故障引起的数据损坏时有足够的数据恢复能力,后文将详细说明。
3、方案验证
容器化部署nexus
部署nexus pvc
建议使用cephfs等分布式存储,可以确保nexus数据的安全。可省略nexus数据备份的步骤。
本例因不具备cephfs的环境,故使用NFS storageClass 动态绑定pvc作为持久化存储,因NFS不具备数据高可用能力,后文将介绍存储到NFS中的nexus数据如何做备份。
前提:NFS storageClass 已经在k8s环境中部署完成。
nexus-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:labels:name: nexus-pvcnamespace: nexus-2
spec:accessModes:- ReadWriteManyresources:requests:storage: 50GistorageClassName: nfs# kubectl apply -f nexus-svc.yaml
部署nexus deployment
nexus-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:name: devops-nexusnamespace: nexus-2
spec:replicas: 1selector:matchLabels:app: nexustemplate:metadata:labels:app: nexusspec:nodeName: 192.168.123.242#imagePullSecrets:# - name: middleware_namespace-imagepullsecretcontainers:#- image: harbor_url/devops-release/list/sonatype/nexus3:3.41.1- image: 192.168.123.241:20030/nexus/nexus3:3.41.1imagePullPolicy: IfNotPresentname: nexusports:- containerPort: 8081protocol: TCPvolumeMounts:- mountPath: /nexus-dataname: nexus-pvcvolumes:- name: nexus-pvcpersistentVolumeClaim:claimName: nexus-pvckubectl apply -f nexus-deployment.yaml
部署nexus svc
nexus-svc.yaml
apiVersion: v1
kind: Service
metadata:labels:name: devops-nexusnamespace: nexus-2
spec:ports:- port: 8081targetPort: 8081selector:app: nexustype: NodePort# kubectl apply -f nexus-svc.yaml
查看部署状态
访问UI页面
admin账号的密码需要在pv中的admin.password查看
创建基于minio 的Blob Store 库
需要准备:
- minio的API 访问地址(minio默认9000的端口)
- 有权限访问bucket的账号的 Access Key ID和 Secret Access Key
blob store的名称和Bucket的保持一致,Region选us-east-1(使用默认default会报错),expiration day 可以改为-1,表示不清理已删除的blob store。
Authentication (Optional) 填写有权限访问mimio的Access Key ID及Secret Access Key
Endpoint URL填写 mimio的svc的IP和API端口
相关选项都填写完成后,点击 save 进行创建,创建完成后查看如下:
在minio中查看,在nexus中定义的minio-blob-store bucket 已经创建。并且会有数据写入。
创建repositories 库
类型选择:RAW(hosted),或者根据实际需要进行类型选择。
Blob store 选上一步已创建的 “minio-blob-store”,并点击“Create repository” 创建.
创建完成后查看:
上传文件到repo-01仓库进行测试
等待上传完成,会有提示。
查看上传:
查看minio中的bucket,磁盘使用量会增加。
准备测试数据
使用批量上传文件到Nexus 仓库的脚本,上传50个文件,每个文件100MB。
#!/bin/bashFIEL_BASE_NAME="upload_nexus_test_file"
NEXUS_URL="http://169.169.87.101:8081/repository/"
REPO="repo-01"for i in $(seq 1 50)
doecho ------------ $i ---------------------curl -I -u admin:admin.123 --upload-file ${FIEL_BASE_NAME} ${NEXUS_URL}/${REPO}/${FIEL_BASE_NAME}_$iecho
done
minio中查看bucket的数据量(注意,minio webUI界面显示的数据量会有短暂延时。)
为了验证数据的高可用性,再创建1个Blob Store “minio-blob-store-02”,并基于其上创建仓库“repo-02”,同样用脚本批量上传50个100M大小的文件。
因为minio web界面显示Bucket的数据量会有延迟,可以通过mc 命令进行查看。
# curl https://dl.min.io/client/mc/release/linux-amd64/mc > /usr/local/bin/mc
# chmod +x /usr/local/bin/mc# mc alias set minio-server http://169.169.174.183:29000 65WNgqImKSD3c0qX n7iXpeOECUX3u3OOmzGPmS9M7JT4Y2nd
Added `minio-server` successfully.# mc du minio-server/minio-blob-store
6.0GiB 114 objects minio-blob-store# mc du minio-server/minio-blob-store-02
4.9GiB 102 objects minio-blob-store-02
2个Bucket 数据量不一样,是因为minio-blob-store在批量上传50个100M的文件前做了其他文件的手动上传测试。