Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Amazon Aurora 最佳实践

本主题提供使用 Amazon Aurora 数据库群集或向其迁移数据的最佳实践和选项信息。

确定您连接到的数据库实例

您可以通过检查 innodb_read_only 全局变量,确定连接到 Aurora 数据库群集中的哪个数据库实例,如以下示例所示。

SHOW GLOBAL VARIABLES LIKE 'innodb_read_only';

innodb_read_only 变量在您连接到 Aurora 副本时会设置为 ON,在您连接到主实例时会设置为 OFF

如果您要向应用程序代码添加逻辑以均衡工作负载,或要确保写入操作使用正确的连接,则这可能会有用。

使用 T2 实例

使用 db.t2.smalldb.t2.medium 数据库实例类的 Amazon Aurora 实例最适用于不支持长时间运行高工作负载的应用程序。T2 实例旨在提供适度的基准性能,并能够根据您工作负载的需要实现性能的显著突增。它们旨在用于不经常或不持续使用完整 CPU、但偶尔需要突增性能的工作负载。db.t2.smalldb.t2.medium 数据库实例类最适用于开发和测试服务器,或其他非生产服务器。有关 T2 实例的更多详细信息,请参阅 T2 实例

在将 T2 实例用于数据库群集中的主实例或 Aurora 副本时,我们建议:

  • 如果您将 T2 实例用作数据库群集中的数据库实例类,建议您的数据库群集中的所有实例都使用同一数据库实例类。例如,如果您使用 db.t2.medium 作为主实例,我们建议您的 Aurora 副本也使用 db.t2.medium

  • 监视 CPU 额度余额 (CPUCreditBalance) 以确保其处于可持续的水平。也就是说,CPU 额度将在使用 CPU 时按相同的费率累积。

    如果您用完实例的 CPU 额度,则会发现可用 CPU 将立即降低,并且实例的读取和写入延迟将增加。这会导致实例的总体性能大大降低。

    如果您的 CPU 额度余额未处于可持续的水平,建议您修改数据库实例以使用支持的 R3 数据库实例类之一 (扩展计算)。

    有关监视指标的更多信息,请参阅监控 Amazon Aurora 数据库群集

  • 监视数据库群集中的主实例与 Aurora 副本之间的副本滞后 (AuroraReplicaLag)。

    如果 Aurora 副本已在主实例之前用完 CPU 额度,则滞后于主实例将导致 Aurora 副本频繁重新启动。如果应用程序保持在数据库群集中的 Aurora 副本之间分布的高读取操作负载,同时主实例保持写入操作的最小负载,则很可能是这种情况。

    如果您发现副本滞后持续增加,请确保数据库群集中的 Aurora 副本的 CPU 额度余额未被用完。

    如果您的 CPU 额度余额未处于可持续的水平,建议您修改数据库实例以使用支持的 R3 数据库实例类之一 (扩展计算)。

  • 对于已启用二进制日志记录的数据库群集,将每事务的插入次数保持在 100 万以下。

    如果数据库群集的数据库群集参数组的 binlog_format 参数已设置为 OFF 之外的值,则当数据库群集接收的大型事务包含 100 万个以上要插入的行时,数据库群集可能会遇到内存不足的情况。您可以监视可用内存 (FreeableMemory) 指标以确定数据库群集是否将用完可用内存,然后检查写入操作 (VolumeWriteIOPS) 指标以查看主实例是否正在接收高写入操作负载。如果是这样的话,我们建议您更新应用程序以将一个事务中的插入次数限制在 100 万以下,或修改实例以使用支持的 R3 数据库实例类之一 (扩展计算)。

调用 AWS Lambda 函数

我们建议您将对 mysql.lambda_async 的调用包装在存储过程中,该存储过程可从不同的来源 (例如触发器或客户端代码) 进行调用。这有助于避免出现阻抗不一致问题,并且可让您的数据库编程人员更轻松地调用 Lambda 函数。

有关从 Amazon Aurora 调用 Lambda 函数的更多信息,请参阅从 Amazon Aurora 数据库群集调用 Lambda 函数

下面的示例演示了一个 Lambda 函数、一个调用 Lambda 函数的存储过程以及一个运行存储过程和调用 Lambda 函数的调用。

Lambda 函数

import boto3 ses = boto3.client('ses') def SES_send_email(event, context): return ses.send_email( Source=event['email_from'], Destination={ 'ToAddresses': [ event['email_to'], ] }, Message={ 'Subject': { 'Data': event['email_subject'] }, 'Body': { 'Text': { 'Data': event['email_body'] } } } )

存储过程

