RDS for PostgreSQL
完成以下步骤,使用 Amazon RDS for PostgreSQL 配置 OpenSearch Ingestion 管道。
RDS for PostgreSQL 先决条件
创建 OpenSearch Ingestion 管道之前,请执行以下步骤:
-
在 Amazon RDS 中创建自定义数据库参数组以配置逻辑复制。
rds.logical_replication=1有关更多信息,请参阅 Performing logical replication for Amazon RDS for PostgreSQL。
-
选择或创建 RDS for PostgreSQL 数据库实例,并将步骤 1 创建的参数组与该数据库实例相关联。
-
使用 Amazon 和 AWS Secrets Manager 的密码管理,在 Amazon RDS 实例上设置用户名和密码身份验证。您还可以通过创建 Secrets Manager 密钥生成用户名/密码组合。
-
如果使用完整初始快照功能,请创建 AWS KMS key 和 IAM 角色,用于将数据从 Amazon RDS 导出至 Amazon S3。
IAM 角色还必须具有以下权限策略:
该角色还应拥有以下信任关系:
-
选择或创建 OpenSearch Service 域或 OpenSearch 无服务器集合。有关更多信息,请参阅创建 OpenSearch Service 域和创建集合。
-
将基于资源的策略附加到域,或将数据访问策略附加到集合。这些访问策略允许 OpenSearch Ingestion 将数据从 Amazon RDS 数据库实例写入您的域或集合。
步骤 1:配置管道角色
完成 Amazon RDS 管道先决条件设置后,配置管道角色,以便在管道配置中使用。还需为该角色添加以下针对 Amazon RDS 源的权限:
步骤 2:创建管道
配置如下所示的 OpenSearch Ingestion 管道,将 RDS for PostgreSQL 实例指定为源。
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 安全组的入站流量访问数据库端口。有关更多信息,请参阅使用安全组控制访问权限。
如果您使用 AWS 管理控制台 创建管道,则还必须将该管道附加到您的 VPC 才能将 Amazon Aurora 作为源。要执行此操作,请找到网络配置部分,选择连接到 VPC,然后从提供的任意一个默认选项中选择 CIDR,或者选择自己的 CIDR。您可以按照 RFC 1918 当前最佳实践
要提供自定义 CIDR,请从下拉菜单中选择其他。为避免 OpenSearch Ingestion 和 Amazon RDS 之间出现 IP 地址冲突,请确保 Amazon Aurora VPC CIDR 与 OpenSearch Ingestion 的 CIDR 不同。
有关更多信息,请参阅为管道配置 VPC 访问权限。
数据一致性
为确保数据一致性,该管道会持续轮询或接收来自 Amazon RDS 实例的更改并更新 OpenSearch 索引中的相应文档。
OpenSearch Ingestion 支持端到端确认以确保数据持久性。管道读取快照或流时,它会动态创建分区以进行并行处理。管道在摄取 OpenSearch 域或集合中的所有记录后收到确认时,会将分区标记为已完成。如果要摄取到 OpenSearch 无服务器搜索集合中,您可以在管道中生成文档 ID。要摄入 OpenSearch 无服务器时间序列集合,请注意该管道不会生成文档 ID,因此必须忽略管道接收器配置中的 document_id: "${getMetadata(\"primary_key\")}"。
OpenSearch Ingestion 管道还会将传入事件操作映射到相应的批量索引操作,以帮助摄取文档。这可保持数据一致性,使 Amazon RDS 中的每个数据更改都与 OpenSearch 中的相应文档更改保持一致。
映射数据类型
OpenSearch Ingestion 管道将 PostgreSQL 数据类型映射为适合 OpenSearch Service 域或集合消费的表示形式。如果 OpenSearch 中未定义映射模板,OpenSearch 将根据首次发送的文档自动通过动态映射
下表列出 RDS for PostgreSQL 数据类型及相应的 OpenSearch 字段类型。如果未定义显式映射,则默认 OpenSearch 字段类型列会显示 OpenSearch 中相应的字段类型。在此情况下,OpenSearch 会通过动态映射自动确定字段类型。推荐的 OpenSearch 字段类型列是在映射模板中显式指定的相应推荐字段类型。这些字段类型与 RDS for PostgreSQL 中的数据类型更加一致,通常能更好地发挥 OpenSearch 提供的搜索功能。
| RDS for PostgreSQL 数据类型 | 默认的 OpenSearch 字段类型 | 推荐的 OpenSearch 字段类型 |
|---|---|---|
| smallint | 长整数 | short |
| 整数 | 长整数 | integer |
| bigint | 长整数 | 长整数 |
| decimal | 文本 | 双精度或关键字 |
| numeric[ (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 |
| timestamp [ (p) ] [没有时区] | 长整数(以 epoch 毫秒为单位) | date |
| 有时区的 timestamp [ (p) ] | 长整数(以 epoch 毫秒为单位) | date |
| date | 长整数(以 epoch 毫秒为单位) | date |
| time [ (p) ] [没有时区] | 长整数(以 epoch 毫秒为单位) | date |
| 有时区的 time [ (p) ] | 长整数(以 epoch 毫秒为单位) | date |
| interval [ fields ] [ (p) ] | 文本(ISO8601 格式) | 文本 |
| 布尔值 | 布尔值 | 布尔值 |
| point | 文本(采用 WKT 格式) | geo_shape |
| 折线图 | 文本(采用 WKT 格式) | geo_shape |
| lseg | 文本(采用 WKT 格式) | geo_shape |
| box | 文本(采用 WKT 格式) | geo_shape |
| path | 文本(采用 WKT 格式) | geo_shape |
| 多边形 | 文本(采用 WKT 格式) | geo_shape |
| circle | object | object |
| cidr | 文本 | 文本 |
| inet | 文本 | 文本 |
| macaddr | 文本 | 文本 |
| macaddr8 | 文本 | 文本 |
| bit(n) | 长整数 | 字节、短整数、整数或长整数(具体取决于位数) |
| bit varying(n) | 长整数 | 字节、短整数、整数或长整数(具体取决于位数) |
| json | object | object |
| jsonb | object | object |
| jsonpath | 文本 | 文本 |
我们建议在 OpenSearch Ingestion 管道中配置死信队列(DLQ)。如果已配置该队列,OpenSearch Service 会将所有因动态映射失败而无法摄取的失败文档发送到该队列。
如果自动映射失败,则可以在管道配置中使用 template_type 和 template_content 来定义显式映射规则。或者,您可以在启动管道之前直接在搜索域或集合中创建映射模板。
限制
为 RDS for PostgreSQL 设置 OpenSearch Ingestion 管道时,请考虑以下限制:
-
该集成仅支持每个管道一个 PostgreSQL 数据库。
-
该集成目前不支持跨区域数据摄取;Amazon RDS 实例和 OpenSearch 域必须位于同一 AWS 区域。
-
该集成目前不支持跨账户数据摄取;Amazon RDS 实例和 OpenSearch Ingestion 域必须属于同一 AWS 账户。
-
确保 Amazon RDS 实例已使用 AWS Secrets Manager 启用身份验证,这是唯一受支持的身份验证机制。
-
无法更新现有管道配置以从不同的数据库和/或不同的表摄取数据。要更新管道的数据库和/或表名称,则必须停止该管道,然后使用更新后的配置重新启动,或者创建新管道。
-
通常不支持数据定义语言(DDL)语句。以下情况下,数据一致性将无法得到保证:
-
主键已更改(添加/删除/重命名)。
-
表已被删除/截断。
-
列名或数据类型已发生更改。
-
-
如果要同步的 PostgreSQL 表未定义主键,则无法保证数据一致性。需在 OpenSearch 和接收器配置中正确定义自定义
document_id选项,才能将更新/删除同步到 OpenSearch。 -
不支持 RDS 多可用区数据库集群。
-
支持的版本:PostgreSQL 16 及更高版本。
推荐 CloudWatch 警报
建议使用以下 CloudWatch 指标监控摄取管道的性能。这些指标可帮助您确定处理的导出数据量、处理的流事件量、处理导出和流事件时的错误数以及写入目标的文档数量。您可以设置 CloudWatch 警报,从而在其中任何指标在指定期限内超出指定的值时执行某个操作。
| 指标 | 描述 |
|---|---|
pipeline-name.rds.credentialsChanged |
该指标指示 AWS 密钥的轮换频率。 |
pipeline-name.rds.executorRefreshErrors |
该指标指示刷新 AWS 密钥失败。 |
pipeline-name.rds.exportRecordsTotal |
该指标指示从 Amazon Aurora 导出的记录数量。 |
pipeline-name.rds.exportRecordsProcessed |
该指标指示 OpenSearch Ingestion 管道处理的记录数量。 |
pipeline-name.rds.exportRecordProcessingErrors |
该指标指示从 Amazon Aurora 集群读取数据时 OpenSearch Ingestion 管道中出现的处理错误数量。 |
pipeline-name.rds.exportRecordsSuccessTotal |
该指标指示成功处理的导出记录总数。 |
pipeline-name.rds.exportRecordsFailedTotal |
该指标指示处理失败的导出记录总数。 |
pipeline-name.rds.bytesReceived |
该指标指示 OpenSearch Ingestion 管道收到的总字节数。 |
pipeline-name.rds.bytesProcessed |
该指标指示 OpenSearch Ingestion 管道处理的总字节数。 |
pipeline-name.rds.streamRecordsSuccessTotal |
该指标指示该流中成功处理的记录总数。 |
pipeline-name.rds.streamRecordsFailedTotal |
该指标指示该流中处理失败的记录总数。 |