一、备份版本要求
OceanBase版本:4.2.5
ob-operator版本:2.3.0
备份介质:百度云对象存储 BOS(S3协议)
备份说明:OceanBase很早就支持了NFS、阿里云OSS、腾讯云COS这些备份介质,从 V4.2.1 BP7 版本开始,还支持 AWS S3 以及兼容 S3 协议的对象存储,例如:百度对象存储 BOS、华为 OBS、Google GCS。最近在OB官方支持下,完成了OB的备份,其实还是有不少挑战的,跟OB版本、Operator版本和备份介质不同配置也不同。为了方便大家,我将操作流程整理发布。
本文目标:将部署在K8S中的OceanBase 4.2.5集群中某个租户的数据全量备份到百度云对象存储BOS。
二、准备工作
根据上面设定的条件,因operator部署版本过低(2.2.0)需要升级ob-operator到2.3.0才支持将OceanBase备份到兼容S3协议的对象存储中。
ob-operator升级操作如下:
wget https://raw.githubusercontent.com/oceanbase/ob-operator/2.3.0_release/deploy/operator.yamlkubectl apply -f operator-230.yaml -n oceanbase-system
三、备份操作流程
(1)创建可访问百度S3密钥
kubectl create secret generic access-s3 --from-literal accessId=xxxx --from-literal accessKey=xxxx --from-literal s3Region=xxx -n oceanbase-test1
PS:accessId(明文)、accessKey(明文)、s3Region(地区)这些信息都可以在百度云对象存储控制台获取。
(2)编辑ob-backup.yaml
apiVersion: oceanbase.oceanbase.com/v1alpha1kind: OBTenantBackupPolicymetadata:name: obtenant-bp-s3namespace: oceanbase-test1spec:obClusterName: obclustertenantCRName: oceanbasejobKeepWindow: "1d"dataClean:recoveryWindow: "8d"logArchive:destination:type: "S3"path: "s3://backup-s3/oblog-backup?host=s3.xxxx.com"ossAccessSecret: "access-s3"switchPieceInterval: "1d"dataBackup:destination:type: "S3"path: "s3://backup-s3/obdata-backup?host=s3.xxxx.com"ossAccessSecret: "access-s3"fullCrontab: "2 17 * * 6"incrementalCrontab: "30 18 * * *"
相关字段说明,参考:
obClusterName:同 namespace 下 OB 集群资源的名称,例如上图的obclustertenantName(可选):数据库中的租户名,例如上图的dxltesttenantSecret(可选):包含名为 tenantName 的租户 root 用户密码的 Secret 资源名tenantCRName:OBTenant 租户资源名,若指定了该字段,则无需指定 tenantName 和 tenantSecret,例如上图的资源名oceanbasejobKeepWindow:备份任务资源保留时间窗口suspend:备份任务是否暂停,如果不配置,默认为 falsedataClean:过期备份数据清理配置recoveryWindow:数据恢复的时间窗口logArchive:日志归档配置destination:备份目的地配置switchPieceInterval:日志归档中 piece 的切换周期,取值范围为 [1d, 7d]。如果不设置,默认为 1dbinding:设置归档和业务的优先模式。目前支持 Optional 和 Mandatory 两种模式。如果不配置,默认为 Optional 模式dataBackup:数据备份配置destination:备份目的地配置fullCrontab:全量备份的定时触发配置,采用 linux crontab 格式incrementalCrontab:增量备份的定时触发配置,采用 linux crontab 格式encryptionSecret: 数据备份加密配置的 Secret 资源名destination:备份目的地配置type:目的地类型,支持 NFS 和 OSS 两种path:目的地的备份路径,如果是 OSS 类型,则需要以 oss:// 开头;如果是 NFS 类型,则是非 开头的相对路径。ossAccessSecret:存放访问 OSS 凭证的 Secret 资源名,如果备份目的地类型为 OSS,该字段必须提供。
(3)应用backup,默认第一次就立刻执行备份
/opt/ob-operator# kubectl apply -f ob-backup.yaml -n oceanbase-test1obtenantbackuppolicy.oceanbase.oceanbase.com/obtenant-bp-s3 created
(4)查看备份情况
租户数据备份的关键资源为 OBTenantBackupPolicy 和 OBTenantBackup,分别表示备份策略和备份任务。通过备份策略,可以为 OceanBase 集群当中某个租户指定周期性的日志归档和数据备份配置。备份策略会通过创建备份任务的方式来执行具体的任务。
/opt/ob-operator# kubectl get -A OBTenantBackupPolicyNAMESPACE NAME STATUS AGE TENANTNAME NEXTFULL NEXTINCREMENTAL FULLCRONTAB INCREMENTALCRONTABoceanbase-test1 obtenant-bp-s3 PREPARED 14s 2 17 * * * 30 18 * * */opt/ob-operator# kubectl get -A OBTenantBackupsNAMESPACE NAME TYPE STATUS TENANTNAME STARTEDAT ENDEDAToceanbase-test1 obtenant-bp-s3-archive-20241113170137 ARCHIVE RUNNING dxltest 2024-11-13 16:42:11.546764 2024-11-13 17:00:11.772978oceanbase-test1 obtenant-bp-s3-clean-20241113170137 CLEAN SUCCESSFUL dxltest 2024-11-13 16:58:49.563224 2024-11-13 16:58:51.000696oceanbase-test1 obtenant-bp-s3-full-20241113170148 FULL INITIALIZING dxltest/opt/ob-operator# kubectl get -A OBTenantBackupPolicyNAMESPACE NAME STATUS AGE TENANTNAME NEXTFULL NEXTINCREMENTAL FULLCRONTAB INCREMENTALCRONTABoceanbase-test1 obtenant-bp-s3 RUNNING 58s 2024-11-13 17:01:49 2 17 * * * 30 18 * * */opt/ob-operator# kubectl get -A OBTenantBackupPolicyNAMESPACE NAME STATUS AGE TENANTNAME NEXTFULL NEXTINCREMENTAL FULLCRONTAB INCREMENTALCRONTABoceanbase-test1 obtenant-bp-s3 RUNNING 115s 2024-11-13 17:01:49 2 17 * * * 30 18 * * *
PS:有时会faild失败,需要delete备份策略重新执行。官方解释:归档任务已经在执行中了,刚才状态变成 FAILED 的原因是启动归档之后立即查询归档进度表,其中有个 String 字段返回了 NULL。
/opt/ob-operator# kubectl get -A OBTenantBackupPolicyNAMESPACE NAME STATUS AGE TENANTNAME NEXTFULL NEXTINCREMENTAL FULLCRONTAB INCREMENTALCRONTABoceanbase-test1 obtenant-bp-s3 FAILED 13m 47 16 * * 1,2,3,4,5,6,0 47 16 * * */opt/ob-operator# kubectl describe OBTenantBackupPolicy obtenant-bp-s3 -n oceanbase-test1Events:Type Reason Age From Message---- ------ ---- ---- -------Normal 6m50s obtenantbackuppolicy-controller Init statusWarning Task failed 5m53s obtenantbackuppolicy-controller Query list failed, sql SELECT dest_id, round_id, dest_no, status, start_scn, start_scn_display, checkpoint_scn, checkpoint_scn_display, compatible, base_piece_id, used_piece_id, piece_switch_interval, input_bytes, input_bytes_display, output_bytes, output_bytes_display, compression_ratio, deleted_input_bytes, deleted_input_bytes_display, deleted_output_bytes, deleted_output_bytes_display, comment, path FROM DBA_OB_ARCHIVELOG_SUMMARY ORDER BY round_id DESC LIMIT 1, param []: sql: Scan error on column index 7, name "checkpoint_scn_display": converting NULL to string is unsupported/opt/ob-operator# kubectl delete OBTenantBackupPolicy obtenant-bp-s3 -n oceanbase-test1obtenantbackuppolicy.oceanbase.oceanbase.com "obtenant-bp-s3" deleted/opt/ob-operator# kubectl get OBTenantBackupPolicy -n oceanbase-test1No resources found in oceanbase-test1 namespace./opt/ob-operator# kubectl apply -f ob-backup.yaml -n oceanbase-test1obtenantbackuppolicy.oceanbase.oceanbase.com/obtenant-bp-s3 create
(5)执行后就可以在页面查看了(对于页面上实现操作OB备份到普通S3存储,需要等到ob-dashboard 0.4.0发版)
四、总结
通过OceanBase DashBoard中租户的备份业务发现已经完成了一次全量备份。至此完成了OceanBase on K8S在百度云对象存储S3介质的数据备份。
参考:
https://oceanbase.github.io/ob-operator/zh-Hans/docs/manual/ob-operator-user-guide/high-availability/tenant-backup-of-ob-operator