DROP PROCEDURE IF EXISTS SES_send_email; DELIMITER ;; CREATE PROCEDURE SES_send_email(IN email_from VARCHAR(255), IN email_to VARCHAR(255), IN subject VARCHAR(255), IN body TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async( 'arn:aws-cn:lambda:us-west-2:123456789012:function:SES_send_email', CONCAT('{"email_to" : "', email_to, '", "email_from" : "', email_from, '", "email_subject" : "', subject, '", "email_body" : "', body, '"}') ); END ;; DELIMITER ;

通过调用存储过程来调用 Lambda 函数

mysql> call SES_send_email('example_to@amazon.com', 'example_from@amazon.com', 'Email subject', 'Email content');

在 Amazon Aurora 中使用多线程复制从属

默认情况下,当 Aurora 数据库群集用作复制从属时,Aurora 使用单线程复制。虽然 Amazon Aurora 不阻止多线程复制,但是 Aurora 延续了 MySQL 在多线程复制方面的多个问题。我们建议您不要在生产中使用多线程复制。如果使用多线程复制,我们建议您全面测试任何使用情况。

有关在 Amazon Aurora 中使用复制的更多信息,请参阅 使用 Amazon Aurora 进行复制

使用 Amazon Aurora 为 MySQL 数据库扩展读取

您可以将 Amazon Aurora 用于 MySQL 数据库实例,以便利用 Amazon Aurora 的读取扩展功能并为 MySQL 数据库实例扩展读取工作负载。要使用 Aurora 对 MySQL 数据库实例进行读取扩展,请创建 Amazon Aurora 数据库群集并使它成为 MySQL 数据库实例的复制从属。这适用于 Amazon RDS MySQL 数据库实例或是在 Amazon RDS 外部运行的 MySQL 数据库。

有关创建 Amazon Aurora 数据库群集的信息,请参阅创建 Amazon Aurora 数据库群集

在 MySQL 数据库实例与 Amazon Aurora 数据库群集之间设置复制时,请确保遵循以下准则:

  • 当您引用 Amazon Aurora 数据库群集时,使用 Amazon Aurora 数据库群集终端节点地址。如果发生故障转移,则提升为 Aurora 数据库群集主实例的 Aurora 副本会继续使用数据库群集终端节点地址。

  • 在您的主实例上保留二进制日志,直至您确认其已应用于 Aurora 副本。此维护可确保您在发生故障时可还原您的主实例。

重要

当使用自管理复制时,您负责监控和解决可能发生的所有复制问题。有关更多信息,请参阅 诊断并解决只读副本之间的滞后

注意

对 Amazon Aurora 数据库群集启动复制功能所需的权限受到限制且对 Amazon RDS 主用户不可用。为此,您必须使用 Amazon RDS mysql.rds_set_external_mastermysql.rds_start_replication 命令来设置 Amazon Aurora 数据库群集与 MySQL 数据库实例之间的复制。

在 Amazon RDS 上启动外部主实例和 MySQL 数据库实例之间的复制

  1. 将源 MySQL 数据库实例设为只读:

    mysql> FLUSH TABLES WITH READ LOCK; mysql> SET GLOBAL read_only = ON;
  2. 对源 MySQL 数据库实例运行 SHOW MASTER STATUS 命令以确定二进制日志位置。您将收到类似于以下示例的输出:

    File Position ------------------------------------ mysql-bin-changelog.000031 107 ------------------------------------
  3. 使用 mysqldump 将数据库从外部 MySQL 数据库实例复制到 Amazon Aurora 数据库群集。对于非常大的数据库,您可能需要使用将数据导入到 Amazon RDS MySQL 或 MariaDB 数据库实例中,同时减少停机时间中的过程。

    针对 Linux、OS X 或 Unix:

    mysqldump \ --databases <database_name> \ --single-transaction \ --compress \ --order-by-primary \ –u <local_user> \ -p <local_password> | mysql \ --host aurora_cluster_endpoint_address \ –-port 3306 \ –u <RDS_user_name> \ –p <RDS_password>

    对于 Windows:

    mysqldump ^ --databases <database_name> ^ --single-transaction ^ --compress ^ --order-by-primary ^ –u <local_user> ^ -p <local_password> | mysql ^ --host aurora_cluster_endpoint_address ^ –-port 3306 ^ –u <RDS_user_name> ^ –p <RDS_password>

    注意

    确保 -p 选项和输入的密码之间没有空格。

    mysql 命令中使用 ‐‐host‐‐user (-u)‐‐port–p 选项,以指定用于连接到 Aurora 数据库群集的主机名、用户名、端口和密码。主机名是 Amazon Aurora 数据库群集终端节点中的 DNS 名称,例如 mydbcluster.cluster-123456789012.us-east-1.rds.amazonaws.com。您可以在 Amazon RDS 管理控制台上的群集详细信息中找到终端节点值。

  4. 再次将源 MySQL 数据库实例设为可写:

    mysql> SET GLOBAL read_only = OFF; mysql> UNLOCK TABLES;

    有关生成备份以用于复制的更多信息,请参阅 MySQL 文档中的通过将主体和副本设为只读来对其进行备份

  5. 在 Amazon RDS 管理控制台中,将承载源 MySQL 数据库的服务器的 IP 地址添加到 Amazon Aurora 数据库群集的 VPC 安全组。有关修改 VPC 安全组的更多信息,请参阅 Amazon Virtual Private Cloud 用户指南中的您的 VPC 的安全组

    您可能还需要配置本地网络以允许来自 Amazon Aurora 数据库群集的 IP 地址的连接,以便它能与源 MySQL 实例进行通信。要查找 Amazon Aurora 数据库群集的 IP 地址,请使用 host 命令:

    host <aurora_endpoint_address>

    主机名是 Amazon Aurora 数据库群集终端节点中的 DNS 名称。

  6. 通过使用所选的客户端,连接到外部 MySQL 实例并创建将用于复制的 MySQL 用户。此账户仅用于复制,并且必须仅供您的域使用以增强安全性。以下是示例:

    CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';
  7. 对于外部 MySQL 实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。例如,要向域的 repl_user 用户授予所有数据库的 REPLICATION CLIENTREPLICATION SLAVE 权限,请发出以下命令:

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';
  8. 在设置复制之前为将是从属复制的 Aurora 数据库群集拍摄手动快照。如果您需要将数据库群集作为从属复制来重新建立复制,则可从此快照还原 Aurora 数据库群集,而不必将 MySQL 数据库实例中的数据导入新的 Aurora 数据库群集。

  9. 使 Amazon Aurora 数据库群集成为副本。以主用户身份连接到 Amazon Aurora 数据库群集,并使用 mysql.rds_set_external_master 命令将源 MySQL 数据库标识为复制主体。使用您在步骤 2 中确定的主日志文件名和主日志位置。以下是示例:

    CALL mysql.rds_set_external_master ('mymasterserver.mydomain.com', 3306, 'repl_user', '<password>', 'mysql-bin-changelog.000031', 107, 0);
  10. 在 Amazon Aurora 数据库群集上,发出 mysql.rds_start_replication 命令以开始复制:

    CALL mysql.rds_start_replication;

在源 MySQL 数据库实例与 Amazon Aurora 数据库群集之间建立复制之后,可以将 Aurora 副本添加到 Amazon Aurora 数据库群集。随后可以连接到 Aurora 副本以对数据进行读取扩展。有关创建 Aurora 副本的信息,请参阅使用控制台创建 Aurora 副本

使用 Amazon Aurora 实现 MySQL 数据库的灾难恢复

您可以对 MySQL 数据库实例使用 Amazon Aurora 以创建场外备份来实现灾难恢复。要使用 Aurora 实现 MySQL 数据库实例的灾难恢复,请创建 Amazon Aurora 数据库群集并使它成为 MySQL 数据库实例的复制从属。这适用于 Amazon RDS MySQL 数据库实例或是在 Amazon RDS 外部运行的 MySQL 数据库。

重要

在 MySQL 数据库实例与 Amazon Aurora 数据库群集之间设置复制时,Amazon RDS 不会管理复制。必须监控复制以确保其保持正常运行并在需要时予以修复。

有关如何创建 Amazon Aurora 数据库群集并使它成为 MySQL 数据库实例的复制从属的说明,请遵循使用 Amazon Aurora 为 MySQL 数据库扩展读取中的过程。

从 MySQL 迁移到 Amazon Aurora,同时减少停机时间

将数据从支持实时应用程序的 MySQL 数据库迁移到 Amazon Aurora 数据库群集时,您可以使用将数据导入到 Amazon RDS MySQL 或 MariaDB 数据库实例中,同时减少停机时间中记录的过程减少为将数据迁移到 Aurora 而中断的数据服务时间量。如果您使用的是非常大型的数据库,此过程可能尤其有用,因为您可以尽量减少通过网络传输到 AWS 的数据量,从而降低导入成本。

该过程所列的步骤可将数据库数据的副本传输到 Amazon EC2 实例,并将数据导入到新的 Amazon RDS MySQL 数据库实例。由于 Amazon Aurora 与 MySQL 兼容,因此您可以为目标 Amazon RDS MySQL 数据库实例改用 Amazon Aurora 数据库群集。