undercloud 和 Control Plane 备份和恢复


Red Hat OpenStack Platform 13

在更新和升级过程中备份和恢复 undercloud 和 overcloud control plane 的步骤

摘要

本指南说明了如何在 undercloud 和 overcloud control plane 节点上安装和配置 Relax-and-Recover (ReaR);如何在更新和升级前备份 undercloud 和 Control Plane 节点;以及,如何在更新或升级时恢复 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 上备份和恢复。

  1. 在备份节点上安装 NFS 服务器。

    [root@backup ~]# yum install -y nfs-utils
    Copy to Clipboard Toggle word wrap
  2. 在防火墙中添加 NFS 服务,以确保端口 1112049 已打开。例如:

    [root@backup ~]# firewall-cmd --add-service=nfs
    [root@backup ~]# firewall-cmd --add-service=nfs --permanent
    Copy to Clipboard Toggle word wrap
  3. 启用 NFS 服务器并启动它。

    [root@backup ~]# systemctl enable nfs-server
    [root@backup ~]# systemctl restart nfs-server
    Copy to Clipboard Toggle word wrap

2.2. 创建并导出备份目录

要将备份 ISO 镜像从 undercloud 或 Control Plane 节点复制到备份节点,您必须创建备份目录。

前提条件

流程

  1. 创建备份目录:

    [root@backup ~]# mkdir /ctl_plane_backups
    Copy to Clipboard Toggle word wrap
  2. 导出 目录。将 <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
    Copy to Clipboard Toggle word wrap

    /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
    Copy to Clipboard Toggle word wrap
  3. 重启 NFS 服务器:

    [root@backup ~]# systemctl restart nfs-server
    Copy to Clipboard Toggle word wrap
  4. 验证在 NFS 服务器中正确配置了条目:

    [root@backup ~]# showmount -e `hostname`
    Copy to Clipboard Toggle word wrap

第 3 章 安装和配置 Relax 和 Recover (ReaR)

要备份 undercloud 和 overcloud control plane,您必须首先在每个 control plane 节点上安装和配置 ReaR。

3.1. 安装 ReaR

在备份 undercloud 和 control plane 前,您必须安装 Relax 和 Recover (ReaR)软件包和软件包,以便在 undercloud 节点上和每个 control plane 节点上生成 ISO 镜像。

流程

  1. 安装 ReaR 软件包和软件包,以便在 undercloud 节点和每个 control plane 节点上生成 ISO 镜像:

    [root@controller-x ~]# yum install rear genisoimage nfs-utils -y
    Copy to Clipboard Toggle word wrap
  2. 为了避免以后升级问题,请删除计划的 ReaR cron 任务:

    [root@controller-x ~]# rm -f /etc/cron.d/rear
    Copy to Clipboard Toggle word wrap
  3. 在 undercloud 和每个 control plane 节点上创建备份目录:

    [root@controller-x ~]# mkdir -p /ctl_plane_backups
    Copy to Clipboard Toggle word wrap
  4. ctl_plane_backups NFS 目录挂载在 undercloud 和每个 control plane 节点上运行 NFS 的备份节点:

    [root@controller-x ~]# mount -t nfs  <BACKUP_NODE_IP_ADDRESS>:/ctl_plane_backups /ctl_plane_backups
    Copy to Clipboard Toggle word wrap

    <BACKUP_NODE_IP_ADDRESS > 替换为运行 NFS 服务器的备份节点的 IP 地址。

3.2. 创建 ReaR 配置文件

在 undercloud 节点和每个 control plane 节点上安装 Relax 和 Recovery (ReaR)后,以 root 用户身份创建配置文件。

