8.2. 外部化 MySQL 数据库

使用以下步骤,将 MySQL 数据库完全外部化:

警告

这将在进程持续期间导致环境中的停机。

流程

  1. 登录到托管 3scale On-premises 实例的 OpenShift 节点,并更改到其项目:

    oc login -u <user> <url>
    oc project <3scale-project>

    <user><url><3scale-project> 替换为您自己的凭证和项目名称。

  2. 按照下方的步骤,按照所示的顺序缩减所有 pod。这将避免丢失数据。

    停止 3scale 内部部署

    从 OpenShift Web 控制台或命令行界面(CLI),按以下顺序将所有部署配置缩减为零副本:

    • apicast-wildcard-routerzync 适用于 3scale 2.6 之前的版本,zync-quezync 适用于 3scale 2.6 和以上版本。
    • apicast-stagingapicast-production
    • system-sidekiqbackend-cronsystem-sphinx.

      • 3scale 2.3 包括 system-resque
    • system-app
    • backend-listenerbackend-worker
    • backend-redissystem-memcachesystem-mysqlsystem-rediszync-database.

      以下示例演示了如何在 CLI 中为 apicast-wildcard-routerzync 执行此操作 :

      oc scale dc/apicast-wildcard-router --replicas=0
      oc scale dc/zync --replicas=0
      注意

      可以同时缩减每个步骤的部署配置。例如,您可以将 apicast-wildcard-routerzync 一起缩减。但是,最好等待每个步骤中的 pod 终止,然后再缩减后续 pod。3scale 实例将完全无法访问,直到它被完全启动。

  3. 要确认 3scale 项目上没有运行任何 pod,请使用以下命令:

    oc get pod

    命令应返回 No resources found

  4. 使用以下命令再次扩展数据库级别的 pod:

    oc scale dc/{backend-redis,system-memcache,system-mysql,system-redis,zync-database} --replicas=1
  5. 确保您可以通过 system-mysql pod 登录外部 MySQL 数据库,然后继续后续步骤:

    oc rsh system-mysql-<system_mysql_pod_id>
    mysql -u root -p -h <host>
    • <system_mysql_pod_id>:system-mysql 容器集的标识符。
    • 用户应当始终为 root。如需更多信息,请参阅 外部 MySQL 数据库限制

      1. CLI 现在将显示 mysql>。键入 exit,然后按 返回。在下一提示中再次键入 exit 以 返回到 OpenShift 节点控制台。
  6. 使用以下命令执行完整的 MySQL 转储:

    oc rsh system-mysql-<system_mysql_pod_id> /bin/bash -c "mysqldump -u root --single-transaction --routines --triggers --all-databases" > system-mysql-dump.sql
    • <system_mysql_pod_id> 替换为您唯一的 system-mysql pod ID
    • 验证 system-mysql-dump.sql 是否包含有效的 MySQL 级别转储,如下例所示:

      $ head -n 10 system-mysql-dump.sql
      -- MySQL dump 10.13  Distrib 5.7.24, for Linux (x86_64)
      --
      -- Host: localhost    Database:
      -- ------------------------------------------------------
      -- Server version   5.7.24
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8 */;
  7. 缩减 system-mysql pod,并保留为 0(零)副本:

    oc scale dc/system-mysql --replicas=0
  8. 查找与 URL mysql2://root:<password>@<host>/system 等效的 base64,相应地替换 <password><host>

    echo "mysql2://root:<password>@<host>/system" | base64
  9. 在远程 MySQL 数据库上创建默认的 'user'@'%'。它只需要具有 SELECT 特权。找到与 base64 等效项的 base64 信息:

    echo "user" | base64
    echo "<password>" | base64
    • 将 <password> 替换为 'user'@'%' 的密码。
  10. 执行备份并编辑 OpenShift secret system-database

    oc get secret system-database -o yaml > system-database-orig.bkp.yml
    oc edit secret system-database
    • URL :使用 [step-8] 中的值替换它。
    • DB_USERDB_PASSWORD :将上一步中的值用于这两者。
  11. system-mysql-dump.sql 发送到远程数据库服务器,并将转储导入到其中。使用命令导入它:
  12. 使用以下命令将 system-mysql-dump.sql 发送到远程数据库服务器,并将转储导入到服务器:

    mysql -u root -p < system-mysql-dump.sql
  13. 确保创建了名为 system 的新数据库:

    mysql -u root -p -se "SHOW DATABASES"
  14. 使用以下说明启动 3scale 内部部署,以正确顺序扩展所有 pod。

    启动 3scale 内部部署

    • backend-redissystem-memcachesystem-mysqlsystem-rediszync-database.
    • backend-listenerbackend-worker
    • system-app
    • system-sidekiqbackend-cronsystem-sphinx

      • 3scale 2.3 包括 system-resque
    • apicast-stagingapicast-production
    • apicast-wildcard-routerzync 适用于 3scale 2.6 之前的版本,zync-quezync 适用于 3scale 2.6 和以上版本。

      以下示例演示了如何在 CLI 中为 backend-redissystem-memcachesystem-mysqlsystem-rediszync-database 执行此操作 :

      oc scale dc/backend-redis --replicas=1
      oc scale dc/system-memcache --replicas=1
      oc scale dc/system-mysql --replicas=1
      oc scale dc/system-redis --replicas=1
      oc scale dc/zync-database --replicas=1

      system-app pod 现在应该已启动并运行,且没有任何问题。

  15. 验证后,按照所示的顺序扩展其他容器集。
  16. 备份 system-mysql DeploymentConfig 对象。您可以在几分钟后删除所有内容,确定一切运行正常。如果将来再次执行此步骤,删除 system-mysql DeploymentConfig 可避免以后出现混淆。