跳到主要内容
版本:v3&v6

配置对象存储

适用版本

v3.14.x~v6.18.x

适用场景

  • 本地存储(NFS/NAS) 迁移到 对象存储

前提条件

准备 3个 bucket,比如:

  • ones-public-files: 用于存放公开访问的资源,比如用户头像、团队logo等
  • ones-private-files: 用于存放私有资源, 用户存放业务附件、wiki页面资源
  • ones-tmp-files: 用于存放临时的、不公开访问的对象

权限要求: 3个 bucket 统一配置为私有读写

操作

  1. 编写配置生成脚本 /tmp/gen_s3_config.sh

(⚠️ 请按实际情况调整脚本中的变量。 如果ONES系统为多域名访问,则 onesDomain 填写其中一个域名即可)

!/bin/bash

# 需要调整的变量
onesDomainSchame="http" # ones服务协议
onesDomain="ones.example.com" # ones服务域名
s3ServerDomainSchame="http" # s3服务协议
s3ServerDomain="s3.example.com:9000" # s3服务域名
s3ServerForcePathStyle="true" # 是否强制使用pathStyle, 注意:金山Ks3、阿里OSS 这里要配置为false
s3Region="us-east-1" # s3服务区域
s3SecretId="a****n" # s3服务密钥ID
s3SecretKey="a*****x" # s3服务密钥
publicBucketName="ones-public-files" # 公共桶名称
privateBucketName="ones-private-files" # 私有桶名称
tmpBucketName="ones-tmp-files" # 临时桶名称

# 自动计算变量
disableTLS="false"
if [ "$onesDomainSchame" == "https" ]; then
disableTLS="false"
else
disableTLS="true"
fi

s3disableTLS="false"
if [ "$s3ServerDomainSchame" == "https" ]; then
s3disableTLS="false"
else
s3disableTLS="true"
fi

echo "
s3ProxyEnable: true
s3ProxyEndpoint: $s3ServerDomainSchame://$s3ServerDomain
s3ProxyDisableSSL: $s3disableTLS
s3ProxyForcePathStyle: $s3ServerForcePathStyle
s3ProxyTrimVitualPath: false

wizOSSBucketName: $privateBucketName
wizOSSRegion: $s3Region
wizOSSDisableTLS: true
wizOSSForcePathStyle: true
wizObjectStorage: s3
wizOSSEndpoint: http://s3-proxy-service:8080
wizEditorStorageOssSecretId: $s3SecretId
wizEditorStorageOssSecretKey: $s3SecretKey
wizEmptyDirEnable: true # 使用emptydir给wiki加速
s3proxyVerbose: false

fileStorage: s3-proxy
s3ProtocolAccessKey: $s3SecretId
s3ProtocolSecretKey: $s3SecretKey
s3ProtocolRegion: $s3Region
s3ProtocolEndpoint: $onesDomainSchame://$onesDomain
s3ForcePathStyle: true
s3DisableSSL: $disableTLS
s3ProtocolVendorCode: aws

s3ProtocolPublicBucketName: $publicBucketName
s3ProtocolPrivateBucketName: $privateBucketName
s3PublicTemporaryBucketName: $tmpBucketName
s3PrivateTemporaryBucketName: $tmpBucketName

s3ProtocolPrivateBucketPath: /private
s3ProtocolPublicBucketPath: /public
s3TempDir: /temporary

s3BucketPublicCname: $onesDomainSchame://$onesDomain/$publicBucketName/public/
s3BucketPrivateCname: $onesDomainSchame://$onesDomain/$privateBucketName/private/
s3BucketPublicTemporaryCname: $onesDomainSchame://$onesDomain/$tmpBucketName/temporary/
s3BucketPrivateTemporaryCname: $onesDomainSchame://$onesDomain/$tmpBucketName/temporary/

# 开启本地回源服务
onesTraceFileServerEnable: true
localstorageForLocalToS3Server: true
localToS3ServerEnable: true
s3ProxyFilesBackToOriginPlan: local
"
  1. 生成配置项, 并应用配置项
# 执行脚本,生成配置,并打印
bash /tmp/gen_s3_config.sh
  1. 配置 config/private.yaml

