搜索

2.3. 使用 Relax-and-Recover 工具恢复 undercloud 节点和 control plane 节点

download PDF

如果您的 undercloud 或 control plane 节点被破坏,或者在更新或升级过程中发生错误,您可以将 undercloud 或 overcloud control plane 节点从备份恢复到之前的状态。如果恢复过程无法自动恢复具有 colocated Ceph 监视器的 Galera 集群或节点,您可以手动恢复这些组件。

2.3.1. 恢复 undercloud 节点

您可以使用 ReaR 创建的备份 ISO 镜像将 undercloud 节点恢复到之前的状态。您可以在备份节点中找到备份 ISO 镜像。将可引导 ISO 镜像刻录到 DVD,或通过 Integrated Lights-Out (iLO)远程访问将其下载到 undercloud 节点。

先决条件

  • 您已创建了 undercloud 节点的备份。更多信息请参阅 第 2.1.8 节 “创建 undercloud 节点的备份”
  • 您可以访问备份节点。
  • 如果将 OVS 网桥用于网络接口,您可以访问您在 NETWORKING_PREPARATION_COMMANDS 参数中设置的网络配置信息。如需更多信息,请参阅 第 2.1.7 节 “配置 Open vSwitch (OVS)接口以进行备份”
  • 如果配置了备份加密,您必须在开始恢复过程前解密备份。在备份文件所在的系统中运行以下解密步骤:

    $ dd if=backup.tar.gz | /usr/bin/openssl des3 -d -k "<encryption key>" | tar -C <backup_location> -xzvf - '*.conf'
    • <encryption key > 替换为您的加密密钥。
    • <backup_location > 替换为您要保存 backup.tar.gz 文件的文件夹,如 /ctl_plane_backups/undercloud-0/

流程

  1. 关闭 undercloud 节点。在继续操作前,请确保 undercloud 节点已完全关闭。
  2. 使用备份 ISO 镜像引导 undercloud 节点。
  3. 显示 Relax-and-Recover 引导菜单时,选择 Recover <undercloud_node>。将 <undercloud_node > 替换为 undercloud 节点的名称。

    注意

    如果您的系统使用 UEFI,请选择 Relax-and-Recover (no Secure Boot) 选项。

  4. root 用户身份登录并恢复节点:

    显示以下信息:

    Welcome to Relax-and-Recover. Run "rear recover" to restore your system!
    RESCUE <undercloud_node>:~ # rear recover

    当 undercloud 节点恢复过程完成后,控制台会显示以下信息:

    Finished recovering your system
    Exiting rear recover
    Running exit tasks
  5. 关闭该节点:

    RESCUE <undercloud_node>:~ #  poweroff

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

2.3.2. 恢复 control plane 节点

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

要恢复 control plane,您必须恢复所有 control plane 节点以确保状态一致性。

您可以在备份节点中找到备份 ISO 镜像。将可引导 ISO 镜像刻录到 DVD,或通过 Integrated Lights-Out (iLO)远程访问将其下载到 undercloud 节点。

注意

红帽支持对带有原生 SDN 的 Red Hat OpenStack Platform 备份,如 Open vSwitch (OVS)和默认的 Open Virtual Network (OVN)。有关第三方 SDN 的详情,请参考第三方 SDN 文档。

先决条件

流程

  1. 关闭每个 control plane 节点。在继续操作前,请确保 control plane 节点已完全关闭。
  2. 使用对应的备份 ISO 镜像引导每个 control plane 节点。
  3. 当显示 Relax-and-Recover 引导菜单时,在每个 control plane 节点上选择 Recover <control_plane_node>。将 <control_plane_node > 替换为对应 control plane 节点的名称。

    注意

    如果您的系统使用 UEFI,请选择 Relax-and-Recover (no Secure Boot) 选项。

  4. 在每个 control plane 节点上,以 root 用户身份登录并恢复节点:

    显示以下信息:

    Welcome to Relax-and-Recover. Run "rear recover" to restore your system!
    RESCUE <control_plane_node>:~ # rear recover

    当 control plane 节点恢复过程完成后,控制台会显示以下信息:

    Finished recovering your system
    Exiting rear recover
    Running exit tasks
  5. 当命令行控制台可用时,恢复每个 control plane 节点的 config-drive 分区:

    # once completed, restore the config-drive partition (which is ISO9660)
    RESCUE <control_plane_node>:~ $ dd if=/mnt/local/mnt/config-drive of=<config_drive_partition>
  6. 关闭该节点:

    RESCUE <control_plane_node>:~ #  poweroff
  7. 将引导序列设置为普通引导设备。在引导时,节点会恢复其之前的状态。
  8. 要确保服务正确运行,请检查 pacemaker 的状态。以 root 用户身份登录 Controller 节点,然后输入以下命令:

    # pcs status
  9. 要查看 overcloud 的状态,请使用 OpenStack Integration Test Suite (tempest)。如需更多信息,请参阅使用 Integration Test Suite (tempest)验证您的 OpenStack 云

