弹性扩缩 MySQL 环境

本教程介绍如何纵向扩缩(纵向扩容和缩容)高可用性 MySQL 数据库集群部署(主数据库和副本数据库)。此过程包括对 Compute Engine 实例进行纵向扩容和缩容以及对其磁盘进行纵向扩容。

磁盘纵向扩容的常见原因是为了适应所管理数据量的增加。

对执行 MySQL 的 Compute Engine 实例进行纵向扩容有多种原因。以下是一些常见的纵向扩容原因(反过来就是纵向缩容的原因):

  • 系统达到其写入/读取吞吐量性能的极限。增加 CPU 和内存可提供更多的硬件容量。
  • 查询数量随时间逐渐增加,或者预计会出现查询次数激增(例如在黑色星期五或网购星期一)。增加 CPU 和内存可建立一个储备资源池。
  • 由于将更多客户端添加到系统等原因,并发查询的数量不断增加。增加 CPU 和内存可支持更多的并发操作。
  • Google Cloud 可能会在 Compute Engine 实例列表中显示“提高性能”建议。如果您正在重新考虑是否对 Compute Engine 实例进行纵向扩容,这些建议很重要。

本教程适用于以下角色:

  • 打算部署 MySQL 集群以实现可扩缩性的云架构师
  • 使用 MySQL 集群实现应用的云工程师
  • 管理 MySQL 集群的云运维团队
  • 负责管理 MySQL 集群中的数据库并且需要执行纵向扩缩过程(或随时间多次执行此类过程)的 IT 和数据库管理员

下图展示了高可用性 MySQL 集群的整体架构。本教程以该架构为基础介绍纵向扩缩过程。

纵向扩缩过程的架构,其中显示部署到主数据库和副本数据库的 MySQL 客户端实例。

本教程假定您熟悉以下内容:

  • 使用 Deployment Manager 和各种命令行工具(如 Cloud Shell 和 mysql)设置和运行 MySQL 集群。
  • Compute Engine 实例管理操作。
  • Compute Engine 磁盘管理操作。

目标

  • 设置一个具有主数据库和副本数据库的 MySQL 集群。
  • 通过更改 MySQL 集群的所有 Compute Engine 实例的机器类型,对这些实例(内存和 CPU)进行纵向扩容。
  • 通过更改 MySQL 集群的所有 Compute Engine 实例的机器类型,对这些实例(内存和 CPU)进行纵向缩容。
  • 增加 Compute Engine 实例的磁盘大小。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Compute Engine and Cloud Storage API。

    启用 API

  5. 安装并初始化 Cloud SDK

设置 MySQL 集群

第一步是创建一个正在运行的 MySQL 集群。请在此集群中填充一些用于演示和验证的数据。对于数据验证,本教程提供了查询 MySQL 主数据库和副本数据库的说明。

以下关于设置 MySQL 集群的说明取自相关教程(使用 HAProxy 将 MySQL 集群迁移到 Compute Engine),为方便起见,在此处稍有修改。

  1. 在 Cloud Console 中,打开 Cloud Shell:

    打开 Cloud Shell

  2. 设置一个用于 Cloud Storage 存储分区名称的环境变量。

    GCS_BUCKET_NAME=${USER}-mysql-$(date +%s)
    echo $GCS_BUCKET_NAME
    
  3. 创建 Cloud Storage 存储分区(默认为多区域):

    gsutil mb gs://${GCS_BUCKET_NAME}/
    

    该存储分区将存储用于创建和启动 MySQL 主实例和副本实例的脚本。

  4. 克隆 GitHub 代码库并检索用于设置环境的脚本:

    git clone https://github.com/GoogleCloudPlatform/solutions-compute-mysql-migration-haproxy.git mysql-migration
    
  5. mysql-migration 文件夹中,运行初始化脚本以创建 Compute Engine 主实例和副本实例的 MySQL 集群:

    cd mysql-migration
    ./run.sh ${DEVSHELL_PROJECT_ID} ${GCS_BUCKET_NAME}
    

    此脚本还会创建一个 MySQL 客户端 Compute Engine 实例。

  6. 启用从客户端实例到主实例的远程根访问权限:

    1. 在 Cloud Console 中,转到“虚拟机实例”页面。

      转到“虚拟机实例”

    2. source-mysql-primary 实例对应的行中,点击 SSH 以连接到安全 shell。

    3. 安全 shell 可用后,运行以下命令:

      mysql -u root -psolution-admin
      
    4. 登录 mysql 后,发出以下语句:

      GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'solution-admin';
      
  7. 验证是否可以从客户端访问数据库。在 Cloud Console 中,使用 ssh 连接到 mysql-client Compute Engine 实例。当安全 shell 可用时,执行以下操作:

    1. 选择 Compute Engine > 虚拟机实例,找到名为 source-mysql-primary 的实例所在的行,并记下其内部 IP 地址:

      mysql -u root -psolution-admin -h <var>internal-ip-address-of-source-mysql-primary</var>
      
    2. mysql shell 可用时,执行以下命令:

      SHOW databases; # source_db must be present
      USE source_db;
      SHOW tables; # source_table must be present
      SELECT COUNT(*) FROM source_table; # must return 5000
      

      您可以使用同一组命令来检查副本是否包含相同的数据集,但应改用 source-mysql-replica 内部 IP 地址。