执行ones-ai-k8s.sh进入操作容器,编辑config/private.yaml, 把步骤2 打印的配置粘贴到 config/private.yaml 末尾

  1. 配置域名信息

执行ones-ai-k8s.sh进入操作容器,编辑config/private.yaml,补充以下配置

⚠️注意:根据实际情况,把http://ones.example.com 替换为实际值

# ONES系统支持 单域名 或 多域名访问, 可根据实际情况调整一下配置
baseURL: "http://ones.example.com" # 访问ONES系统的主
# apiBaseHostList 域名列表,多个域名用','分隔,比如 http://ones.example.com,http://ones2.example.com
apiBaseHostList: "http://ones.example.com"
  1. 应用配置

执行ones-ai-k8s.sh进入操作容器,执行以下命令

make setup-ones
  1. 修改数据库

进入数据库

# 内置数据库时,执行以下命令进入数据库
kubectl -n ones exec -it mysql-cluster-mysql-0 bash
mysql -uones -p wizeditor -h mysql-cluster-mysql-master

# 外置数据库时,找数据库管理员进行处理

更新数据

update files set remote="s3";
update milestones set remote="s3";
update snapshots set remote="s3";

update files set local=0;
update milestones set local=0;
update snapshots set local=0;
  1. 本地数据迁移到对象存储

⚠️注意
同步过程,有同步进度信息展示。
同步命令,可以随时中断和继续执行,建议在业务低峰期执行台同步命令,高峰期中断命令,待到高峰期后,继续重复执行命名,继续同步

# 进入容器
kubectl -n ones exec -it local-to-s3-statefulset-0 bash

# 在容器内执行下面的命令

cd /data/ones/files
find private > /offsetlogs/private.yaml
find public > /offsetlogs/public.yaml

cd /data/ones/files/wiz-editor
find docs > /offsetlogs/docs.yaml
find resources> /offsetlogs/resources.yaml

# 根据实际情况调整下面的变量
s3Region="us-east-1" # s3服务区域
s3SecretId="xxxxx" # s3服务密钥ID
s3SecretKey="xxxx" # s3服务密钥
publicBucketName="ones-public-files" # 公共桶名称
privateBucketName="ones-private-files" # 私有桶名称
tmpBucketName="ones-tmp-files" # 临时桶名称

# 开始执行同步
# 定义 cmd 变量
cmd="localstorage-to-s3 sync --accessKeyID=${s3SecretId} --secretAccessKey=${s3SecretKey} --endpoint=http://s3-proxy-service:8080 --s3ForcePathStyle=true --useSSL=false --region=${s3Region}"

# 1. 同步公共桶(这个命令可以随时中断,可重复执行,比如,你可以选择在业务低峰期执行,高峰期中断命令的执行)
${cmd} --bucket=${publicBucketName} --input=/offsetlogs/public.yaml --localBaseDir=/data/ones/files --offsetFile=/offsetlogs/public.yaml.offset

# 2. 同步私有桶(这个命令可以随时中断,可重复执行,比如,你可以选择在业务低峰期执行,高峰期中断命令的执行)
${cmd} --bucket=${privateBucketName} --input=/offsetlogs/private.yaml --localBaseDir=/data/ones/files --offsetFile=/offsetlogs/private.yaml.offset

# 3. 同步wiki页面 (这个命令可以随时中断,可重复执行,比如,你可以选择在业务低峰期执行,高峰期中断命令的执行)
${cmd} --bucket=${privateBucketName} --input=/offsetlogs/docs.yaml --localBaseDir=/data/ones/files/wiz-editor --offsetFile=/offsetlogs/docs.yaml.offset

# 4. 同步wiki资源(这个命令可以随时中断,可重复执行,比如,你可以选择在业务低峰期执行,高峰期中断命令的执行)
${cmd} --bucket=${privateBucketName} --input=/offsetlogs/resources.yaml --localBaseDir=/data/ones/files/wiz-editor --offsetFile=/offsetlogs/resources.yaml.offset

校验数据的完整性

存储切换后,业务不会有新的关键业务文件对象写入到 共享文件系统的, 所有新的关键业务数据都会写入到s3存储中。
因此只需要校验这部分关键业务数据,即可保障数据的完整性。
完成全量同步后, 可以执行校验脚本,校验文件的一致性。

