备份与恢复
背景
UCS本地集群安装完成后,为保证集群高可用,防止在发生集群故障时数据丢失,UCS支持对于本地集群上的3个master节点上的证书文件、加解密物料、etcd数据等信息的备份,以保障UCS本地集群故障后的数据恢复。
约束与限制
无论是单master还是多master故障,节点IP须保持不变。
集群备份
本地备份
- 创建备份文件压缩包存放的目录。
- 执行备份命令:
./ucs-ctl backup 集群名 --path 备份路径 --type local
示例如下:
./ucs-ctl backup gpu-test --path /home/ggz/gpu-test --type local
执行成功后,会在指定的备份路径下产生名为:集群名-backup-时间戳.tar.gz这样一个备份压缩文件。
备份压缩文件存在ha.yaml、etcd-snapshot目录、crt目录,etcd-snapshot包含etcd备份数据,crt包含证书与加解密材料。
远端备份
- 在远端sftp主机创建备份文件压缩包存放的目录。
- 执行备份命令:
./ucs-ctl backup 集群名 --path 备份路径 --type sftp --ip 远端主机ip --user 远端主机用户名
示例如下:
./ucs-ctl backup gpu-test --path /home/ggz/gpu-test --type sftp --ip 100.95.142.93 --user root
- 首次进行远端备份需要输入sftp密码,请在please input sftp password提示后输入远端sftp服务器密码。
- 备份命令中的备份路径必须真实有效,否则执行命令后在远端生成的备份文件可能存在错误。
执行成功后,远端主机的指定备份路径下会产生名为“集群名-backup-时间戳.tar.gz”的备份压缩文件。该备份压缩文件包含ha.yaml、etcd-snapshot目录、crt目录,etcd-snapshot包含etcd备份数据,crt包含证书与加解密材料。
周期备份
执行crontab -e,通过编写crontab表达式使得备份命令周期执行。
示例如下,代表每天16:40执行集群周期本地备份任务。
40 16 * * * /root/cluster/ucs-ctl backup cluster-redhat --path /root/cluster/backup --type local
周期远端备份时,在首次输入完远端sftp服务器密码后,在crontab表达式中无需指明密码。
为防止备份文件数量一直膨胀,需在备份机器上同样通过crontab周期执行备份文件老化脚本,备份文件老化参考如下:
#!/bin/bash backup_dir=${1} # 备份文件保存路径 keep_days=${2} # 保存天数 if [ ! -d ""$backup_dir"" ]; then # 检查日志目录是否存在 echo "备份文件路径不存在!" exit 1 fi find "$backup_dir" -type f -mtime +$keep_days -exec rm {} \; # 删除旧日志 echo "过期备份文件已删除!"
数据恢复
etcd数据恢复
- 准备etcd备份数据文件。
将备份数据压缩文件{clustername}-backup-{timestamp}.tar.gz发送到需要恢复的集群的各个master/etcd节点上。
- 关闭etcd服务
mv /var/paas/kubernetes/manifests/etcd*.manifest /var/paas/kubernetes/
等待服务停止。
crictl ps | grep etcd
若查询不到etcd容器,说明服务已经停止。
- 备份节点的etcd数据(可选)。
mv /var/paas/run/etcd/data /var/paas/run/etcd/data-bak mv /var/paas/run/etcd-event/data /var/paas/run/etcd-event/data-bak
- 在含有etcd的节点上执行恢复命令。
./ucs-ctl restore etcd 备份文件压缩包路径
示例如下:
./ucs-ctl restore etcd /home/ggz/gpu-test/backup-file-20230625164904.tar.gz
若回显如下命令,则etcd的节点数据恢复成功:
Restore the etcd snapshot successfully.
- 对etcd节点重启etcd服务,重启过程需要等待几分钟。
mv /var/paas/kubernetes/etcd*.manifest /var/paas/kubernetes/manifests
等待服务重新启动:
crictl ps | grep etcd
若查询到etcd容器说明服务已经重启,此时该节点的etcd数据得到恢复。
单master节点故障恢复
- 在执行机上执行单节点故障恢复命令。
./ucs-ctl restore node 节点ip --name 集群名
其中节点ip为故障节点的ip,示例如下。./ucs-ctl restore node 192.168.0.87 --name gpu-test
若回显如下命令,则单master节点故障恢复成功:restore node 192.168.0.87 successfully.
- 在含有etcd的节点上进行etcd数据恢复,具体命令请参考步骤1-5。
多master节点故障恢复
- 对所有master节点进行系统清理。将执行机目录下的卸载脚本拷贝到3台master节点并执行。(脚本路径为/var/paas/.ucs-package/ucs-onpremise/scripts/uninstall_node.sh)
scp -r /var/paas/.ucs-package/ucs-onpremise/scripts/uninstall_node.sh root@{目标节点IP}:/root sudo bash /root/uninstall_node.sh
- 在执行机上执行集群故障恢复命令。
./ucs-ctl restore cluster 集群名 -b 备份文件压缩包路径
示例命令:
./ucs-ctl restore cluster gpu-test -b /home/ggz/gpu-test/backup-file-20230625164904.tar.gz
若回显如下命令,则多master节点故障恢复成功:restore cluster successfully.
- 在每个含有etcd的节点上进行etcd数据恢复,具体命令请参考步骤1-5。