跳到主要内容

恢复数据

1 前置说明

(1)本文适用于当前主机运行异常,但是配置无变化、备份文件也没有更改位置的场景,也就是"原地恢复"。

(2)如果是用于测试演练、原服务器故障、服务器迁移等"异机恢复"的场景,请先在异机上安装同版本的ONES服务(复制config/private.yaml配置文件),正常部署MinIO、开启备份,然后将旧MinIO整个备份文件夹拷贝到新MinIO指定目录下,再参考本文和数据恢复补充说明操作。如有疑问,请联系ONES工程师。

2 审计日志恢复

6.1.93及以下版本恢复Kafka

# 1. 清理旧数据

# 1.1. 宿主机上root用户执行,停业务,清理kafka数据
kubectl scale deploy -n ones audit-log-sync-deployment binlog-event-sync-deployment ones-canal-deployment ones-bi-sync-canal-deployment --replicas=0
# 确认服务已停止
kubectl get pod -n ones|grep -E 'bin|audit|canal'

# 1.2. 停中间件
kubectl scale sts -n ones zookeeper-ha kafka-ha --replicas=0
# 确认服务已停止
kubectl get pod -n ones|grep -E 'zookeeper|kafka-ha'

# 1.3 清理localstorage(仅限于单机版)
onesNameSpace=ones
dat=$(date +'%Y%m%d-%H%M%S')
# localstorageStorageBasePath=/data/ones/ones-local-storage
# 确认宿主机存储的路径
path=$(ones-ai-k8s.sh make get_value KEY=localstorageStorageBasePath | grep -e "^/")
localstorageStorageBasePath=$(echo -n "$path" | tr -d '\n\r')
echo "localstorageStorageBasePath is : $localstorageStorageBasePath"

ls -l ${localstorageStorageBasePath}/kafka/${onesNameSpace}/*/
# ❗️注意请谨慎删除数据,这里使用mv代替删除
mkdir -p /tmp/data-kafka-ha_$dat /tmp/data-zookeeper-ha_$dat/
mv ${localstorageStorageBasePath}/kafka/${onesNameSpace}/data-kafka-ha-0/* /tmp/data-kafka-ha_$dat/
mv ${localstorageStorageBasePath}/kafka/${onesNameSpace}/data-zookeeper-ha-0/* /tmp/data-zookeeper-ha_$dat/
# 确认删除
ls -l ${localstorageStorageBasePath}/kafka/${onesNameSpace}/*/

# 2. 启动服务
ones-ai-k8s.sh
make setup-ones
# 2.1 启动空数据的中间件
kubectl scale sts -n ones zookeeper-ha kafka-ha --replicas=1 # 副本数根据集群规模调整
# 确认中间件启动
kubectl get pod -n ones|grep -E 'zookeeper-ha|kafka-ha'
# 2.2 起业务
kubectl scale deploy -n ones binlog-event-sync-deployment audit-log-sync-deployment ones-canal-deployment ones-bi-sync-canal-deployment --replicas=1
# 确认业务已启动
kubectl get pod -n ones|grep -E 'bin|audit|canal'

# 3. 恢复数据
make kafka-restore NAMESPACE=ones DATA_PATH=20230807-111039.264

6.1.94及以上版本恢复Clickhouse

下述3种方式请按需选择1个即可

(1) 恢复最新备份

ones-ai-k8s.sh
make clickhouse-restore

默认用最近一次的备份进行恢复,需要恢复的表由 clickhouseBackupTables 配置决定。

(2) 恢复指定备份

如果自动恢复失败,可以手动指定备份文件进行恢复。

ones-ai-k8s.sh
make clickhouse-restore BACKUP=http://<S3 endpoint>/clickhouse-backup/2025/01/02/incr_2025010206_base_audit_log_audit_log_20250102.zip

(3) 手动恢复指定备份

如果 ClickHouse 发生了重启或者想从另外的对象存储进行恢复,可以去对应的存储拿到备份包的地址进行恢复。此方法也适用于服务器环境的迁移,比如 Docker 迁移到 K3s 等。

# 先进入clickhouse-backup-deployment-***容器内 
rclone lsl s3:clickhouse-backup --config=/etc/clickhouse-backup/rclone.conf | sort -k2,2r
928 2025-01-16 14:00:00.188000000 2025/01/16/incr_2025011614_base_audit_log_audit_log_2025011613.zip
5929 2025-01-16 13:00:00.208000000 2025/01/16/base_audit_log_audit_log_2025011613.zip