流程

  1. 创建 ReaR 配置文件:

    [root@controller-x ~]# mkdir -p /etc/rear
    [root@controller-x ~]# tee -a "/etc/rear/local.conf" > /dev/null <<'EOF'
    OUTPUT=ISO
    OUTPUT_URL=nfs://<BACKUP_NODE_IP_ADDRESS>/ctl_plane_backups
    ISO_PREFIX=<NODE_HOSTNAME>
    BACKUP=NETFS
    BACKUP_PROG_COMPRESS_OPTIONS=( --gzip )
    BACKUP_PROG_COMPRESS_SUFFIX=".gz"
    BACKUP_PROG_EXCLUDE=( '/tmp/*' '/data/*' )
    BACKUP_URL=nfs://<BACKUP_NODE_IP_ADDRESS>/ctl_plane_backups
    BACKUP_PROG_EXCLUDE=("${BACKUP_PROG_EXCLUDE[@]}" '/media' '/var/tmp' '/var/crash')
    BACKUP_PROG_OPTIONS+=( --anchored --xattrs-include='*.*' --xattrs )
    EOF
    Copy to Clipboard Toggle word wrap
    • <NODE_HOSTNAME > 替换为节点的主机名。例如,如果节点主机名是 controller-0,请将 < NODE_HOSTNAME> 替换为 controller-0
    • <BACKUP_NODE_IP_ADDRESS > 替换为运行 NFS 服务器的备份节点的 IP 地址。这是您在准备备份节点时配置的 IP 地址。更多信息请参阅 第 2 章 准备备份节点

      重要

      如果 undercloud 或 control plane 节点使用引导模式 UEFI,您必须将 USING_UEFI_BOOTLOADER=1 添加到 配置文件中。

  2. 如果您将 OVS 网桥用于网络接口,请将以下配置添加到 /etc/rear/local.conf 文件中,使恢复过程通过网络检索备份:

    NETWORKING_PREPARATION_COMMANDS=('<command_1>' '<command_2>' ... '<command_n>')
    Copy to Clipboard Toggle word wrap

    <command_ 1> 以及最多 < command_n > 的所有命令替换为您需要配置网络配置的命令,例如:

    • 要配置 control plane 网桥名称,添加 ip link add br-ctlplane 类型 bridge 命令。
    • 要设置接口的名称,添加 ip link set eth0 up 命令。
  3. 创建 rescue.conf 文件:

    [root@controller-x ~]# tee  -a "/etc/rear/rescue.conf" > /dev/null <<'EOF'
    BACKUP_PROG_OPTIONS+=( --anchored --xattrs-include='*.*' --xattrs )
    EOF
    Copy to Clipboard Toggle word wrap

第 4 章 执行备份过程

在执行快速升级前,备份 undercloud 和 overcloud control plane 节点,以便在出错时将其恢复到以前的状态。

注意

在备份 undercloud 和 overcloud 之前,请确保您不会从 undercloud 对 overcloud 执行任何操作。

4.1. 在备份 undercloud 前执行先决条件任务

在部署 undercloud 时或对现有 undercloud 进行更改时,请勿执行 undercloud 备份。

为防止数据崩溃,请确认没有堆栈失败和持续的任务,并且 mariadb 之外的所有 OpenStack 服务在备份 undercloud 节点前已停止。

流程

  1. 确认堆栈中没有失败。将 <STACKNAME > 替换为堆栈的名称。对部署和使用的每个堆栈使用 命令:

    (undercloud) [stack@undercloud-0 ~]$ openstack stack failures list <STACKNAME>
    Copy to Clipboard Toggle word wrap
  2. 验证 undercloud 上没有持续的任务:

    (undercloud) [stack@undercloud-0 ~]$ openstack stack list --nested | grep -v "_COMPLETE"
    Copy to Clipboard Toggle word wrap

    如果命令没有返回结果,则没有持续的任务。

  3. 停止 undercloud 中的所有 OpenStack 服务:

    # systemctl stop openstack-*
    # systemctl stop neutron-*
    # systemctl stop ironic*
    # systemctl stop haproxy
    # systemctl stop httpd
    Copy to Clipboard Toggle word wrap
  4. 验证 mariadb 是否正在运行:

    # sudo systemctl status mariadb
    Copy to Clipboard Toggle word wrap