此时,有三个 Compute Engine 实例正在运行:

  • 客户端 (mysql-client)。
  • MySQL 主实例 (source-mysql-primary)。
  • MySQL 副本 (source-mysql-replica)。MySQL 主实例正在对 MySQL 副本执行复制操作。

每个 Compute Engine 实例的机器类型为 f1-micro(1 个 vCPU、0.6 GB 内存),并纵向扩容为 n1-standard-1 机器类型(1 个 vCPU、3.75 GB 内存)。磁盘的大小为 10 GB,并加倍为 20 GB。这些选择只是示例,您可以根据部署的具体需求进行更改。

对 Compute Engine 实例进行纵向扩容(无故障转移)

本部分介绍如何对运行 MySQL 主实例和副本的 Compute Engine 实例进行纵向扩容。您可以通过更改 Compute Engine 实例的机器类型来同时增加 CPU 和内存量。如需更改机器类型,您必须停止 Compute Engine 实例,并在更改后将其重启。

为了确保处理能力相同,我们建议您将这两个 Compute Engine 实例配置为使用同一机器类型。

首先对 MySQL 副本进行纵向扩容,这样发现的任何问题都不会中断 MySQL 主实例的执行。如果出现问题,您可以在主实例不停机的情况下解决问题。此外,您还可以评估此问题是暂时问题或虚假错误,还是需要在主数据库纵向扩容之前解决的一般性问题。

另一种方法(也需要重新启动 Compute Engine 实例)需要将主实例故障转移到辅助实例,以最大程度地减少停机时间。后续各部分将详细介绍此方法。

对 MySQL 副本进行纵向扩容

首先,将运行 MySQL 副本的 Compute Engine 实例停止。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. source-mysql-replica 实例对应的行中,点击 设置与实用工具),然后点击停止

  3. Compute Engine 实例停止后,点击 source-mysql-replica,然后点击 修改

  4. 机器类型下,选择要纵向扩容到的 n1-standard-1 机器类型(1 个 vCPU,3.75 GB 内存)。

  5. 点击保存

  6. 保存完成后,点击 启动

您可以使用之前提到的 mysql 验证命令来测试 MySQL 副本在扩缩操作后是否已重新启动并运行。

对 MySQL 主实例进行纵向扩容

首先,将运行 MySQL 主实例的 Compute Engine 实例停止。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. source-mysql-primary 实例对应的行中,点击 设置与实用工具),然后点击停止

  3. 在 Compute Engine 实例停止运行后,点击 source-mysql-primary,然后点击 修改

  4. 机器类型下,选择要纵向扩容到的 n1-standard-1 机器类型(1 个 vCPU,3.75 GB 内存)。确保此机器类型与为 MySQL 副本选择的机器类型相同。

  5. 点击保存

  6. 保存完成后,点击 启动

您可以使用之前提到的 mysql 验证命令来测试 MySQL 主实例在扩缩操作后是否已重新启动并运行。