故障排除

  • 运行以下命令,清除 pcs status 显示的资源警报:
 # pcs resource clean
  • 运行以下命令,清除 pcs status 显示的 STONITH 隔离操作错误:
# pcs resource clean
# pcs stonith history cleanup

2.3.3. 手动恢复 Galera 集群

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

注意

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

流程

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

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

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

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

    $ sudo pcs resource unmanage galera-bundle
  5. 停止所有 Controller 节点上的 MySQL 容器:

    $ sudo podman container stop $(sudo podman container ls --all --format "{{.Names}}" --filter=name=galera-bundle)
  6. 移动所有 Controller 节点上的当前目录:

    $ sudo mv /var/lib/mysql /var/lib/mysql-save
  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
  8. 启动所有 Controller 节点上的 MySQL 容器:

    $ sudo podman container start $(sudo podman container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
  9. 在所有 Controller 节点上创建 MySQL 数据库:

    $ sudo podman exec -i $(sudo podman container ls --all --format "{{ .Names }}" \
          --filter=name=galera-bundle) bash -c "mysql_install_db --datadir=/var/lib/mysql --user=mysql --log_error=/var/log/mysql/mysql_init.log"
  10. 启动所有 Controller 节点上的数据库:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}" \
          --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF --log-error=/var/log/mysql/mysql_safe.log" &
  11. 在所有 Controller 节点上移动 .my.cnf Galera 配置文件:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}" \
          --filter=name=galera-bundle) bash -c "mv /root/.my.cnf /root/.my.cnf.bck"
  12. 重置所有 Controller 节点上的 Galera root 密码:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}"  \
          --filter=name=galera-bundle) bash -c "mysql -uroot -e'use mysql;set password for root@localhost = password(\"$ROOTPASSWORD\");flush privileges;'"
  13. 在所有 Controller 节点上的 Galera 容器中恢复 .my.cnf Galera 配置文件:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}"   \
          --filter=name=galera-bundle) bash -c "mv /root/.my.cnf.bck /root/.my.cnf"
  14. Controller-0 上,将备份数据库文件复制到 /var/lib/MySQL

    $ sudo cp $BACKUP_FILE /var/lib/mysql
    $ sudo cp $BACKUP_GRANT_FILE /var/lib/mysql
    注意

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

  15. Controller-0 上,恢复 MySQL 数据库:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}"    \
    --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_FILE\"  "
    
    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}"    \
    --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_GRANT_FILE\"  "
  16. 关闭所有 Controller 节点上的数据库:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}"    \
          --filter=name=galera-bundle) bash -c "mysqladmin shutdown"
  17. Controller-0 上,启动 bootstrap 节点:

    $ sudo podman exec $(sudo podman 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/mysql_cluster.log  --user=mysql --open-files-limit=16384 \
            --wsrep-cluster-address=gcomm:// &
  18. 验证 :在 Controller-0 上,检查集群的状态:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}" \
             --filter=name=galera-bundle) bash -c "clustercheck"

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

  19. Controller-0 上,从配置检索集群地址:

    $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}" \
    --filter=name=galera-bundle) bash -c "grep wsrep_cluster_address /etc/my.cnf.d/galera.cnf" | awk '{print $3}'
  20. 在每个剩余的 Controller 节点上,启动数据库并验证集群:

    1. 启动数据库:

      $ sudo podman exec $(sudo podman 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/mysql_cluster.log  --user=mysql --open-files-limit=16384 \
            --wsrep-cluster-address=$CLUSTER_ADDRESS &
    2. 检查 MYSQL 集群的状态:

      $ sudo podman exec $(sudo podman container ls --all --format "{{ .Names }}" \
               --filter=name=galera-bundle) bash -c "clustercheck"

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

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

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

    $ sudo iptables -D  INPUT  -p tcp --destination-port 3306 -d $MYSQL_VIP  -j DROP
  23. 重启所有 Controller 节点上的 MySQL 容器:

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

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

    $ sudo pcs resource manage galera-bundle

验证

  1. 要确保服务正确运行,请检查 pacemaker 的状态:

    $ sudo pcs status
  2. 要查看 overcloud 的状态,请使用 OpenStack Integration Test Suite (tempest)。如需更多信息,请参阅使用 Integration Test Suite (tempest)验证您的 OpenStack 云
  3. 如果您怀疑特定节点有问题,请使用 clustercheck 检查集群的状态:

    $ sudo podman exec clustercheck /usr/bin/clustercheck

2.3.4. 手动恢复 undercloud 节点数据库

如果 undercloud 数据库没有作为 undercloud 恢复过程的一部分恢复,您可以手动恢复数据库。只有之前创建了独立数据库备份时,才能恢复数据库。

先决条件

流程

  1. root 用户身份登录 director undercloud 节点。
  2. 停止所有 tripleo 服务:

    [root@director ~]# systemctl  stop  tripleo_*
  3. 输入以下命令确保没有容器在服务器上运行:

    [root@director ~]# podman ps

    如果有任何容器正在运行,请输入以下命令来停止容器:

    [root@director ~]# podman stop <container_name>
  4. 创建当前 /var/lib/mysql 目录的备份,然后删除该目录:

    [root@director ~]# cp -a /var/lib/mysql /var/lib/mysql_bck
    [root@director ~]# rm -rf /var/lib/mysql
  5. 重新创建数据库目录并为新目录设置 SELinux 属性:

    [root@director ~]# mkdir /var/lib/mysql
    [root@director ~]# chown 42434:42434 /var/lib/mysql
    [root@director ~]# chmod 0755 /var/lib/mysql
    [root@director ~]# chcon -t container_file_t /var/lib/mysql
    [root@director ~]# chcon -r object_r /var/lib/mysql
    [root@director ~]# chcon -u system_u /var/lib/mysql
  6. mariadb 镜像创建一个本地标签。将 <image_id &gt ; 和 <undercloud.ctlplane.example.com > 替换为环境中适用的值:

    [root@director ~]# podman images | grep mariadb
    <undercloud.ctlplane.example.com>:8787/rh-osbs/rhosp16-openstack-mariadb                 	16.2_20210322.1   <image_id>   3 weeks ago   718 MB
    [root@director ~]# podman tag <image_id> mariadb
    [root@director ~]# podman images | grep maria
    localhost/mariadb                                                                         	latest        	<image_id>   3 weeks ago   718 MB
    <undercloud.ctlplane.example.com>:8787/rh-osbs/rhosp16-openstack-mariadb                 	16.2_20210322.1   <image_id>   3 weeks ago   718 MB
  7. 使用容器初始化 /var/lib/mysql 目录:

    [root@director ~]# podman run --net=host -v /var/lib/mysql:/var/lib/mysql localhost/mariadb mysql_install_db --datadir=/var/lib/mysql --user=mysql
  8. 复制您要导入到数据库的数据库备份文件:

    [root@director ~]# cp /root/undercloud-all-databases.sql /var/lib/mysql
  9. 启动数据库服务来导入数据:

    [root@director ~]# podman run --net=host -dt -v /var/lib/mysql:/var/lib/mysql  localhost/mariadb  /usr/libexec/mysqld
  10. 导入数据并配置 max_allowed_packet 参数:

    1. 登录到容器并进行配置:

      [root@director ~]# podman exec -it <container_id> /bin/bash
          ()[mysql@5a4e429c6f40 /]$ mysql -u root -e "set global max_allowed_packet = 1073741824;"
          ()[mysql@5a4e429c6f40 /]$ mysql -u root < /var/lib/mysql/undercloud-all-databases.sql
          ()[mysql@5a4e429c6f40 /]$ mysql -u root -e 'flush privileges'
          ()[mysql@5a4e429c6f40 /]$ exit
          exit
    2. 停止容器:

      [root@director ~]# podman stop <container_id>
    3. 检查没有容器是否正在运行:

      [root@director ~]# podman ps
      CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
      [root@director ~]#
  11. 重启所有 tripleo 服务:

    [root@director ~]# systemctl start multi-user.target
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.