
# 备份与恢复
#### 背景
UCS本地集群安装完成后，为保证集群高可用，防止在发生集群故障时数据丢失，UCS支持对于本地集群上的3个master节点上的证书文件、加解密物料、etcd数据等信息的备份，以保障UCS本地集群故障后的数据恢复。
#### 约束与限制
无论是单master还是多master故障，节点IP须保持不变。
#### 集群备份
**本地备份**
1. 创建备份文件压缩包存放的目录。
2. 执行备份命令：
   ```
   ./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包含证书与加解密材料。
   
**远端备份**
1. 在远端sftp主机创建备份文件压缩包存放的目录。
2. 执行备份命令：
   ```
   ./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
   ```
   ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/notice_3.0-zh-cn.png)
   - 首次进行远端备份需要输入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 * * * ucs-ctl工具路径 backup 集群名称 --path 备份路径 --type local
```
示例如下，代表每天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数据恢复**
1. 准备etcd备份数据文件。
   将备份数据压缩文件{clustername}-backup-{timestamp}.tar.gz发送到需要恢复的集群的各个master/etcd节点上。
   
2. 关闭etcd服务 在节点上执行：
   ```
   mv /var/paas/kubernetes/manifests/etcd*.manifest /var/paas/kubernetes/
   ```
   等待服务停止。
   ```
   crictl ps | grep etcd
   ```
   若查询不到etcd容器，说明服务已经停止。
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001616590570.png "点击放大")
   
3. 备份节点的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
   ```
   
4. 在含有etcd的节点上执行恢复命令。
   ```
   ./ucs-ctl restore etcd 备份文件压缩包路径
   ```
   示例如下：
   ```
   ./ucs-ctl restore etcd /home/ggz/gpu-test/backup-file-20230625164904.tar.gz
   ```
   若回显如下命令，则etcd的节点数据恢复成功：
   Restore the etcd snapshot successfully.
   
5. 对etcd节点重启etcd服务，重启过程需要等待几分钟。
   ```
   mv /var/paas/kubernetes/etcd*.manifest /var/paas/kubernetes/manifests
   ```
   等待服务重新启动：
   ```
   crictl ps | grep etcd
   ```
   若查询到etcd容器说明服务已经重启，此时该节点的etcd数据得到恢复。
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001664682417.png "点击放大")
   ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
   etcd数据恢复需要每个含有etcd的节点上单独执行[1]-[5]步骤。
   
**单master节点故障恢复**
1. 对要恢复的master节点进行系统清理。将执行机目录下的卸载脚本拷贝到需进行故障恢复的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
   ```
   
   
2. 在执行机上执行单节点故障恢复命令。 
   ```
   ./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.
   
   
3. 在含有etcd的节点上进行etcd数据恢复，具体命令请参考步骤[1]-[5]。
**多master节点故障恢复**
1. 对所有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
   ```
   
   
2. 在执行机上执行集群故障恢复命令。 
   ```
   ./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.
   
   
3. 在每个含有etcd的节点上进行etcd数据恢复，具体命令请参考步骤[1]-[5]。
 
