undercloud 和 Control Plane 备份和恢复
在更新和升级过程中备份和恢复 undercloud 和 overcloud control plane 的步骤
摘要
第 1 章 undercloud 和 control plane 简介备份和恢复 复制链接链接已复制到粘贴板!
Undercloud 和 Control Plane Back Up 和 Restore 过程提供了备份 Red Hat OpenStack Platform 13 undercloud 和 overcloud Controller 节点(在更新和升级前称为 Control Plane 节点)的步骤。如果在更新或升级过程中出现错误,请使用流程将 undercloud 和 overcloud Control Plane 节点恢复到以前的状态。
1.1. 背景信息 复制链接链接已复制到粘贴板!
Undercloud 和 Control Plane Back Up 和 Restore 过程使用开源 Relax 和 Recover (ReaR)灾难恢复解决方案,以 Bash 编写。ReaR 创建由 undercloud 或 Control Plane 节点的最新状态组成的可引导镜像。ReaR 还可让系统管理员选择用于备份的文件。
ReaR 支持大量引导介质格式,包括:
- ISO
- USB
- eSATA
- PXE
本文档中的示例使用 ISO 引导格式进行测试。
ReaR 可使用多个协议传输引导镜像,包括:
- HTTP/HTTPS
- SSH/SCP
- FTP/SFTP
- NFS
- CIFS (SMB)
为了备份和恢复 Red Hat OpenStack Platform 13 undercloud 和 overcloud Control Plane 节点,本文档中的示例是使用 NFS 进行测试。
1.2. 备份管理选项 复制链接链接已复制到粘贴板!
ReaR 可以使用内部和外部备份管理选项。
内部备份管理
内部备份选项包括:
-
tar -
rsync
外部备份管理
外部备份管理选项包括开源和专有解决方案。开源解决方案包括:
- bacula
- Bareos
专有解决方案包括:
- EMC NetWorker (Legato)
- HP DataProtector
- IBM Tivoli Storage Manager (TSM)
- Symantec NetBackup
第 2 章 准备备份节点 复制链接链接已复制到粘贴板!
在备份 undercloud 或 control plane 节点前,准备备份节点以接受备份镜像。
2.1. 准备 NFS 服务器 复制链接链接已复制到粘贴板!
ReaR 可以使用多个传输方法。红帽支持使用 NFS 在 ReaR 上备份和恢复。
在备份节点上安装 NFS 服务器。
yum install -y nfs-utils
[root@backup ~]# yum install -y nfs-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在防火墙中添加 NFS 服务,以确保端口
111和2049已打开。例如:firewall-cmd --add-service=nfs firewall-cmd --add-service=nfs --permanent
[root@backup ~]# firewall-cmd --add-service=nfs [root@backup ~]# firewall-cmd --add-service=nfs --permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用 NFS 服务器并启动它。
systemctl enable nfs-server systemctl restart nfs-server
[root@backup ~]# systemctl enable nfs-server [root@backup ~]# systemctl restart nfs-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2. 创建并导出备份目录 复制链接链接已复制到粘贴板!
要将备份 ISO 镜像从 undercloud 或 Control Plane 节点复制到备份节点,您必须创建备份目录。
前提条件
- 已安装并启用 NFS 服务器。如需更多信息,请参阅准备 NFS 服务器。
流程
创建备份目录:
mkdir /ctl_plane_backups
[root@backup ~]# mkdir /ctl_plane_backupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 导出 目录。将
<IP_ADDRESS/24> 替换为网络的 IP 地址和子网掩码:[root@backup ~]# cat >> /etc/exports << EOF /ctl_plane_backups <IP_ADDRESS/24>(rw,sync,no_root_squash,no_subtree_check) EOF
[root@backup ~]# cat >> /etc/exports << EOF /ctl_plane_backups <IP_ADDRESS/24>(rw,sync,no_root_squash,no_subtree_check) EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/exports文件中的条目位于以空格分隔的列表中。如果 undercloud 和 overcloud Control Plane 节点使用不同的网络或子网,请为每个网络或子网重复此步骤,如下例所示:cat >> /etc/exports << EOF /ctl_plane_backups 192.168.24.0/24(rw,sync,no_root_squash,no_subtree_check) / ctl_plane_backups 10.0.0.0/24(rw,sync,no_root_squash,no_subtree_check) / ctl_plane_backups 172.16.0.0/24(rw,sync,no_root_squash,no_subtree_check) EOF
cat >> /etc/exports << EOF /ctl_plane_backups 192.168.24.0/24(rw,sync,no_root_squash,no_subtree_check) / ctl_plane_backups 10.0.0.0/24(rw,sync,no_root_squash,no_subtree_check) / ctl_plane_backups 172.16.0.0/24(rw,sync,no_root_squash,no_subtree_check) EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 NFS 服务器:
systemctl restart nfs-server
[root@backup ~]# systemctl restart nfs-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证在 NFS 服务器中正确配置了条目:
showmount -e `hostname`
[root@backup ~]# showmount -e `hostname`Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 3 章 安装和配置 Relax 和 Recover (ReaR) 复制链接链接已复制到粘贴板!
要备份 undercloud 和 overcloud control plane,您必须首先在每个 control plane 节点上安装和配置 ReaR。
3.1. 安装 ReaR 复制链接链接已复制到粘贴板!
在备份 undercloud 和 control plane 前,您必须安装 Relax 和 Recover (ReaR)软件包和软件包,以便在 undercloud 节点上和每个 control plane 节点上生成 ISO 镜像。
流程
安装 ReaR 软件包和软件包,以便在 undercloud 节点和每个 control plane 节点上生成 ISO 镜像:
yum install rear genisoimage nfs-utils -y
[root@controller-x ~]# yum install rear genisoimage nfs-utils -yCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为了避免以后升级问题,请删除计划的 ReaR cron 任务:
rm -f /etc/cron.d/rear
[root@controller-x ~]# rm -f /etc/cron.d/rearCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 undercloud 和每个 control plane 节点上创建备份目录:
mkdir -p /ctl_plane_backups
[root@controller-x ~]# mkdir -p /ctl_plane_backupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
ctl_plane_backupsNFS 目录挂载在 undercloud 和每个 control plane 节点上运行 NFS 的备份节点:mount -t nfs <BACKUP_NODE_IP_ADDRESS>:/ctl_plane_backups /ctl_plane_backups
[root@controller-x ~]# mount -t nfs <BACKUP_NODE_IP_ADDRESS>:/ctl_plane_backups /ctl_plane_backupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<BACKUP_NODE_IP_ADDRESS> 替换为运行 NFS 服务器的备份节点的 IP 地址。
3.2. 创建 ReaR 配置文件 复制链接链接已复制到粘贴板!
在 undercloud 节点和每个 control plane 节点上安装 Relax 和 Recovery (ReaR)后,以 root 用户身份创建配置文件。
流程
创建 ReaR 配置文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<NODE_HOSTNAME> 替换为节点的主机名。例如,如果节点主机名是controller-0,请将 <NODE_HOSTNAME>替换为controller-0。 将
<BACKUP_NODE_IP_ADDRESS> 替换为运行 NFS 服务器的备份节点的 IP 地址。这是您在准备备份节点时配置的 IP 地址。更多信息请参阅 第 2 章 准备备份节点。重要如果 undercloud 或 control plane 节点使用引导模式 UEFI,您必须将
USING_UEFI_BOOTLOADER=1添加到 配置文件中。
-
将
如果您将 OVS 网桥用于网络接口,请将以下配置添加到
/etc/rear/local.conf文件中,使恢复过程通过网络检索备份:NETWORKING_PREPARATION_COMMANDS=('<command_1>' '<command_2>' ... '<command_n>')NETWORKING_PREPARATION_COMMANDS=('<command_1>' '<command_2>' ... '<command_n>')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<command_1> 以及最多 <command_n> 的所有命令替换为您需要配置网络配置的命令,例如:-
要配置 control plane 网桥名称,添加
ip link add br-ctlplane 类型 bridge命令。 -
要设置接口的名称,添加
ip link set eth0 up命令。
-
要配置 control plane 网桥名称,添加
创建
rescue.conf文件:[root@controller-x ~]# tee -a "/etc/rear/rescue.conf" > /dev/null <<'EOF' BACKUP_PROG_OPTIONS+=( --anchored --xattrs-include='*.*' --xattrs ) EOF
[root@controller-x ~]# tee -a "/etc/rear/rescue.conf" > /dev/null <<'EOF' BACKUP_PROG_OPTIONS+=( --anchored --xattrs-include='*.*' --xattrs ) EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 4 章 执行备份过程 复制链接链接已复制到粘贴板!
在执行快速升级前,备份 undercloud 和 overcloud control plane 节点,以便在出错时将其恢复到以前的状态。
在备份 undercloud 和 overcloud 之前,请确保您不会从 undercloud 对 overcloud 执行任何操作。
4.1. 在备份 undercloud 前执行先决条件任务 复制链接链接已复制到粘贴板!
在部署 undercloud 时或对现有 undercloud 进行更改时,请勿执行 undercloud 备份。
为防止数据崩溃,请确认没有堆栈失败和持续的任务,并且 mariadb 之外的所有 OpenStack 服务在备份 undercloud 节点前已停止。
流程
确认堆栈中没有失败。将
<STACKNAME> 替换为堆栈的名称。对部署和使用的每个堆栈使用 命令:openstack stack failures list <STACKNAME>
(undercloud) [stack@undercloud-0 ~]$ openstack stack failures list <STACKNAME>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证 undercloud 上没有持续的任务:
openstack stack list --nested | grep -v "_COMPLETE"
(undercloud) [stack@undercloud-0 ~]$ openstack stack list --nested | grep -v "_COMPLETE"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令没有返回结果,则没有持续的任务。
停止 undercloud 中的所有 OpenStack 服务:
systemctl stop openstack-* systemctl stop neutron-* systemctl stop ironic* systemctl stop haproxy systemctl stop httpd
# systemctl stop openstack-* # systemctl stop neutron-* # systemctl stop ironic* # systemctl stop haproxy # systemctl stop httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证
mariadb是否正在运行:sudo systemctl status mariadb
# sudo systemctl status mariadbCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2. 备份 undercloud 复制链接链接已复制到粘贴板!
要备份 undercloud 节点,您必须以 root 用户身份登录 undercloud 节点。作为前提条件,您必须备份数据库以确保您可以恢复数据库。
前提条件
- 您已创建并导出了备份目录。如需更多信息,请参阅创建并导出备份目录。
- 在备份 undercloud 前,您执行了必备的任务。如需更多信息,请参阅 备份 undercloud 前执行预备任务。
- 您已在每个 control plane 节点上安装和配置了 ReaR。如需更多信息,请参阅 安装和配置 Relax 和 Recover (ReaR)。
流程
查找数据库密码:
PASSWORD=$(sudo /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password)
[root@undercloud stack]# PASSWORD=$(sudo /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 备份数据库:
mysql -uroot -p$PASSWORD -s -N -e "select distinct table_schema from information_schema.tables where engine='innodb' and table_schema != 'mysql';" | xargs mysqldump -uroot -p$PASSWORD --single-transaction --databases > openstack-backup-mysql.sql
[root@undercloud stack]# mysql -uroot -p$PASSWORD -s -N -e "select distinct table_schema from information_schema.tables where engine='innodb' and table_schema != 'mysql';" | xargs mysqldump -uroot -p$PASSWORD --single-transaction --databases > openstack-backup-mysql.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -uroot -p$PASSWORD -s -N -e "SELECT CONCAT('\"SHOW GRANTS FOR ''',user,'''@''',host,''';\"') FROM mysql.user where (length(user) > 0 and user NOT LIKE 'root')" | xargs -n1 mysql -uroot -p$PASSWORD -s -N -e | sed 's/$/;/' > openstack-backup-mysql-grants.sql[root@undercloud stack]# mysql -uroot -p$PASSWORD -s -N -e "SELECT CONCAT('\"SHOW GRANTS FOR ''',user,'''@''',host,''';\"') FROM mysql.user where (length(user) > 0 and user NOT LIKE 'root')" | xargs -n1 mysql -uroot -p$PASSWORD -s -N -e | sed 's/$/;/' > openstack-backup-mysql-grants.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止
mariadb数据库服务:systemctl stop mariadb
[root@undercloud stack]# systemctl stop mariadbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建备份:
rear -d -v mkbackup
[root@undercloud stack]# rear -d -v mkbackupCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在
/ctl_plane_backups目录下找到您在备份节点上使用 ReaR 创建的备份 ISO 文件。重启 undercloud:
- 以 stack 用户身份登录 undercloud。
重启 undercloud:
sudo reboot
[stack@undercloud]$ sudo rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. 备份 control plane 复制链接链接已复制到粘贴板!
要备份 control plane,您必须首先停止 pacemaker 集群,以及 control plane 节点上运行的所有容器。不要操作堆栈以确保状态一致性。完成备份过程后,启动 pacemaker 集群和容器。
作为前提条件,您必须备份数据库,以确保在重启 pacemaker 集群和容器后可以恢复数据库。
同时备份 control plane 节点。
前提条件
- 您已创建并导出了备份目录。如需更多信息,请参阅创建并导出备份目录。
- 您已在每个 control plane 节点上安装和配置了 ReaR。如需更多信息,请参阅 安装和配置 Relax 和 Recover (ReaR)。
流程
查找数据库密码:
PASSWORD=$(sudo /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password)
[heat-admin@overcloud-controller-x ~]# PASSWORD=$(sudo /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 备份数据库:
mysql -uroot -p$PASSWORD -s -N -e "select distinct table_schema from information_schema.tables where engine='innodb' and table_schema != 'mysql';" | xargs mysqldump -uroot -p$PASSWORD --single-transaction --databases > openstack-backup-mysql.sql
[heat-admin@overcloud-controller-x ~]# mysql -uroot -p$PASSWORD -s -N -e "select distinct table_schema from information_schema.tables where engine='innodb' and table_schema != 'mysql';" | xargs mysqldump -uroot -p$PASSWORD --single-transaction --databases > openstack-backup-mysql.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -uroot -p$PASSWORD -s -N -e "SELECT CONCAT('\"SHOW GRANTS FOR ''',user,'''@''',host,''';\"') FROM mysql.user where (length(user) > 0 and user NOT LIKE 'root')" | xargs -n1 mysql -uroot -p$PASSWORD -s -N -e | sed 's/$/;/' > openstack-backup-mysql-grants.sql[heat-admin@overcloud-controller-x ~]# mysql -uroot -p$PASSWORD -s -N -e "SELECT CONCAT('\"SHOW GRANTS FOR ''',user,'''@''',host,''';\"') FROM mysql.user where (length(user) > 0 and user NOT LIKE 'root')" | xargs -n1 mysql -uroot -p$PASSWORD -s -N -e | sed 's/$/;/' > openstack-backup-mysql-grants.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意备份数据库是一种预报措施。此步骤可确保如果 Galera 集群没有自动恢复,则可以手动恢复 Galera 集群。有关恢复 Galera 集群的更多信息,请参阅 对 Galera 集群进行故障排除。
在其中一个 control plane 节点上,停止 pacemaker 集群:
重要不要操作堆栈。当您停止 pacemaker 集群和容器时,这会导致将 control plane 服务临时中断到 Compute 节点。网络连接、Ceph 和 NFS data plane 服务也会中断。您不能创建实例、迁移实例、验证请求或监控集群的运行状况,直到 pacemaker 集群和容器按照此流程的最后一步返回服务。
sudo pcs cluster stop --all
[heat-admin@overcloud-controller-x ~]# sudo pcs cluster stop --allCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个 control plane 节点上,停止容器:
停止容器:
sudo docker stop $(sudo docker ps -a -q)
[heat-admin@overcloud-controller-x ~]# sudo docker stop $(sudo docker ps -a -q)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 停止 ceph-mon@controller.service 容器:
sudo systemctl stop ceph-mon@$(hostname -s)
[heat-admin@overcloud-controller-x ~]# sudo systemctl stop ceph-mon@$(hostname -s)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 停止 ceph-mgr@controller.service 容器:
sudo systemctl stop ceph-mgr@$(hostname -s)
[heat-admin@overcloud-controller-x ~]# sudo systemctl stop ceph-mgr@$(hostname -s)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
可选:如果您使用
ganesha-nfs,请在一个控制器中禁用文件服务器:sudo pcs resource disable ceph-nfs
[heat-admin@overcloud-controller-x ~]# sudo pcs resource disable ceph-nfsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果您使用 ceph 服务
ceph-mds和ceph-rgw,请停止这些服务:sudo systemctl stop ceph-mds@$(hostname -s) sudo systemctl stop ceph-rgw@$(hostname -s)
[heat-admin@overcloud-controller-x ~]# sudo systemctl stop ceph-mds@$(hostname -s) [heat-admin@overcloud-controller-x ~]# sudo systemctl stop ceph-rgw@$(hostname -s)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要备份 control plane,请在每个 control plane 节点上运行 control plane 备份:
sudo rear -d -v mkbackup
[heat-admin@overcloud-controller-x ~]# sudo rear -d -v mkbackupCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在
/ctl_plane_backups目录下找到您在备份节点上使用 ReaR 创建的备份 ISO 文件。注意执行备份命令时,您可能会看到有关 tar 过程中忽略的
tar命令和套接字的警告信息,类似于以下警告:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当备份过程为每个 control plane 节点生成 ISO 镜像时,重启 pacemaker 集群。在其中一个 control plane 节点上,输入以下命令:
sudo pcs cluster start --all
[heat-admin@overcloud-controller-x ~]# sudo pcs cluster start --allCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个 control plane 节点上,启动容器:
启动容器:
sudo systemctl restart docker
[heat-admin@overcloud-controller-x ~]# sudo systemctl restart dockerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
ceph-mon@controller.service容器:sudo systemctl start ceph-mon@$(hostname -s)
[heat-admin@overcloud-controller-x ~]# sudo systemctl start ceph-mon@$(hostname -s)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
ceph-mgr@controller.service容器:sudo systemctl start ceph-mgr@$(hostname -s)
[heat-admin@overcloud-controller-x ~]# sudo systemctl start ceph-mgr@$(hostname -s)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
可选:如果您使用
ceph-mds和ceph-rgw,请启动这些服务:sudo systemctl start ceph-rgw@$(hostname -s) sudo systemctl start ceph-mds@$(hostname -s)
[heat-admin@overcloud-controller-x ~]# sudo systemctl start ceph-rgw@$(hostname -s) [heat-admin@overcloud-controller-x ~]# sudo systemctl start ceph-mds@$(hostname -s)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果您使用
ganesha-nfs,请在一个控制器中启用文件服务器:sudo pcs resource enable ceph-nfs
[heat-admin@overcloud-controller-x ~]# sudo pcs resource enable ceph-nfsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 执行恢复过程 复制链接链接已复制到粘贴板!
如果在更新或升级过程中发生错误,您可以恢复 undercloud 或 overcloud control plane 节点或两者,以便它们假定之前的状态。如果 Galera 集群没有自动恢复作为恢复过程的一部分,您必须手动恢复集群。
您还可以使用并置 ceph monitor 恢复 undercloud 或 overcloud control plane 节点。
从 ISO 文件引导时,请确保 NFS 服务器可由 undercloud 和 overcloud 访问。
使用以下常规步骤:
- 将可引导 ISO 镜像刻录到 DVD,或通过 ILO 远程访问将其加载。
- 引导需要从恢复介质中恢复的节点。
-
选择 Recover <HOSTNAME>。将
<HOSTNAME> 替换为要恢复的节点的名称。 -
以
root用户身份登录。 - 恢复备份。
5.1. 恢复 undercloud 复制链接链接已复制到粘贴板!
如果在快速升级过程中发生错误,您可以使用您使用 第 4.2 节 “备份 undercloud” 过程创建的 ISO 镜像将 undercloud 节点恢复到之前保存的状态。备份过程会在您在 第 2.2 节 “创建并导出备份目录” 步骤中创建的文件夹中将 ISO 镜像存储在备份节点上。
流程
- 关闭 undercloud 节点。在继续操作前,请确保 undercloud 节点已完全关闭。
-
使用备份过程中创建的 ISO 镜像引导它,以恢复 undercloud 节点。ISO 镜像位于备份节点的
/ctl_plane_backups目录下。 - 出现 Relax-and-Recover 引导菜单时,选择 Recover <UNDERCLOUD_NODE>,其中 <UNDERCLOUD_NODE> 是 undercloud 节点的名称。
以
root用户身份登录。这时将显示以下信息:
Welcome to Relax-and-Recover. Run "rear recover" to restore your system! RESCUE <UNDERCLOUD_NODE>:~ # rear recover
Welcome to Relax-and-Recover. Run "rear recover" to restore your system! RESCUE <UNDERCLOUD_NODE>:~ # rear recoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 镜像恢复过程会快速进行。完成后,控制台会从以下消息中回显:
Finished recovering your system Exiting rear recover Running exit tasks
Finished recovering your system Exiting rear recover Running exit tasksCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当命令行界面可用时,镜像会被恢复。关闭节点。
RESCUE <UNDERCLOUD_NODE>:~ # poweroff
RESCUE <UNDERCLOUD_NODE>:~ # poweroffCopy to Clipboard Copied! Toggle word wrap Toggle overflow 引导时,节点会恢复之前的状态。
5.2. 恢复 control plane 复制链接链接已复制到粘贴板!
如果在快速升级过程中发生错误,您可以使用使用 第 4.3 节 “备份 control plane” 过程创建的 ISO 镜像将 control plane 节点恢复到之前保存的状态。要恢复 control plane,必须将所有 control plane 节点恢复到以前的状态,以确保状态一致性。
红帽支持使用原生 SDN 备份 Red Hat OpenStack Platform,如 Open vSwitch (OVS)和默认的 Open Virtual Network (OVN)。有关第三方 SDN 的信息,请参阅第三方 SDN 文档。
流程
- 关闭每个 control plane 节点。确保 control plane 节点在进行前完全关闭。
-
使用您在备份过程中创建的 ISO 镜像引导 control plane 节点。ISO 镜像位于备份节点的
/ctl_plane_backups目录下。 出现 Relax-and-Recover boot 菜单时,选择 Recover <CONTROL_PLANE_NODE>。将 <CONTROL_PLANE_NODE> 替换为 control plane 节点的名称。
这时将显示以下信息:
Welcome to Relax-and-Recover. Run "rear recover" to restore your system! RESCUE <CONTROL_PLANE_NODE>:~ # rear recover
Welcome to Relax-and-Recover. Run "rear recover" to restore your system! RESCUE <CONTROL_PLANE_NODE>:~ # rear recoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 镜像恢复过程会快速进行。恢复完成后,控制台会显示以下信息:
Finished recovering your system Exiting rear recover Running exit tasks
Finished recovering your system Exiting rear recover Running exit tasksCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当命令行界面可用时,镜像会被恢复。关闭节点。
RESCUE <CONTROL_PLANE_NODE>:~ # poweroff
RESCUE <CONTROL_PLANE_NODE>:~ # poweroffCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将引导序列设置为正常引导设备。引导时,节点会恢复之前的状态。
为确保服务正确运行,请检查 pacemaker 的状态。以
root用户身份登录控制器,再运行以下命令:pcs status
# pcs statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 要查看 overcloud 的状态,可使用 Tempest。有关 Tempest 的更多信息,请参阅 OpenStack Integration Test Suite 指南 的第 4 章。
5.3. Galera 集群故障排除 复制链接链接已复制到粘贴板!
如果 Galera 集群没有作为恢复过程的一部分恢复,您必须手动恢复 Galera。
在这一流程中,您必须在一个 Controller 节点上执行一些步骤。确保您在完成流程相同的 Controller 节点上执行这些步骤。
流程
在 Controller-0 上,检索 Galera 集群虚拟 IP:
sudo hiera -c /etc/puppet/hiera.yaml mysql_vip
$ sudo hiera -c /etc/puppet/hiera.yaml mysql_vipCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过所有 Controller 节点上的虚拟 IP 禁用数据库连接:
sudo iptables -I INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
$ sudo iptables -I INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROPCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,检索 MySQL root 密码:
sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password
$ sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,将 Galera 资源设置为
非受管模式:sudo pcs resource unmanage galera-bundle
$ sudo pcs resource unmanage galera-bundleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止所有 Controller 节点上的 MySQL 容器:
sudo docker container stop $(sudo docker container ls --all --format “{{.Names}}” --filter=name=galera-bundle)$ sudo docker container stop $(sudo docker container ls --all --format “{{.Names}}” --filter=name=galera-bundle)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上移动当前目录:
sudo mv /var/lib/mysql /var/lib/mysql-save
$ sudo mv /var/lib/mysql /var/lib/mysql-saveCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上创建新目录
/var/lib/mysq:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动所有 Controller 节点上的 MySQL 容器:
sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)$ sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上创建 MySQL 数据库:
sudo docker exec -i $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql_install_db --datadir=/var/lib/mysql --user=mysql"$ sudo docker exec -i $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql_install_db --datadir=/var/lib/mysql --user=mysql"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动所有 Controller 节点上的数据库:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF" &$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF" &Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上移动
.my.cnfGalera 配置文件:sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf /root/.my.cnf.bck"$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf /root/.my.cnf.bck"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重置所有 Controller 节点上的 Galera root 密码:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -uroot -e'use mysql;update user set password=PASSWORD(\"$ROOTPASSWORD\")where User=\"root\";flush privileges;'"$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -uroot -e'use mysql;update user set password=PASSWORD(\"$ROOTPASSWORD\")where User=\"root\";flush privileges;'"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 恢复所有 Controller 节点上的 Galera 容器中的
.my.cnfGalera 配置文件:sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf.bck /root/.my.cnf"$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf.bck /root/.my.cnf"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,将备份数据库文件复制到
/var/lib/MySQL:sudo cp $BACKUP_FILE /var/lib/mysql sudo cp $BACKUP_GRANT_FILE /var/lib/mysql
$ sudo cp $BACKUP_FILE /var/lib/mysql $ sudo cp $BACKUP_GRANT_FILE /var/lib/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意这些文件的路径为 /home/heat-admin/。
在 Controller-0 上,恢复 MySQL 数据库:
sudo docker exec $(docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_FILE \" " sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_GRANT_FILE \" "$ sudo docker exec $(docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_FILE \" " $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_GRANT_FILE \" "Copy to Clipboard Copied! Toggle word wrap Toggle overflow 关闭所有 Controller 节点上的数据库:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqladmin shutdown"$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqladmin shutdown"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,启动 bootstrap 节点:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql \ --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=gcomm:// &$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql \ --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=gcomm:// &Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证:在 Controller-0 上,检查集群的状态:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保显示以下信息:"Galera 集群节点同步",否则您必须重新创建该节点。
在 Controller-0 上,从配置检索集群地址:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "grep wsrep_cluster_address /etc/my.cnf.d/galera.cnf" | awk '{print $3}'$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "grep wsrep_cluster_address /etc/my.cnf.d/galera.cnf" | awk '{print $3}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个剩余的 Controller 节点上,启动数据库并验证集群:
启动数据库:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock \ --datadir=/var/lib/mysql --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=$CLUSTER_ADDRESS &$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock \ --datadir=/var/lib/mysql --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=$CLUSTER_ADDRESS &Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 MYSQL 集群的状态:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保显示以下信息:"Galera 集群节点同步",否则您必须重新创建该节点。
停止所有 Controller 节点上的 MySQL 容器:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqladmin -u root shutdown$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqladmin -u root shutdownCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上,删除以下防火墙规则,以允许通过虚拟 IP 地址进行数据库连接:
sudo iptables -D INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
$ sudo iptables -D INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROPCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上重启 MySQL 容器:
sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启所有 Controller 节点上的
clustercheck容器:sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=clustercheck)$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=clustercheck)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,将 Galera 资源设置为
受管模式:sudo pcs resource manage galera-bundle
$ sudo pcs resource manage galera-bundleCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.4. 使用并置 Ceph 监控器恢复 undercloud 和 control plane 节点 复制链接链接已复制到粘贴板!
如果在更新或升级过程中发生错误,您可以使用 ReaR 备份将 undercloud 或 overcloud control plane 节点或两者恢复到之前的状态。
前提条件
- 安装和配置 ReaR。如需更多信息,请参阅 安装和配置 ReaR。
- 准备备份节点。如需更多信息,请参阅准备 备份节点。
- 执行备份过程。如需更多信息,请参阅 执行备份过程。
流程
在备份节点上,导出 NFS 目录以托管 Ceph 备份。将
<IP_ADDRESS/24> 替换为网络的 IP 地址和子网掩码:[root@backup ~]# cat >> /etc/exports << EOF /ceph_backups <IP_ADDRESS/24>(rw,sync,no_root_squash,no_subtree_check) EOF
[root@backup ~]# cat >> /etc/exports << EOF /ceph_backups <IP_ADDRESS/24>(rw,sync,no_root_squash,no_subtree_check) EOFCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 undercloud 节点上,提供 undercloud 凭证并运行以下脚本:
source stackrc
# source stackrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow #! /bin/bash for i in `openstack server list -c Name -c Networks -f value | grep controller | awk -F'=' '{print $2}' | awk -F' ' '{print $1}'`; do ssh -q heat-admin@$i 'sudo systemctl stop ceph-mon@$(hostname -s) ceph-mgr@$(hostname -s)'; done#! /bin/bash for i in `openstack server list -c Name -c Networks -f value | grep controller | awk -F'=' '{print $2}' | awk -F' ' '{print $1}'`; do ssh -q heat-admin@$i 'sudo systemctl stop ceph-mon@$(hostname -s) ceph-mgr@$(hostname -s)'; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证
ceph-mgr@controller.service容器是否已停止,请输入以下命令:sudo docker ps | grep ceph
[heat-admin@overcloud-controller-x ~]# sudo docker ps | grep cephCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 undercloud 节点上,提供 undercloud 凭证并运行以下脚本:
source stackrc
# source stackrcCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在您要恢复的节点上完成以下任务:
- 在继续操作前关闭该节点。
-
使用您在备份过程中创建的 ReaR 备份文件恢复节点。该文件位于备份节点的
/ceph_backups目录中。 -
在
Relax-and-Recoverboot 菜单中,选择Recover <CONTROL_PLANE_NODE>,其中 <CONTROL_PLANE_NODE> 是 control plane 节点的名称。 在提示符处输入以下命令:
RESCUE <CONTROL_PLANE_NODE> :~ # rear recover
RESCUE <CONTROL_PLANE_NODE> :~ # rear recoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 镜像恢复过程完成后,控制台会显示以下信息:
Finished recovering your system Exiting rear recover Running exit tasks
Finished recovering your system Exiting rear recover Running exit tasksCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于您要恢复的节点,将
/ceph_backups目录中的 Ceph 备份复制到/var/lib/ceph目录中:确定系统挂载点:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /dev/vda2文件系统被挂载到/mnt/local上。创建临时目录:
RESCUE <CONTROL_PLANE_NODE>:~ # mkdir /tmp/restore RESCUE <CONTROL_PLANE_NODE>:~ # mount -v -t nfs -o rw,noatime <BACKUP_NODE_IP_ADDRESS>:/ceph_backups /tmp/restore/
RESCUE <CONTROL_PLANE_NODE>:~ # mkdir /tmp/restore RESCUE <CONTROL_PLANE_NODE>:~ # mount -v -t nfs -o rw,noatime <BACKUP_NODE_IP_ADDRESS>:/ceph_backups /tmp/restore/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 control plane 节点上,删除现有
/var/lib/ceph目录:RESCUE <CONTROL_PLANE_NODE>:~ # rm -rf /mnt/local/var/lib/ceph/*
RESCUE <CONTROL_PLANE_NODE>:~ # rm -rf /mnt/local/var/lib/ceph/*Copy to Clipboard Copied! Toggle word wrap Toggle overflow 恢复前面的 Ceph 映射。将
<CONTROL_PLANE_NODE> 替换为 control plane 节点的名称:RESCUE <CONTROL_PLANE_NODE>:~ # tar -xvC /mnt/local/ -f /tmp/restore/<CONTROL_PLANE_NODE>/<CONTROL_PLANE_NODE>.tar.gz --xattrs --xattrs-include='*.*' var/lib/ceph
RESCUE <CONTROL_PLANE_NODE>:~ # tar -xvC /mnt/local/ -f /tmp/restore/<CONTROL_PLANE_NODE>/<CONTROL_PLANE_NODE>.tar.gz --xattrs --xattrs-include='*.*' var/lib/cephCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证文件是否已恢复:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
关闭节点:
RESCUE <CONTROL_PLANE_NODE> :~ # poweroff
RESCUE <CONTROL_PLANE_NODE> :~ # poweroffCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 打开节点。节点恢复之前的状态。