4.4. 手动恢复 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;update user set password=PASSWORD(\"$ROOTPASSWORD\")where User=\"root\";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/heat-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 cluster node is synchronized",否则您必须重新创建该节点。

  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 cluster node is synchronized",否则您必须重新创建该节点。

  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