对 Compute Engine 实例进行纵向缩容(无故障转移)

本部分介绍如何对运行 MySQL 主实例和副本的 Compute Engine 实例进行纵向缩容。您可以通过更改 Compute Engine 实例的机器类型来同时减少 CPU 和内存量。如需更改机器类型,您必须停止 Compute Engine 实例,并在更改后将其重启。

为了确保处理能力相同,我们建议您将这两个 Compute Engine 实例配置为使用同一机器类型。这些步骤与纵向扩容步骤类似。但是,为了完整起见,下一部分明确地介绍了这些步骤。

对 MySQL 副本进行纵向缩容

首先,将运行 MySQL 副本的 Compute Engine 实例停止。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. source-mysql-replica 实例对应的行中,点击 设置与实用工具),然后点击停止

  3. 在 Compute Engine 实例停止运行后,点击 source-mysql-replica,然后点击 修改

  4. 机器类型下,选择要纵向缩容到的机器类型 f1-micro(1 个 vCPU,0.6 GB 内存)。

  5. 点击保存

  6. 保存完成后,点击 启动

您可以使用之前提到的 mysql 验证命令来测试 MySQL 副本在扩缩操作后是否已重新启动并运行。

对 MySQL 主实例进行纵向缩容

首先,将运行 MySQL 主实例的 Compute Engine 实例停止。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. source-mysql-primary 实例对应的行中,点击 设置与实用工具),然后点击停止

  3. 在 Compute Engine 实例停止运行后,点击 source-mysql-primary,然后点击 修改

  4. 机器类型下,选择要纵向缩容到的机器类型 f1-micro(1 个 vCPU,0.6 GB 内存)。确保此机器类型与您之前为 MySQL 副本选择的机器类型相同。

  5. 点击保存

  6. 保存完成后,点击 启动

您可以使用之前提到的 mysql 验证命令来测试 MySQL 主实例在扩缩操作后是否已重新启动并运行。

对 Compute Engine 实例进行纵向扩容(有故障转移)

在生产环境中,关停、纵向扩容和重启 MySQL 数据库可能需要花费太长时间。利用故障转移可以实现更快的过程:首先对副本进行纵向扩容,待其重新启动并运行后,停止现有主实例,让副本成为(新的)主实例。总体停机时间是将 MySQL 数据库故障转移到纵向扩容后的副本所需的时间。

概括来讲,该过程如下所示:

  1. 通过停止副本、更改其机器类型并重新启动,对其进行纵向扩容。
  2. 等待副本同步在其纵向扩容期间主实例发生的更改。
  3. 停止主实例。
  4. 等待副本排空复制日志。
  5. 将副本设置为新的主实例。
  6. 停止主实例(新的副本)。
  7. 对新的副本进行纵向扩容。
  8. 将其设置为新主实例的新副本。

此过程完成后,两个 MySQL 系统都已纵向扩容并且仍存在主实例/副本关系:以前的主实例现在是新的副本,而以前的副本现在是新的主实例。以下部分详细介绍了这些命令。

一般情况下不需要回退 (fallback),因为主实例和副本采用同一机器类型,具有相同类型和数量的磁盘空间。回退会导致回退期间短时间中断服务。但是,如果需要进行回退,则必须再次执行故障转移步骤。

对现有 MySQL 副本进行纵向扩容

按照对 MySQL 副本进行纵向扩容中所述,对副本进行纵向扩容。在此期间,主实例不会中断,一直提供服务。

将主实例故障转移到纵向扩容后的副本