4.2. 备份 undercloud

要备份 undercloud 节点,您必须以 root 用户身份登录 undercloud 节点。作为前提条件,您必须备份数据库以确保您可以恢复数据库。

前提条件

流程

  1. 查找数据库密码:

    [root@undercloud stack]# PASSWORD=$(sudo /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password)
    Copy to Clipboard Toggle word wrap
  2. 备份数据库:

    [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.sql
    Copy to Clipboard Toggle word wrap
    [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.sql
    Copy to Clipboard Toggle word wrap
  3. 停止 mariadb 数据库服务:

    [root@undercloud stack]# systemctl stop mariadb
    Copy to Clipboard Toggle word wrap
  4. 创建备份:

    [root@undercloud stack]# rear -d -v mkbackup
    Copy to Clipboard Toggle word wrap

    您可以在 /ctl_plane_backups 目录下找到您在备份节点上使用 ReaR 创建的备份 ISO 文件。

  5. 重启 undercloud:

    1. 以 stack 用户身份登录 undercloud。
    2. 重启 undercloud:

      [stack@undercloud]$ sudo reboot
      Copy to Clipboard Toggle word wrap

4.3. 备份 control plane

要备份 control plane,您必须首先停止 pacemaker 集群,以及 control plane 节点上运行的所有容器。不要操作堆栈以确保状态一致性。完成备份过程后,启动 pacemaker 集群和容器。

作为前提条件,您必须备份数据库,以确保在重启 pacemaker 集群和容器后可以恢复数据库。

同时备份 control plane 节点。

前提条件

流程

  1. 查找数据库密码:

    [heat-admin@overcloud-controller-x ~]# PASSWORD=$(sudo /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password)
    Copy to Clipboard Toggle word wrap
  2. 备份数据库:

    [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.sql
    Copy to Clipboard Toggle word wrap
    [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.sql
    Copy to Clipboard Toggle word wrap
    注意

    备份数据库是一种预报措施。此步骤可确保如果 Galera 集群没有自动恢复,则可以手动恢复 Galera 集群。有关恢复 Galera 集群的更多信息,请参阅 对 Galera 集群进行故障排除

  3. 在其中一个 control plane 节点上,停止 pacemaker 集群:

    重要

    不要操作堆栈。当您停止 pacemaker 集群和容器时,这会导致将 control plane 服务临时中断到 Compute 节点。网络连接、Ceph 和 NFS data plane 服务也会中断。您不能创建实例、迁移实例、验证请求或监控集群的运行状况,直到 pacemaker 集群和容器按照此流程的最后一步返回服务。

    [heat-admin@overcloud-controller-x ~]# sudo pcs cluster stop --all
    Copy to Clipboard Toggle word wrap
  4. 在每个 control plane 节点上,停止容器:

    1. 停止容器:

      [heat-admin@overcloud-controller-x ~]# sudo docker stop $(sudo docker ps -a -q)
      Copy to Clipboard Toggle word wrap
    2. 停止 ceph-mon@controller.service 容器:

      [heat-admin@overcloud-controller-x ~]# sudo systemctl stop ceph-mon@$(hostname -s)
      Copy to Clipboard Toggle word wrap
    3. 停止 ceph-mgr@controller.service 容器:

      [heat-admin@overcloud-controller-x ~]# sudo systemctl stop ceph-mgr@$(hostname -s)
      Copy to Clipboard Toggle word wrap
  5. 可选:如果您使用 ganesha-nfs,请在一个控制器中禁用文件服务器:

    [heat-admin@overcloud-controller-x ~]# sudo pcs resource disable ceph-nfs
    Copy to Clipboard Toggle word wrap
  6. 可选:如果您使用 ceph 服务 ceph-mdsceph-rgw,请停止这些服务:

    [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 Toggle word wrap
  7. 要备份 control plane,请在每个 control plane 节点上运行 control plane 备份:

    [heat-admin@overcloud-controller-x ~]# sudo rear -d -v mkbackup
    Copy to Clipboard Toggle word wrap

    您可以在 /ctl_plane_backups 目录下找到您在备份节点上使用 ReaR 创建的备份 ISO 文件。

    注意

    执行备份命令时,您可能会看到有关 tar 过程中忽略的 tar 命令和套接字的警告信息,类似于以下警告:

    WARNING: tar ended with return code 1 and below output:
    ---snip---
    tar: /var/spool/postfix/public/qmgr: socket ignored
    ...
    ...
    This message indicates that files have been modified during the archiving process and the backup might be inconsistent. Relax-and-Recover continues to operate, however, it is important that you verify the backup to ensure that you can use this backup to recover your system.
    Copy to Clipboard Toggle word wrap
  8. 当备份过程为每个 control plane 节点生成 ISO 镜像时,重启 pacemaker 集群。在其中一个 control plane 节点上,输入以下命令:

    [heat-admin@overcloud-controller-x ~]# sudo pcs cluster start --all
    Copy to Clipboard Toggle word wrap
  9. 在每个 control plane 节点上,启动容器:

    1. 启动容器:

      [heat-admin@overcloud-controller-x ~]# sudo systemctl restart docker
      Copy to Clipboard Toggle word wrap
    2. 启动 ceph-mon@controller.service 容器:

      [heat-admin@overcloud-controller-x ~]# sudo systemctl start ceph-mon@$(hostname -s)
      Copy to Clipboard Toggle word wrap
    3. 启动 ceph-mgr@controller.service 容器:

      [heat-admin@overcloud-controller-x ~]# sudo systemctl start ceph-mgr@$(hostname -s)
      Copy to Clipboard Toggle word wrap
  10. 可选:如果您使用 ceph-mdsceph-rgw,请启动这些服务:

    [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 Toggle word wrap
  11. 可选:如果您使用 ganesha-nfs,请在一个控制器中启用文件服务器:

    [heat-admin@overcloud-controller-x ~]# sudo pcs resource enable ceph-nfs
    Copy to Clipboard Toggle word wrap

第 5 章 执行恢复过程

如果在更新或升级过程中发生错误,您可以恢复 undercloud 或 overcloud control plane 节点或两者,以便它们假定之前的状态。如果 Galera 集群没有自动恢复作为恢复过程的一部分,您必须手动恢复集群。

您还可以使用并置 ceph monitor 恢复 undercloud 或 overcloud control plane 节点。

注意

从 ISO 文件引导时,请确保 NFS 服务器可由 undercloud 和 overcloud 访问。

使用以下常规步骤:

  1. 将可引导 ISO 镜像刻录到 DVD,或通过 ILO 远程访问将其加载。
  2. 引导需要从恢复介质中恢复的节点。
  3. 选择 Recover <HOSTNAME>。将 <HOSTNAME > 替换为要恢复的节点的名称。
  4. root 用户身份登录。
  5. 恢复备份。

5.1. 恢复 undercloud

如果在快速升级过程中发生错误,您可以使用您使用 第 4.2 节 “备份 undercloud” 过程创建的 ISO 镜像将 undercloud 节点恢复到之前保存的状态。备份过程会在您在 第 2.2 节 “创建并导出备份目录” 步骤中创建的文件夹中将 ISO 镜像存储在备份节点上。

流程

  1. 关闭 undercloud 节点。在继续操作前,请确保 undercloud 节点已完全关闭。
  2. 使用备份过程中创建的 ISO 镜像引导它,以恢复 undercloud 节点。ISO 镜像位于备份节点的 /ctl_plane_backups 目录下。
  3. 出现 Relax-and-Recover 引导菜单时,选择 Recover <UNDERCLOUD_NODE>,其中 <UNDERCLOUD_NODE> 是 undercloud 节点的名称。
  4. root 用户身份登录。

    这时将显示以下信息:

    Welcome to Relax-and-Recover. Run "rear recover" to restore your system!
    RESCUE <UNDERCLOUD_NODE>:~ # rear recover
    Copy to Clipboard Toggle word wrap

    镜像恢复过程会快速进行。完成后,控制台会从以下消息中回显:

    Finished recovering your system
    Exiting rear recover
    Running exit tasks
    Copy to Clipboard Toggle word wrap
  5. 当命令行界面可用时,镜像会被恢复。关闭节点。

    RESCUE <UNDERCLOUD_NODE>:~ #  poweroff
    Copy to Clipboard Toggle word wrap

    引导时,节点会恢复之前的状态。

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 文档。

流程

  1. 关闭每个 control plane 节点。确保 control plane 节点在进行前完全关闭。
  2. 使用您在备份过程中创建的 ISO 镜像引导 control plane 节点。ISO 镜像位于备份节点的 /ctl_plane_backups 目录下。
  3. 出现 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
    Copy to Clipboard Toggle word wrap

    镜像恢复过程会快速进行。恢复完成后,控制台会显示以下信息:

    Finished recovering your system
    Exiting rear recover
    Running exit tasks
    Copy to Clipboard Toggle word wrap

    当命令行界面可用时,镜像会被恢复。关闭节点。

    RESCUE <CONTROL_PLANE_NODE>:~ #  poweroff
    Copy to Clipboard Toggle word wrap

    将引导序列设置为正常引导设备。引导时,节点会恢复之前的状态。

  4. 为确保服务正确运行,请检查 pacemaker 的状态。以 root 用户身份登录控制器,再运行以下命令:

    # pcs status
    Copy to Clipboard Toggle word wrap
  5. 要查看 overcloud 的状态,可使用 Tempest。有关 Tempest 的更多信息,请参阅 OpenStack Integration Test Suite 指南 的第 4 章。

5.3. Galera 集群故障排除

如果 Galera 集群没有作为恢复过程的一部分恢复,您必须手动恢复 Galera。

注意

在这一流程中,您必须在一个 Controller 节点上执行一些步骤。确保您在完成流程相同的 Controller 节点上执行这些步骤。

流程

  1. 在 Controller-0 上,检索 Galera 集群虚拟 IP:

    $ sudo hiera -c /etc/puppet/hiera.yaml mysql_vip
    Copy to Clipboard Toggle word wrap
  2. 通过所有 Controller 节点上的虚拟 IP 禁用数据库连接:

    $ sudo iptables -I INPUT  -p tcp --destination-port 3306 -d $MYSQL_VIP  -j DROP
    Copy to Clipboard Toggle word wrap
  3. 在 Controller-0 上,检索 MySQL root 密码:

    $ sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password
    Copy to Clipboard Toggle word wrap
  4. 在 Controller-0 上,将 Galera 资源设置为 非受管 模式:

    $ sudo pcs resource unmanage galera-bundle
    Copy to Clipboard Toggle word wrap
  5. 停止所有 Controller 节点上的 MySQL 容器:

    $ sudo docker container stop $(sudo docker container ls --all --format{{.Names}}--filter=name=galera-bundle)
    Copy to Clipboard Toggle word wrap
  6. 在所有 Controller 节点上移动当前目录:

    $ sudo mv /var/lib/mysql /var/lib/mysql-save
    Copy to Clipboard Toggle word wrap
  7. 在所有 Controller 节点上创建新目录 /var/lib/mysq

    $ sudo mkdir /var/lib/mysql
    $ sudo chown 42434:42434 /var/lib/mysql
    $ sudo chcon -t container_file_t /var/lib/mysql
    $ sudo chmod 0755 /var/lib/mysql
    $ sudo chcon -r object_r /var/lib/mysql
    $ sudo chcon -u system_u /var/lib/mysql
    Copy to Clipboard Toggle word wrap
  8. 启动所有 Controller 节点上的 MySQL 容器:

    $ sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
    Copy to Clipboard Toggle word wrap
  9. 在所有 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"
    Copy to Clipboard Toggle word wrap
  10. 启动所有 Controller 节点上的数据库:

    $ 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 Toggle word wrap
  11. 在所有 Controller 节点上移动 .my.cnf Galera 配置文件:

    $ 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 Toggle word wrap
  12. 重置所有 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;'"
    Copy to Clipboard Toggle word wrap
  13. 恢复所有 Controller 节点上的 Galera 容器中的 .my.cnf Galera 配置文件:

    $ 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 Toggle word wrap
  14. 在 Controller-0 上,将备份数据库文件复制到 /var/lib/MySQL

    $ sudo cp $BACKUP_FILE /var/lib/mysql
    $ sudo cp $BACKUP_GRANT_FILE /var/lib/mysql
    Copy to Clipboard Toggle word wrap
    注意

    这些文件的路径为 /home/heat-admin/。

  15. 在 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 \"  "
    Copy to Clipboard Toggle word wrap
  16. 关闭所有 Controller 节点上的数据库:

    $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}"    \
          --filter=name=galera-bundle) bash -c "mysqladmin shutdown"
    Copy to Clipboard Toggle word wrap
  17. 在 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:// &
    Copy to Clipboard Toggle word wrap
  18. 验证:在 Controller-0 上,检查集群的状态:

    $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \
             --filter=name=galera-bundle) bash -c "clustercheck"
    Copy to Clipboard Toggle word wrap

    确保显示以下信息:"Galera 集群节点同步",否则您必须重新创建该节点。

  19. 在 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}'
    Copy to Clipboard Toggle word wrap
  20. 在每个剩余的 Controller 节点上,启动数据库并验证集群:

    1. 启动数据库:

      $ 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 Toggle word wrap
    2. 检查 MYSQL 集群的状态:

      $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \
               --filter=name=galera-bundle) bash -c "clustercheck"
      Copy to Clipboard Toggle word wrap

      确保显示以下信息:"Galera 集群节点同步",否则您必须重新创建该节点。

  21. 停止所有 Controller 节点上的 MySQL 容器:

    $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \
            /usr/bin/mysqladmin -u root shutdown
    Copy to Clipboard Toggle word wrap
  22. 在所有 Controller 节点上,删除以下防火墙规则,以允许通过虚拟 IP 地址进行数据库连接:

    $ sudo iptables -D  INPUT  -p tcp --destination-port 3306 -d $MYSQL_VIP  -j DROP
    Copy to Clipboard Toggle word wrap
  23. 在所有 Controller 节点上重启 MySQL 容器:

    $ sudo docker container restart $(sudo docker container ls --all --format  "{{ .Names }}" --filter=name=galera-bundle)
    Copy to Clipboard Toggle word wrap
  24. 重启所有 Controller 节点上的 clustercheck 容器:

    $ sudo docker container restart $(sudo docker container ls --all --format  "{{ .Names }}" --filter=name=clustercheck)
    Copy to Clipboard Toggle word wrap
  25. 在 Controller-0 上,将 Galera 资源设置为 受管 模式:

    $ sudo pcs resource manage galera-bundle
    Copy to Clipboard Toggle word wrap

如果在更新或升级过程中发生错误,您可以使用 ReaR 备份将 undercloud 或 overcloud control plane 节点或两者恢复到之前的状态。

前提条件

流程

  1. 在备份节点上,导出 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
    Copy to Clipboard Toggle word wrap
  2. 在 undercloud 节点上,提供 undercloud 凭证并运行以下脚本:

    # source stackrc
    Copy to Clipboard Toggle word wrap
    #! /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
    Copy to Clipboard Toggle word wrap

    要验证 ceph-mgr@controller.service 容器是否已停止,请输入以下命令:

    [heat-admin@overcloud-controller-x ~]# sudo docker ps | grep ceph
    Copy to Clipboard Toggle word wrap
  3. 在 undercloud 节点上,提供 undercloud 凭证并运行以下脚本:

    # source stackrc
    Copy to Clipboard Toggle word wrap
    #! /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 mkdir /ceph_backups'; 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 mount -t nfs  <BACKUP_NODE_IP_ADDRESS>:/ceph_backups /ceph_backups'; 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 mkdir /ceph_backups/$(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 tar -zcv --xattrs-include=*.* --xattrs  --xattrs-include=security.capability --xattrs-include=security.selinux --acls -f /ceph_backups/$(hostname -s)/$(hostname -s).tar.gz  /var/lib/ceph'; done
    Copy to Clipboard Toggle word wrap
  4. 在您要恢复的节点上完成以下任务:

    1. 在继续操作前关闭该节点。
    2. 使用您在备份过程中创建的 ReaR 备份文件恢复节点。该文件位于备份节点的 /ceph_backups 目录中。
    3. Relax-and-Recover boot 菜单中,选择 Recover <CONTROL_PLANE_NODE&gt;,其中 < CONTROL_PLANE_NODE > 是 control plane 节点的名称。
    4. 在提示符处输入以下命令:

      RESCUE <CONTROL_PLANE_NODE> :~ # rear recover
      Copy to Clipboard Toggle word wrap

      镜像恢复过程完成后,控制台会显示以下信息:

    Finished recovering your system
    Exiting rear recover
    Running exit tasks
    Copy to Clipboard Toggle word wrap
  5. 对于您要恢复的节点,将 /ceph_backups 目录中的 Ceph 备份复制到 /var/lib/ceph 目录中:

    1. 确定系统挂载点:

      RESCUE <CONTROL_PLANE_NODE>:~# df -h
      Filesystem      Size  Used Avail Use% Mounted on
      devtmpfs         16G     0   16G   0% /dev
      tmpfs            16G     0   16G   0% /dev/shm
      tmpfs            16G  8.4M   16G   1% /run
      tmpfs            16G     0   16G   0% /sys/fs/cgroup
      /dev/vda2        30G   13G   18G  41% /mnt/local
      Copy to Clipboard Toggle word wrap

      /dev/vda2 文件系统被挂载到 /mnt/local 上。

    2. 创建临时目录:

      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 Toggle word wrap
    3. 在 control plane 节点上,删除现有 /var/lib/ceph 目录:

      RESCUE <CONTROL_PLANE_NODE>:~ # rm -rf /mnt/local/var/lib/ceph/*
      Copy to Clipboard Toggle word wrap
    4. 恢复前面的 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
      Copy to Clipboard Toggle word wrap
    5. 验证文件是否已恢复:

      RESCUE <CONTROL_PLANE_NODE>:~ # ls -l
      total 0
      drwxr-xr-x 2 root 107 26 Jun 18 18:52 bootstrap-mds
      drwxr-xr-x 2 root 107 26 Jun 18 18:52 bootstrap-osd
      drwxr-xr-x 2 root 107 26 Jun 18 18:52 bootstrap-rbd
      drwxr-xr-x 2 root 107 26 Jun 18 18:52 bootstrap-rgw
      drwxr-xr-x 3 root 107 31 Jun 18 18:52 mds
      drwxr-xr-x 3 root 107 31 Jun 18 18:52 mgr
      drwxr-xr-x 3 root 107 31 Jun 18 18:52 mon
      drwxr-xr-x 2 root 107  6 Jun 18 18:52 osd
      drwxr-xr-x 3 root 107 35 Jun 18 18:52 radosgw
      drwxr-xr-x 2 root 107  6 Jun 18 18:52 tmp
      Copy to Clipboard Toggle word wrap
  6. 关闭节点:

    RESCUE <CONTROL_PLANE_NODE> :~ #  poweroff
    Copy to Clipboard Toggle word wrap
  7. 打开节点。节点恢复之前的状态。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat