RDS for MySQL - 亚马逊 OpenSearch 服务

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

RDS for MySQL

完成以下步骤,使用适用于 MySQL 的 Amazon RDS for RDS 配置 OpenSearch 摄取管道。

适用于 MySQL 的 RDS

在创建 OpenSearch 摄取管道之前,请执行以下步骤:

  1. 在 Amazon RDS 中创建自定义数据库参数组以配置二进制日志记录并设置以下参数。

    binlog_format=ROW binlog_row_image=full binlog_row_metadata=FULL

    此外,请确保该binlog_row_value_options参数未设置为PARTIAL_JSON

    有关更多信息,请参阅配置 RDS for MySQL 二进制日志记录

  2. 选择或创建 RDS for MySQL 数据库实例,并将上一步中创建的参数组与该数据库实例相关联。

  3. 确认已在数据库上启用自动备份。有关更多信息,请参阅启用自动备份

  4. 将二进制日志保留配置为足够的时间进行复制,例如 24 小时。有关更多信息,请参阅 Amazon RDS 用户指南中的设置和显示二进制日志配置

  5. 使用 Amazon RDS 的密码管理在 Amazon RDS 实例上设置用户名和密码身份验证,以及 AWS Secrets Manager。您也可以通过创建 Secrets Manager 密钥来创建 username/password 组合。

  6. 如果您使用完整的初始快照功能,请创建一个 AWS KMS key 和一个 IAM 角色来将数据从 Amazon RDS 导出到 Amazon S3。

    IAM 角色应具有以下权限策略:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExportPolicy", "Effect": "Allow", "Action": [ "s3:PutObject*", "s3:ListBucket", "s3:GetObject*", "s3:DeleteObject*", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::s3-bucket-used-in-pipeline", "arn:aws:s3:::s3-bucket-used-in-pipeline/*" ] } ] }

    该角色还应具有以下信任关系:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "export.rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  7. 选择或创建 OpenSearch 服务域或 OpenSearch 无服务器集合。有关更多信息,请参阅创建 OpenSearch 服务域创建集合

  8. 基于资源的策略附加到域,或将数据访问策略附加到集合。这些访问策略允许 OpenSearch Ingestion 将数据从您的 Amazon RDS 数据库实例写入您的域或集合。

步骤 1:配置管道角色

设置 Amazon RDS 管道先决条件后,配置要在管道配置中使用的管道角色。此外,还要为该角色添加 Amazon RDS 源的以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allowReadingFromS3Buckets", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::s3_bucket", "arn:aws:s3:::s3_bucket/*" ] }, { "Sid": "allowNetworkInterfacesGroup1", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:CreateNetworkInterfacePermission" ], "Resource": [ "arn:aws:ec2:*:account-id:network-interface/*", "arn:aws:ec2:*:account-id:subnet/*", "arn:aws:ec2:*:account-id:security-group/*" ] }, { "Sid": "allowNetworkInterfacesGroup2", "Effect": "Allow", "Action": [ "ec2:AttachNetworkInterface", "ec2:CreateNetworkInterface", "ec2:CreateNetworkInterfacePermission", "ec2:DeleteNetworkInterface", "ec2:DeleteNetworkInterfacePermission", "ec2:DetachNetworkInterface", "ec2:DescribeNetworkInterfaces" ], "Resource": [ "arn:aws:ec2:*:account-id:network-interface/*", "arn:aws:ec2:*:account-id:subnet/*", "arn:aws:ec2:*:account-id:security-group/*" ], "Condition": { "StringEquals": { "aws:RequestTag/OSISManaged": "true" } } }, { "Sid": "allowDescribeEC2", "Effect": "Allow", "Action": [ "ec2:Describe*" ], "Resource": "*" }, { "Sid": "allowTagCreation", "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:*:account-id:network-interface/*", "Condition": { "StringEquals": { "aws:RequestTag/OSISManaged": "true" } } }, { "Sid": "AllowDescribeInstances", "Effect": "Allow", "Action": [ "rds:DescribeDBInstances" ], "Resource": [ "arn:aws:rds:region:account-id:db:*" ] }, { "Sid": "AllowDescribeClusters", "Effect": "Allow", "Action": [ "rds:DescribeDBClusters" ], "Resource": [ "arn:aws:rds:region:account-id:cluster:DB-id" ] }, { "Sid": "AllowSnapshots", "Effect": "Allow", "Action": [ "rds:DescribeDBClusterSnapshots", "rds:CreateDBClusterSnapshot", "rds:AddTagsToResource" ], "Resource": [ "arn:aws:rds:region:account-id:cluster:DB-id", "arn:aws:rds:region:account-id:cluster-snapshot:DB-id*" ] }, { "Sid": "AllowExport", "Effect": "Allow", "Action": [ "rds:StartExportTask" ], "Resource": [ "arn:aws:rds:region:account-id:cluster:DB-id", "arn:aws:rds:region:account-id:cluster-snapshot:DB-id*" ] }, { "Sid": "AllowDescribeExports", "Effect": "Allow", "Action": [ "rds:DescribeExportTasks" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "region", "aws:ResourceAccount": "account-id" } } }, { "Sid": "AllowAccessToKmsForExport", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:DescribeKey", "kms:RetireGrant", "kms:CreateGrant", "kms:ReEncrypt*", "kms:GenerateDataKey*" ], "Resource": [ "arn:aws:kms:region:account-id:key/export-key-id" ], }, { "Sid": "AllowPassingExportRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::account-id:role/export-role" ] }, { "Sid": "SecretsManagerReadAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:*:account-id:secret:*" ] } ] }

步骤 2:创建管道

配置类似于以下 OpenSearch 内容的摄取管道。示例管道将 Amazon RDS 实例指定为源。

version: "2" rds-mysql-pipeline: source: rds: db_identifier: "instance-id" engine: mysql database: "database-name" tables: include: - "table1" - "table2" s3_bucket: "bucket-name" s3_region: "bucket-region" s3_prefix: "prefix-name" export: kms_key_id: "kms-key-id" iam_role_arn: "export-role-arn" stream: true aws: sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role" region: "us-east-1" authentication: username: ${{aws_secrets:secret:username}} password: ${{aws_secrets:secret:password}} sink: - opensearch: hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"] index: "${getMetadata(\"table_name\")}" index_type: custom document_id: "${getMetadata(\"primary_key\")}" action: "${getMetadata(\"opensearch_action\")}" document_version: "${getMetadata(\"document_version\")}" document_version_type: "external" aws: sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role" region: "us-east-1" extension: aws: secrets: secret: secret_id: "rds-secret-id" region: "us-east-1" sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role" refresh_interval: PT1H

您可以使用预配置的 Amazon RDS 蓝图来创建此管道。有关更多信息,请参阅 使用蓝图

要使用 Amazon Aurora 作为来源,您需要为管道配置 VPC 访问权限。您选择的 VPC 应与您的 Amazon Aurora 来源使用的 VPC 相同。然后选择一个或多个子网以及一个或多个 VPC 安全组。请注意,管道需要对 Aurora MySQL 数据库进行网络访问,因此您还应验证您的 Aurora 集群是否配置了 VPC 安全组,该安全组允许从管道的 VPC 安全组到数据库端口的入站流量。有关更多信息,请参阅使用安全组控制访问权限

如果您使用创建管道,则还必须将管道连接到 VPC,才能使用 Amazon Aurora 作为来源。 AWS Management Console 为此,请找到网络配置部分,选择连接到 VPC,然后从提供的默认选项中选择您的 CIDR,或者选择您自己的 CIDR。您可以按照 RFC 1918 当前最佳实践中的定义,使用私有地址空间中的任何 CIDR。

要提供自定义 CIDR,请从下拉菜单中选择其他。为避免 OpenSearch Ingestion 和 Amazon RDS 之间的 IP 地址冲突,请确保 Amazon RDS VPC CIDR 不同于用于摄取的 CIDR。 OpenSearch

有关更多信息,请参阅为管道配置 VPC 访问权限

数据一致性

该管道通过持续轮询或接收来自 Amazon RDS 实例的更改以及更新 OpenSearch索引中的相应文档来确保数据一致性。

OpenSearch Ingestion 支持 end-to-end确认以确保数据的持久性。管道读取快照或流时,它会动态创建分区以进行并行处理。当管道在摄取 OpenSearch 域或集合中的所有记录后收到确认信息时,该管道会将该分区标记为已完成。如果要收录到 OpenSearch 无服务器搜索集合中,可以在管道中生成文档 ID。如果要采集到 OpenSearch Serverless 时间序列集合,请注意管道不会生成文档 ID,因此您必须在工作流接收器配置document_id: "${getMetadata(\"primary_key\")}"中省略文档 ID。

In OpenSearch gestion 管道还将传入的事件操作映射到相应的批量索引操作中,以帮助采集文档。这样可以保持数据的一致性,因此 Amazon RDS 中的每一次数据更改都与中的 OpenSearch相应文档更改保持一致。

映射数据类型

OpenSearch 摄取管道将 MySQL 数据类型映射到适合 OpenSearch 服务域或集合使用的表示形式。如果中未定义映射模板 OpenSearch,则会根据第一个发送的文档使用动态映射 OpenSearch 自动确定字段类型。您还可以 OpenSearch 通过映射模板明确定义最适合您的字段类型。

下表列出了 MySQL 数据类型和相应的 OpenSearch 字段类型。 OpenSearch 如果未定义显式映射,则 “默认 OpenSearch 字段类型” 列将显示相应的字段类型。在这种情况下,使用动态映射 OpenSearch自动确定字段类型。“推荐的 OpenSearch 字段类型” 列是建议在映射模板中明确指定的相应字段类型。这些字段类型与 MySQL 中的数据类型更加一致,通常可以启用中提供的更好的搜索功能 OpenSearch。

MySQL 数据类型 默认 OpenSearch 字段类型 推荐 OpenSearch 字段类型
BIGINT 长整数 长整数
BIGINT UNSIGNED 长整数 无符号长整数
BIT 长整数 字节、短、整数或长取决于位数
DECIMAL 文本 双精度或关键字
DOUBLE 浮点数 double
FLOAT 浮点数 浮点数
INT 长整数 整数
INT UNSIGNED 长整数 长整数
MEDIUMINT 长整数 整数
MEDIUMINT UNSIGNED 长整数 整数
NUMERIC 文本 双精度或关键字
SMALLINT 长整数 short
SMALLINT UNSIGNED 长整数 整数
TINYINT 长整数 字节
TINYINT UNSIGNED 长整数 short
BINARY 文本 binary
BLOB 文本 binary
CHAR 文本 文本
ENUM 文本 关键字
LONGBLOB 文本 binary
LONGTEXT 文本 文本
MEDIUMBLOB 文本 binary
MEDIUMTEXT 文本 文本
SET 文本 关键字
TEXT 文本 文本
TINYBLOB 文本 binary
TINYTEXT 文本 文本
VARBINARY 文本 binary
VARCHAR 文本 文本
DATE 长(以纪元毫秒为单位) date
DATETIME 长(以纪元毫秒为单位) date
TIME 长(以纪元毫秒为单位) date
TIMESTAMP 长(以纪元毫秒为单位) date
YEAR 长(以纪元毫秒为单位) date
GEOMETRY 文本(采用 WKT 格式) 地理形状
GEOMETRYCOLLECTION 文本(采用 WKT 格式) 地理形状
LINESTRING 文本(采用 WKT 格式) 地理形状
MULTILINESTRING 文本(采用 WKT 格式) 地理形状
MULTIPOINT 文本(采用 WKT 格式) 地理形状
MULTIPOLYGON 文本(采用 WKT 格式) 地理形状
POINT 文本(采用 WKT 格式) geo_point 或地理形状
POLYGON 文本(采用 WKT 格式) 地理形状
JSON 文本 object

我们建议您在摄取管道中配置死信队列 (DLQ)。 OpenSearch 如果您已配置队列,S OpenSearch ervice 会将所有因动态映射失败而无法载入的失败文档发送到队列。

如果自动映射失败,则可以在工作流配置template_content中使用template_type和来定义显式映射规则。或者,您可以在启动管道之前直接在搜索域或集合中创建映射模板。

限制

在为 RDS for MySQL 设置 OpenSearch 摄取管道时,请考虑以下限制:

  • 该集成仅支持每个管道一个 MySQL 数据库。

  • 该集成目前不支持跨区域数据摄取;您的 Amazon RDS 实例和 OpenSearch 域必须相同。 AWS 区域

  • 该集成目前不支持跨账户数据摄取;您的 Amazon RDS 实例和 OpenSearch 摄取管道必须处于相同状态。 AWS 账户

  • 确保 Amazon RDS 实例已使用 Secrets Manager 启用身份验证,这是唯一支持的身份验证机制。

  • 无法更新现有的管道配置以从不同的数据库 and/or 中提取其他表的数据。要更新管道的数据库和/或表名,必须创建一个新的管道。

  • 通常不支持数据定义语言 (DDL) 语句。在以下情况下,将无法保持数据一致性:

    • 主键已更改 (add/delete/rename)。

    • 表格被删除/截断。

    • 列名或数据类型已更改。

  • 如果要同步的 MySQL 表未定义主键,则无法保证数据的一致性。您需要在 OpenSearch 接收器配置中正确定义自定义document_id选项才能同步 updates/deletes 到 OpenSearch。

  • 不支持带有级联删除操作的外键引用,这可能会导致 RDS for MySQL 和之间的数据不一致。 OpenSearch

  • 不支持 Amazon RDS 多可用区域数据库集群。

  • 支持的版本:MySQL 8.0 及更高版本。

推荐 CloudWatch 警报

建议使用以下 CloudWatch 指标来监控您的摄取管道的性能。这些指标可以帮助您确定从导出中处理的数据量、从流处理的事件数量、处理导出和流事件时的错误以及写入目标的文档数量。您可以设置 CloudWatch 警报,以便在其中一个指标在指定时间内超过指定值时执行操作。

指标 描述
pipeline-name.rds.凭证已更改 该指标表示 AWS 密钥的轮换频率。
pipeline-name.rds。 executorRefreshErrors 此指标表示无法刷新 AWS 密钥。
pipeline-name.rds。 exportRecordsTotal 该指标表示从亚马逊 Aurora 导出的记录数量。
pipeline-name.rds。 exportRecordsProcessed 该指标表示 OpenSearch 摄取管道处理的记录数。
pipeline-name.rds。 exportRecordProcessing错误 该指标表示从 Amazon Aurora 集群读取数据时 OpenSearch 摄取管道中出现的处理错误数量。
pipeline-name.rds。 exportRecordsSuccess总计 该指标指示成功处理的导出记录总数。
pipeline-name.rds。 exportRecordsFailed总计 该指标指示处理失败的导出记录总数。
pipeline-name已收到.rds.bytes 该指标表示 OpenSearch 摄取管道接收的总字节数。
pipeline-name.rds.bytes已处理 该指标表示 OpenSearch 摄取管道处理的总字节数。
pipeline-name.rds。 streamRecordsSuccess总计 该指标指示该流中成功处理的记录总数。
pipeline-name.rds。 streamRecordsFailed总计 该指标指示该流中处理失败的记录总数。