以下命令执行从主实例到副本的故障转移。

  1. 在 Cloud Shell 中,停止主实例,令其不再接收更新:

    gcloud compute instances stop source-mysql-primary --zone=us-east1-b;
    

    您可以接着继续执行后续步骤,无需等到主实例完全停止。

  2. 在 Cloud Console 中,转到虚拟机实例页面:

    转到“虚拟机实例”

  3. source-mysql-replica 实例对应的行中,点击 SSH 连接到此实例。

  4. 当安全 shell 可用时,启动 mysql shell:

    mysql -u root -psolution-admin
    
  5. 检查副本是否启用了二进制日志功能(必须为 ON):

    SHOW VARIABLES LIKE 'log_bin';
    
  6. 检查日志副本更新是否已停用(必须为 OFF):

    SHOW VARIABLES LIKE 'log_slave%';
    
  7. 排空中继日志:

    STOP SLAVE IO_THREAD;
    
  8. 确保所有处理都已发生:

    SHOW PROCESSLIST;
    

    此命令的输出必须显示 Slave has read all relay log。 使该命令继续执行,直到您看到这一结果。

  9. 停止副本:

    STOP SLAVE;
    
  10. 将副本的角色更改为主实例:

    RESET MASTER;
    GRANT REPLICATION SLAVE ON *.* TO 'sourcereplicator'@'%' IDENTIFIED BY 'solution-admin';
    

新的主实例现已就位。

对新的 MySQL 副本进行纵向扩容

以前的副本现在是主实例,可供客户端访问来执行读写操作。

按照前面介绍的说明对新副本(以前的主实例)进行纵向扩容,然后将其启动。

将副本连接到主实例以进行复制

  1. 在 Cloud Console 中,转到虚拟机实例页面:

    转到“虚拟机实例”

  2. source-mysql-primary 实例对应的行中,点击 SSH 以连接到安全 shell。

  3. 当安全 shell 可用时,启动 mysql shell:

    mysql -u root -psolution-admin
    
  4. 开始复制操作:

    CHANGE MASTER TO MASTER_HOST='source-mysql-replica', master_user='sourcereplicator',master_password='solution-admin';
    RESET SLAVE;
    START SLAVE;
    

主 MySQL 实例现在正在向其副本执行复制操作。

测试从主实例到副本的复制

以下测试在主 MySQL 实例 source-mysql-replica 上的表 source_table 中添加了一行。您可以观察到副本 MySQL 实例 source-mysql-primary 中也添加了对应的内容。

  1. source-mysql-replica 实例中,在新主实例上添加一行。如果之前未添加任何行,则计数一定会显示为 5001

    USE source_db;
    INSERT INTO source_table (event_data) VALUES (ROUND(RAND()*15000,2));
    SELECT count(*) FROM source_table;
    
  2. 观察副本上的复制情况。计数必须显示为 5001

    USE source_db;
    SELECT count(*) FROM source_table;
    

故障转移过程所需的步骤到此结束。在结合故障转移进行纵向缩容时,您可以采用相同的步骤。

增加 Compute Engine 实例的磁盘大小

本部分介绍如何增加 Compute Engine 实例磁盘的大小,包括托管 MySQL 主实例的 Compute Engine 实例以及托管 MySQL 副本的 Compute Engine 实例。磁盘大小只能增加,不能减小。

有两种方法可以对磁盘进行纵向扩容,后面的部分中均有介绍。利用动态调整磁盘大小这一功能,您无需重新创建 Compute Engine 实例。如需了解详情,请参阅此博文。 一种方法是停止 Compute Engine 实例,增加其磁盘大小,然后将其重新启动。重启实例会导致其自动调整用于存储 MySQL 数据文件的根分区。

另一方法不需要停止并重新启动 Compute Engine 实例,而是要求在 Cloud Shell 和实例的安全 shell 中执行命令行语句。

要进行确认,您可以在增加磁盘大小之前和之后使用 df -h --total 命令来检查前后的大小。

建议您采用最佳做法,即在为每个磁盘调整大小之前截取其快照。此预防措施可确保您能够还原至每个磁盘调整大小之前的状态。

增加 MySQL 副本的磁盘大小(需要关停)

首先,增加托管 MySQL 副本的 Compute Engine 实例的磁盘大小。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. source-mysql-replica 实例对应的行中,点击 设置与实用工具),然后点击停止

  3. 列出 Compute Engine 实例的磁盘:

    列出实例的磁盘

  4. 选择 source-mysql-replica

  5. 点击 修改

  6. 对于大小,将其增加到 20 GB。

  7. 点击保存,然后等待保存操作完成。

  8. 列出 Compute Engine 实例:

    列出计算实例

  9. source-mysql-replica 实例对应的行中,点击 设置与实用工具),然后点击启动

