恢复数据
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迁移补充说明检查。