数据校验逻辑:

  • 遍历共享目录的所有文件, 到S3对象存储下载对应的对象文件,进行 md5sum 比较。
  • 把有差异的文件记录到 xxx.diff-report文件中,
  • 把有报错的文件记录到 xxx.err-report文件中。
  • 分析校验报告,即完成内容校验保障。

⚠️注意:

  • 由于部分对象文件在ONES系统的使用过程中会有更新,因此 .diff-report 有记录属于正常现象。可以后续再进一步分析
    • 比如wiki页面内容被修改和保存是, latest.json会有所变化,会出现在 .diff-report
    • err-report是需要重点关注的。

执行下面的命令,校验数据的完整性,校验报告将输出到 /tmp/checksum 目录下(如需重新校验,清理/tmp/checksum 目录,重新执行命令即可)

# 进入容器
kubectl -n ones exec -it local-to-s3-statefulset-0 bash

# 在容器内执行下面的命令

cd /data/ones/files
find private > /offsetlogs/private.yaml
find public > /offsetlogs/public.yaml

cd /data/ones/files/wiz-editor
find docs > /offsetlogs/docs.yaml
find resources> /offsetlogs/resources.yaml

# 根据实际情况调整下面的变量
s3Region="us-east-1" # s3服务区域
s3SecretId="xxxxx" # s3服务密钥ID
s3SecretKey="xxxx" # s3服务密钥
publicBucketName="ones-public-files" # 公共桶名称
privateBucketName="ones-private-files" # 私有桶名称
tmpBucketName="ones-tmp-files" # 临时桶名称

# 开始执行数据校验
# 定义 cmd 变量
cmd="localstorage-to-s3 checksum --accessKeyID=${s3SecretId} --secretAccessKey=${s3SecretKey} --endpoint=http://s3-proxy-service:8080 --s3ForcePathStyle=true --useSSL=false --region=${s3Region}"

# 分别校验不通类型文件的完整性
# 校验 public 类型文件(头像、logo、icon等)
${cmd} --bucket=${publicBucketName} --input=/offsetlogs/public.yaml --localBaseDir=/data/ones/files
# 校验 业务附件
${cmd} --bucket=${privateBucketName} --input=/offsetlogs/private.yaml --localBaseDir=/data/ones/files
# 校验 wiki页面
${cmd} --bucket=${privateBucketName} --input=/offsetlogs/docs.yaml --localBaseDir=/data/ones/files/wiz-editor
# 校验 wiki资源文件
${cmd} --bucket=${privateBucketName} --input=/offsetlogs/resources.yaml --localBaseDir=/data/ones/files/wiz-editor

# 校验报告将输出到 /tmp/checksum 目录下
# 报告出来后,根据报告内容,注意有冲突的页面、附件,再人为确认一下这些变化即可。

完成校验后, 并且通过后,可以清理 ones-file-volume-pvc的数据。 (⚠️ 建议,清理ones-file-volume-pvc的数据, 可以先把nes-file-volume-pvc的数据备份到其他主机上。保留一段时间。)

常见问题:

问题一: 同步过程报错Error: Copy object [], error: NotFound: Not Found

错误信息如下:

Error: Copy object [], error: NotFound: Not Found
status code: 404, request id: , host id:

原因:img.ones.pro/release/localstorage-to-s3:v0.0.8 版本存在bug

解决方法:

更换localToS3Image版本到 v0.0.10,编辑配置项 vi config/private.yaml,增加以下配置

# 注意:这个新的镜像需要找ONES技术支持提供。 或者在切换到对象存储之前,升级到 3.14.x的最新版本 或 6.18.x的最新版本
localToS3Image: img.ones.pro/release/localstorage-to-s3:release-v0.0.10

应用配置

make setup-ones

重新执行本文的「本地数据迁移到对象存储」操作。

问题二:private 、public 、docs 、resources的目录不存在

在系统初装后,在还没有使用 【更改头像】、【wiki中编辑流程图】、【上传附件】等功能时,部分目录是不会被创建。
没有被创建的目录,可以在 【步骤三: 同步本地存储数据到s3存储】 和 【校验数据的完整性】 中跳过对应的操作