RDS for PostgreSQL - 亚马逊 OpenSearch 服务

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

RDS for PostgreSQL

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

适用于 PostgreSQL 的 RDS 先决条件

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

  1. 在 Amazon R@@ DS 中创建自定义数据库参数组以配置逻辑复制。

    rds.logical_replication=1

    有关更多信息,请参阅为适用于 P ostgreSQL 的 Amazon RDS 执行逻辑复制。

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

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

  4. 如果您使用完整的初始快照功能,请创建一个 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" } ] }
  5. 选择或创建 OpenSearch 服务域或 OpenSearch 无服务器集合。有关更多信息,请参阅创建 OpenSearch 服务域创建集合

  6. 基于资源的策略附加到域,或将数据访问策略附加到集合。这些访问策略允许 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 摄取管道,该管道将适用于 PostgreSQL 的 RDS 实例指定为源。

version: "2" rds-postgres-pipeline: source: rds: db_identifier: "instance-id" engine: postgresql database: "database-name" tables: include: - "schema1.table1" - "schema2.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 Aurora 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 摄取管道将 PostgreSQL 数据类型映射到适合 OpenSearch 服务域或集合使用的表示形式。如果中未定义映射模板 OpenSearch,则根据第一个发送的文档使用动态映射 OpenSearch 自动确定字段类型。您还可以 OpenSearch 通过映射模板明确定义最适合您的字段类型。

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

适用于 PostgreSQL 的 RDS 数据类型 默认 OpenSearch 字段类型 推荐 OpenSearch 字段类型
smallint 长整数 short
整数 长整数 integer
bigint 长整数 长整数
decimal 文本 双精度或关键字
数字 [(p, s)] 文本 双精度或关键字
real float 浮点数
double precision 浮点数 double
smallserial 长整数 short
Serial 长整数 整数
bigserial 长整数 长整数
money object object
character varying(n) 文本 文本
varchar(n) 文本 文本
character(n) 文本 文本
char(n) 文本 文本
bpchar (n) 文本 文本
bpchar 文本 文本
文本 文本 文本
enum 文本 文本
bytea 文本 binary
时间戳 [(p)] [无时区] 长(以纪元毫秒为单位) date
带有时区的时间戳 [(p)] 长(以纪元毫秒为单位) date
date 长(以纪元毫秒为单位) date
time [ (p) ] [没有时区] 长(以纪元毫秒为单位) date
带时区的时间 [(p)] 长(以纪元毫秒为单位) date
间隔 [字段] [(p)] 文本(ISO8601 格式) 文本
布尔值 布尔值 布尔值
point 文本(采用 WKT 格式) 地理形状
折线图 文本(采用 WKT 格式) 地理形状
lseg 文本(采用 WKT 格式) 地理形状
文本(采用 WKT 格式) 地理形状
path 文本(采用 WKT 格式) 地理形状
多边形 文本(采用 WKT 格式) 地理形状
object object
cidr 文本 文本
inet 文本 文本
macaddr 文本 文本
macaddr8 文本 文本
bit(n) 长整数 字节、短整型、整型或长整型(取决于位数)
bit varying(n) 长整数 字节、短整型、整型或长整型(取决于位数)
json object object
jsonb object object
jsonpath 文本 文本

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

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

限制

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

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

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

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

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

  • 无法更新现有的管道配置以从不同的数据库 and/or 中提取其他表的数据。要更新管道的数据库和/或表名,必须停止管道并使用更新的配置重新启动管道,或者创建新的管道。

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

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

    • 表格被删除/截断。

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

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

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

  • 支持的版本:PostgreSQL 16 及更高版本。

推荐 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总计 该指标指示该流中处理失败的记录总数。