您可以使用上述 mysql 验证命令来验证 MySQL 主实例在磁盘大小增加后是否按预期运行。

增加 MySQL 主实例的磁盘大小(需要关停)

增加托管 MySQL 主实例的 Compute Engine 实例的磁盘大小。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. source-mysql-primary 实例对应的行中,点击 设置与实用工具),然后点击停止

  3. 列出 Compute Engine 实例的磁盘:

    列出实例的磁盘

  4. 选择 source-mysql-primary

  5. 点击 修改

  6. 对于大小,将其增加到 20 GB。

  7. 点击保存,然后等待保存操作完成。

  8. 列出 Compute Engine 实例:

    列出计算实例

  9. source-mysql-primary 实例对应的行中,点击 设置与实用工具),然后点击启动

您可以使用上述 mysql 验证命令来验证 MySQL 主实例在磁盘大小增加后是否按预期运行。

增加 MySQL 副本的磁盘大小(动态执行,无需关停)

以下步骤展示了如何为文件系统 ext4 及具有单个分区的卷动态增加磁盘大小。其他文件系统类型或分区配置需要执行其他步骤才能实现增加。

与之前一样,首先增加托管副本的 Compute Engine 实例的磁盘大小,然后增加托管主实例的 Compute Engine 实例的磁盘大小。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. 点击 SSH 以连接到 source-mysql-replica 实例。

  3. 在安全 shell 中,检查磁盘及其分区,并观察磁盘 sda 是否有一个分区 sda1

    lsblk
    
  4. 在 Cloud Shell 中,运行以下命令来增大磁盘大小。当出现提示时,以 y 响应。

    gcloud compute disks resize source-mysql-replica --size=20G --zone=us-east1-c
    
  5. 在安全 shell 中,确认磁盘大小已增加:

    lsblk
    

    另请注意,分区的大小仍为 10 GB。

  6. 在安全 shell 中,运行以下命令来查看文件系统以及其类型和大小。

    df -Th
    
  7. 在安全 shell 中,增大分区大小:

    sudo growpart /dev/sda 1
    sudo resize2fs /dev/sda1
    lsblk
    df -Th
    

    最后两个命令可显示增加情况。

增加 MySQL 主实例的磁盘大小(动态执行,无需关停)

动态增加主实例的磁盘大小的过程与增加副本磁盘大小的过程相同。

  1. 在 Cloud Console 中,转到虚拟机实例页面来查看 Compute Engine 实例的列表:

    列出计算实例

  2. 点击 SSH 以连接到 source-mysql-primary 实例。

  3. 在安全 shell 中,检查磁盘及其分区,并观察磁盘 sda 是否有一个分区 sda1

    lsblk
    
  4. 在 Cloud Shell 中,运行以下命令来增大磁盘大小。当出现提示时,以 y 响应。

    gcloud compute disks resize source-mysql-primary --size=20G --zone=us-east1-b
    
  5. 在安全 shell 中,确认磁盘大小已增加:

    lsblk
    

    另请注意,分区的大小仍为 10 GB。

  6. 在安全 shell 中,运行以下命令来查看文件系统以及其类型和大小。

    df -Th
    
  7. 在安全 shell 中,增大分区大小:

    sudo growpart /dev/sda 1
    sudo resize2fs /dev/sda1
    lsblk
    df -Th
    

    最后两个命令可显示增加情况。

清除数据

完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤

您可以将在本教程中学到的知识应用到生产环境中的 MySQL 集群,为必要的扩缩建立流程和规定任务。要首先进行练习,请克隆生产 MySQL 集群环境,然后进行试运行。记下可能会影响生产环境中后续纵向扩缩更改的任何重要步骤。

考虑开发一套执行本教程中所示步骤的脚本。这样,在生产环境中,您可以自动进行扩缩而不必手动执行。

如需了解更多信息,请参阅这些 MySQL 教程

探索有关 Google Cloud 的参考架构、图表、教程和最佳做法。查看我们的云架构中心