数据备份详细说明
部署备份数据存储服务 minio,以及快速开启备份详见 快速开始文档。
备份数据的对象存储
上文部署的minio对象存储用于存放备份包,因此需要把上文的minio访问信息加到配置文件中
vi config/private.yaml
# minio对象存储访问配置
minioRootUser: "ROOTNAME" # minio部署时的环境变量 MINIO_ROOT_USER
minioRootPassword: "CHANGEME123" # minio部署时的环境变量 MINIO_ROOT_PASSWORD
minioClusterIP: "10.0.0.203" # minio部署机器IP
minioServicePortExport: "9000" # 默认 9000
Kafka备份
开启备份
进入操作机。
vi config/private.yaml
kafkaBackupEnable: "true" # 开启kafka备份
# 要关闭备份,把这个配置注释掉,并重新 make setup-ones 即可
完成配置,并检查效果
make setup-ones # 完成设置
# 检查kafka-backup的pod启动
kubectl -n ones get po | grep kafka-backup
# 手动触发备份
make kafka-base-backup NAMESPACE=ones
# 到minio管理后台确认存储桶kafka-xbackup中的备份文件
# 自动定时备份,参考如下默认配置参数,每天7点/19点自动执行增量备份
相关的其它参数,可采用默认配置的参数, 具体如下:
kafkaBackupImage: "img.ones.pro/release/kafka-backup:release-v0.0.9"
kafkaBackupReplicas: 1
kafkaBackupIgnoredTopic: "^__consumer_offsets" # kafka需要忽略备份的topic的正则表达式, 多个正则表达式用'|'逗号分开, 例如 "^test$|^__" 忽略 前缀__和名为test的topic
kafkaBackupIncRule: "0 0 7,19 * * *" # kafka 增量备份 定时规则 早上7点和晚上7点
kafkaBackupResotreCompress: "ones-binlog:zstd" # 指定topic的消息压缩类型, 默认使用Lz4,可选项None,Snappy,Lz4,Zstd,Gzip。 多个topic逗号','隔开
kafkaBackupProduceBatchSize: "1MB" # 还原数据时,批生产阈值(注意不能大于kafka批处理阈值)
kafkaBackupCPULimit: "2000m"
kafkaBackupMemoryLimit: "1024Mi"
恢复备份
# 1. 清理旧数据
# 1.1. 停业务,清理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-installer pod)
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
MySQL备份
开启MySQL备份
进入操作机,执行三个步骤:
- 开启备份服务端和MySQL状态服务
- 开启备份代理
- 开启MySQL备份策略
开启备份服务端和MySQL状态服务
vim config/private.yaml
internalComponentMysqlEnable: true # 部署内置mysql
mysqlXbackupEnable: true # 配置mysql-xbackup-server
mysqlStatusServerEnable: true # 必须开启
mysqlXbackupToken: "47bce5c7" # 随机生成的字符串作为token
# 完成配置
make setup-ones-built-in-mysql
make setup-ones
# 检查pod变更
kubectl -n ones get po | grep mysql
# 确认 mysql-cluster-mysql 和 mysql-operator 有更新,增加 mysql-status-server-deployment
开启备份代理
使用 htpasswd 生成代理服务的账户密码, 进入网页:
https://tool.oschina.net/htpasswd
输入用户名和密码(请记下密码明文用于客户端配置),加密算法选择MD5,生成结果为 [用户名]:[密码密文]。
以 :
为分隔,分别取出用户名和密文,用于下面的配置:
vim config/private.yaml
xbackupNginxEnable: true
xbackupNginxBasicAuthUser: "12345" # 用户名
xbackupNginxBasicAuthPasswordSecret: "$apr1$xAF/EcYh$HOTn.2.CVTEAhhqHqRxOW1" # 密码密文
完成配置:
make setup-ones
# 检查pod启动
kubectl -n ones get po | grep xbackup-nginx
# 检查服务访问,响应404即可
curl http://xbackup-nginx-service.ones/infrastructure/mysql-xbackup/0/
开启MySQL备份策略
vim config/private.yaml
mysqlXbackupInternalEnable: true # 开启MySQL备份策略集群内部署,注意组件机已有的情况下不要开启
mysqlXbackupNginxBasicAuthPassword: 12345 # 对应xbackupNginxBasicAuthPasswordSecret的密码明文
mysqlXbackupServerInstance: master
mysqlXbackupCPULimit: "1000m"
mysqlXbackupMemoryLimit: "512Mi"
完成配置
make setup-ones
# 检查pod启动
kubectl -n ones get po | grep mysql-xback
MySQL备份相关配置,保持默认即可,可按需调整:
# 内置 mysql 备份相关配置
mysqlXbackupEnable: false # 是否启用mysql xbackup备份 true or false
mysqlXbackupToken: "" # 配置msyql-xbackup-service服务端备份接口的token,用于接口鉴权。 make init-config初始化该项
mysqlXbackupServiceNodePort0: "" # 通过nodePort访问mysql第一个实例的xbackup server(仅用于测试,生产环境中,非特殊情况下不建议进行配置 ), example: 30180 # The default node port range for Kubernetes is 30000 - 32767
mysqlXbackupServiceNodePort1: "" # 通过nodePort访问mysql第二个实例的xbackup server(仅用于测试,生产环境中,非特殊情况下不建议进行配置 ), example: 30181 # The default node port range for Kubernetes is 30000 - 32767
mysqlXbackupServiceNodePort2: "" # 通过nodePort访问mysql第三个实例的xbackup server(仅用于测试,生产环境中,非特殊情况下不建议进行配置 ), example: 30182 # The default node port range for Kubernetes is 30000 - 32767
# 默认的内置 mysql 备份由集群外组件机的备份客户端进行备份,如果需要使用集群内部的备份客户端进行备份,则需要配置以下参数
mysqlXbackupInternalEnable: false # 是否启用mysql xbackup集群内备份 true or false,组件机备份与集群内备份只能二选一
mysqlXbackupPolicyImage: "img.ones.pro/release/mysql-xbackup-policy:v3.14.1"
mysqlXbackupNginxBasicAuthPassword: "" # 对应密钥xbackupNginxBasicAuthPasswordSecret,对应组件机的xbackup_nginx_basic_auth_password
mysqlXbackupServerInstance: "0" # 要连接的mysql集群具体实例, 对应mysql_xbackup_server_instance
mysqlXbackupAlertEnable: "false" # true or false ,若开启,则使用对应mysql_alert_baseurl地址,否则为空
mysqlXbackupAlertmanagerBasicAuthPassword: "" # alertmanagerBasicAuthPasswordSecret的密码,对应组件机的alertmanager_basic_auth_password
mysqlXbackupBucket: "mysql-xbackup" # 备份存放存储桶。 对应 mysql_oss_bucket
mysqlXbackupManual: "false" # 对应 mysql_manual
mysqlXbackupCron: "true" # 对应 mysql_cron
mysqlXbackupCronAll: "0 20 3 * * SAT" # 全量备份crontab。 对应 mysql_cron_all
mysqlXbackupCronInc: "0 30 * * * *" # 增量备份crontab。对应 mysql_cron_inc
mysqlXbackupCronRuleRecover: "true" # 对应 mysql_cron_rule_recover
mysqlXbackupLogFile: "/dev/stdout" # 对应 mysql_log_file
mysqlXbackupLogDetail: "false" # 对应 mysql_log_detail
mysqlXbackupAllSuccessSendAlert: "true" # 对应 all_success_send_alert
mysqlXbackupIncSuccessSendAlert: "false" # 对应 inc_success_send_alert
mysqlXbackupAllFailedSendAlert: "true" # 对应 all_failed_send_alert
mysqlXbackupIncFailedSendAlert: "true" # 对应 inc_failed_send_alert
mysqlXbackupDataVolumeSize: 1Gi
mysqlXbackupCPULimit: "2000m"
mysqlXbackupMemoryLimit: "1024Mi"
备份操作
对于 ones: v3.14.49 及以上版本,可用如下命令:
# 查看日志
make logs-mysql-xbackup NAMESPACE=ones
# 查看最后100条日志
make logs-mysql-xbackup NAMESPACE=ones TAIL=100
# 手动全量备份
make mysql-base-backup NAMESPACE=ones
# 手动增量备份
make mysql-inc-backup NAMESPACE=ones
# 检查是否有备份进度
make checkprocess-mysql-xbackup-policy NAMESPACE=ones
# mysql过期备份删除
# 默认删除30天之前的备份
make delete-mysql-backup NAMESPACE=ones
# 删除7天之前的备份
make delete-mysql-backup NAMESPACE=ones BEFORE=7d
异常处理
如果出现如下错误:
bash-5.0# make logs-mysql-xbackup NAMESPACE=ones
error: error executing jsonpath "{.items[0].metadata.name}": Error executing template: array index out of bounds: index 0, length 0. Printing more information for debugging the template:
...
请检查 MySQL 备份组件已启动,其状态为 Running
:
# 检查pod启动
kubectl -n ones get po | grep mysql-xback
旧版本兼容
若版本低于 ones: v3.14.49,如上命令出现错误:
bash-5.0# make logs-mysql-xbackup NAMESPACE=ones
/bin/sh: ansible: not found
bash-5.0# make mysql-inc-backup NAMESPACE=ones
/bin/sh: ansible-playbook: not found
可考虑使用如下临时命令:
bkpod=$(kubectl -n ones get po -l app=mysql-xbackup -o jsonpath='{.items[0].metadata.name}') # 这里取pod名,直接复制即可
# 查看日志,由于日志输出到/dev/stdout,手动执行的日志仅会输出到执行的终端上
kubectl -n ones logs -f ${bkpod}
# 注意:目前手动执行备份会导致自动定期备份任务失效,此问题有待后续修复,临时处理方案见 https://opsdoc.ones.cn/docs/faq/k3s/mysql-backup-cron-failed
# 手动全量备份 命令前台运行,终端输出日志,有需要可以改为后台执行
kubectl -n ones exec -it ${bkpod} -- mysql-xbackup-policy -m --detail --instance=0
# 手动增量备份
kubectl -n ones exec -it ${bkpod} -- mysql-xbackup-policy -m -i --detail --instance=0
# 检查是否有备份在执行
kubectl -n ones exec -it ${bkpod} -- mysql-xbackup-policy checkProcess
# mysql过期备份删除
BEFORE=30d
kubectl -n ones exec -it ${bkpod} -- mysql-xbackup-policy clean --min-age=${BEFORE} --detail
关闭备份客户端
编辑 config/private.yaml
,注释掉如下配置:
# mysqlXbackupInternalEnable: true
生效配置:
make setup-ones
kubectl -n ones get po | grep mysql-xbackup
# 检查备份策略服务关闭
通过备份数据恢复MySQL
- 停用mysql,清理数据
# 在宿主机
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')
# 删除现有数据
# ❗️注意请谨慎删除数据,这里使用mv代替删除
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-*/
# kubectl -n ones delete pvc data-mysql-cluster-mysql-0 data-mysql-cluster-mysql-1 data-mysql-cluster-mysql-2
# kubectl -n ones delete pvc data-mysql-operator-0 data-mysql-operator-1 data-mysql-operator-2
- 配置还原
vim config/private.yaml
注意: 恢复恢复备份过一次之后,需要手动做一次全量备份,以保证后续的增量备份成功
mysqlXbackupRestoreEnable: "true"
mysqlXbackupRestoreInitBucketUrl: "s3://mysql-xbackup/base-20230804-173510.gz"
# 这里的AccessKeyId,AccessKey,Endpoint的原文分别是使用上文部署minio的账户名,密码,访问地址
mysqlXbackupAwsAccessKeyId: "Uk9PVE5BTUU=" # 选填,对象存储的 AWS_ACCESS_KEY_ID, 注意,这里要填写 AWS_ACCESS_KEY_ID base64后的结果, 比如 `echo -n "AWS_ACCESS_KEY_ID" | base64`
mysqlXbackupAwsSecretAccessKey: "Q0hBTkdFTUUxMjM=" # 选填,对象存储的 AWS_SECRET_ACCESS_KEY, 注意,这里要填写 AWS_SECRET_ACCESS_KEY base64后的结果, 比如 `echo -n "AWS_SECRET_ACCESS_KEY" | base64`
# 原文 http://10.0.0.203:9000 # http://{{ minioClusterIP }}:{{ minioServicePortExport }}
mysqlXbackupS3Endpoint: "aHR0cDovLzEwLjAuMC4yMDM6OTAwMA==" # 选填,对象存储的 S3_ENDPOINT, 注意,这里要填写 S3_ENDPOINT base64后的结果, 比如 `echo -n "S3_ENDPOINT" | base64`
# make setup-ones
make setup-ones-built-in-mysql
# 等待mysql-operator和mysql-cluster启动
# 检查数据库正常
文件备份
备份业务文件数据:
- /data/ones/file - 附件&wiki文件
- /data/plugin - 插件
基于minio-client的目录同步功能,将目录定时同步到minio。
开启文件备份
- 增加配置
vi config/private.yaml
mcBackupEnable: true # 开启mc备份,要关闭备份,注释掉这个配置并重新 make setup-ones 即可
mcBackupToolsWatchDirs: "/data/plugin;/data/ones/files" # 指定要备份的目录
mcBackupToolsCronRule: "0 0 2 * * *" # 定时mc备份的规则,默认值: 凌晨2点进行全备
- 应用配置
make setup-ones
kubectl get po -n ones -l app=mc-backup-tools # 确认pod起来
备份操作
- 定时备份:
根据mcBackupToolsCronRule
, 默认每天凌晨2点备份
- 手工备份
mcBackupToolsWatchDirs
所有目录数据
make mc-backup-tools NAMESPACE=ones
备份恢复
从minio将mcBackupToolsWatchDirs
同步到本地
- 恢复
mcBackupToolsWatchDirs
所有目录数据
make mc-restore NAMESPACE=ones
仅处理指定目录
若不想备份恢复 mcBackupToolsWatchDirs
中的全部目录,可用 WATCH_DIRS
指定其中的目录数据, 多个目录分号 ';' 隔开
# 指定只备份wiz-editor文件数据
make mc-backup-tools NAMESPACE=ones WATCH_DIRS=/data/ones/files/wiz-editor
# 指定只恢复wiz-editor文件数据
make mc-restore NAMESPACE=ones WATCH_DIRS=/data/ones/files/wiz-editor