# 选择最新的文件作为恢复文件,进入到 ClickHouse 执行如下 SQL
RESTORE TABLE audit_log.audit_log FROM S3('http://endpoint/clickhouse-backup/2024/12/31/incr_2024123108_base_audit_log_audit_log_20241231.zip', '<AccessKey>', '<Secret>');

3 恢复业务数据MySQL

3.1 关闭备份客户端

编辑 config/private.yaml ,注释掉如下配置:

ones-ai-k8s.sh
vi config/private.yaml
# mysqlXbackupInternalEnable: true
# 下发配置
ones-ai-k8s.sh
make setup-ones
kubectl -n ones get po | grep mysql-xbackup
# 检查备份策略服务是否关闭

3.2 停用mysql,清理数据

# 在宿主机上用root用户执行
kubectl -n ones patch mysqlcluster mysql-cluster -p '{"spec":{"replicas":0}}' --type=merge
kubectl -n ones patch statefulset mysql-operator -p '{"spec":{"replicas":0}}' --type=merge

# 删除原有数据(仅限单机版)
# localstorageStorageBasePath=/data/ones/ones-local-storage/
# 确认宿主机存储的路径
path=$(ones-ai-k8s.sh make get_value KEY=localstorageStorageBasePath | grep -e "^/")
localstorageStorageBasePath=$(echo -n "$path" | tr -d '\n\r')
echo "localstorageStorageBasePath is : $localstorageStorageBasePath"

onesNameSpace=ones
dat=$(date +'%Y%m%d-%H%M%S')
# 备份现有数据
mkdir -p /tmp/data-mysql-cluster-mysql_$dat /tmp/data-mysql-operator_$dat/
mv ${localstorageStorageBasePath}/mysql/${onesNameSpace}/data-mysql-cluster-mysql-0/* /tmp/data-mysql-cluster-mysql_$dat/
mv ${localstorageStorageBasePath}/mysql/${onesNameSpace}/data-mysql-operator-0/* /tmp/data-mysql-operator_$dat/
ll ${localstorageStorageBasePath}/mysql/${onesNameSpace}/data-mysql-cluster-mysql-*/ ${localstorageStorageBasePath}/mysql/${onesNameSpace}/data-mysql-operator-*/

3.3 启用恢复配置

(1) 修改配置文件

ones-ai-k8s.sh
vim config/private.yaml

mysqlXbackupRestoreEnable: "true"
# 这里填写要恢复的时间点对应的mysql备份文件
mysqlXbackupRestoreInitBucketUrl: "s3://mysql-xbackup/base-20230804-173510.gz"
# 这里的AccessKeyId,AccessKey,Endpoint的原文分别是使用上文部署MinIO的账户名,密码,访问地址
# 这里要填写 AWS_ACCESS_KEY_ID base64后的结果, 比如 `echo -n "AWS_ACCESS_KEY_ID" | base64`
mysqlXbackupAwsAccessKeyId: "bWluaW91c2Vy"
# 这里要填写 AWS_SECRET_ACCESS_KEY base64后的结果, 比如 `echo -n "AWS_SECRET_ACCESS_KEY" | base64`
mysqlXbackupAwsSecretAccessKey: "UUpuZHNlODk="
# 这里要填写 S3_ENDPOINT base64后的结果, 比如 `echo -n "S3_ENDPOINT" | base64` 其中S3_ENDPOINT格式为http://{{ minioClusterIP }}:{{ minioServicePortExport }}
mysqlXbackupS3Endpoint: "aHR0cDovL21pbmlvLTAubWluaW8tc2VydmljZS5vbmVzLWJhY2t1cDo5MDAw"

(2)下发配置并开启恢复

make setup-ones
make setup-ones-built-in-mysql

# 等待mysql-operator和mysql-cluster启动,此时会加载数据进行恢复,耗时较长
# 检查数据库是否正常,mysql-cluster-mysql-0的pod状态为6/6或者7/7表示恢复正常
kubectl get pod -A|grep -i mysql

3.4 配置还原

恢复操作完成之后,上述新增的恢复配置必须全部注释,然后手动再做一次全量备份,以保证后续的增量备份成功。

4 恢复文件

从MinIO目录将备份数据同步到本地

ones-ai-k8s.sh
make mc-restore NAMESPACE=ones

5 补充说明

按照上述操作完成数据恢复后,参考数据恢复&Docker迁移补充说明检查。