기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
여러 테이블의 데이터를 조인하여 하나의 문서로 수집
RDS 소스 플러그인의 joins 구성을 사용하면 정규화된 관계형 테이블을 단일 OpenSearch 문서로 자동 비정규화할 수 있습니다. 구성되면 파이프라인은 여러 관련 테이블에서 변경 데이터 캡처(CDC) 이벤트를 읽고 Painless 스크립트 기반 업서트를 사용하여 상위 문서에 병합합니다.
이 주제에서는 조인 유형, 사전 조건, 구성 구문, 버전 추적 및 일반적인 문제 해결을 포함하여 Aurora 및 Amazon RDS 수집 파이프라인에서 테이블 조인을 구성하는 방법을 설명합니다.
사전 조건
-
프라이머리 키, 외래 키, 테이블 관계를 포함한 관계형 데이터베이스 개념에 대한 기본 이해.
-
외래 키 관계가 있는 테이블(상위-하위).
-
의 모든 테이블은에 나열되어야
relations합니다tables.include. -
상위 테이블에는 기본 키가 있어야 합니다.
-
하위 테이블에는 상위의 기본 키를 참조하는 열이 있어야 합니다.
-
하위 테이블에는 업서트에서 개별 레코드를 식별하기 위한 자체 기본 키(
child_primary_key)가 있어야 합니다.
지원되는 조인 패턴
-
상위 → 하위(1:1)
-
상위 → 하위(1:N)
-
상위 항목당 여러 하위 항목
구성의 예
다음 YAML 구성은 Aurora 소스 플러그인에 대한 상위-하위 테이블 관계를 정의하는 방법을 보여줍니다. 이 예제에서는 서로 다른 조인 유형을 사용하는 두 개의 하위 테이블로 상위 테이블을 구성합니다.
version: "2" aurora-joins-pipeline: source: rds: db_identifier: "my-aurora-cluster" engine: "aurora-mysql" database: "my_database" tables: include: - "parent_table" - "child_table_1" - "child_table_2" s3_bucket: "my-pipeline-bucket" s3_region: "us-east-1" s3_prefix: "rds-export" export: kms_key_id: "my-kms-key-id" iam_role_arn: "arn:aws:iam::123456789012:role/my-export-role" stream: true aws: sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role" region: "us-east-1" authentication: username: ${{aws_secrets:secret:username}} password: ${{aws_secrets:secret:password}} joins: version_field: "__versions" relations: - parent: "parent_table" child: "child_table_1" parent_key: "id" child_key: "parent_id" child_primary_key: "child_id" join_type: "one_to_many" max_child_records: 100 - parent: "parent_table" child: "child_table_2" parent_key: "id" child_key: "parent_id" child_primary_key: "child_id" join_type: "one_to_one" sink: - opensearch: hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"] index: "my-joined-index" document_id: "${getMetadata(\"primary_key\")}" action: "${getMetadata(\"opensearch_action\")}" aws: sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role" region: "us-east-1" extension: aws: secrets: secret: secret_id: "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-db-secret" region: "us-east-1" sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role" refresh_interval: PT1H
조인 유형
- one_to_one
-
하위 필드는 상위 문서의 루트 수준에서 평면화됩니다. 각 상위 항목에 정확히 하나의 관련 하위 레코드가 있을 때 사용합니다.
Parent table: orders (order_id, customer_name, total) Child table: shipping (shipping_id, order_id, tracking_number, carrier) Result document: { "order_id": 1, "customer_name": "Alice", "total": 299.99, "shipping_id": "1", "tracking_number": "TRK-1", "carrier": "FedEx" } - one_to_many
-
하위 레코드는 상위 문서에 중첩 배열로 저장됩니다. 각 상위 항목에 여러 개의 관련 하위 레코드가 있을 수 있는 경우에 사용합니다.
Parent table: orders (order_id, customer_name, total) Child table: order_items (item_id, order_id, product_name, quantity, price) Result document: { "order_id": 1, "customer_name": "Alice", "total": 299.99, "order_items": [ {"item_id": 10, "product_name": "Keyboard", "quantity": 1, "price": 149.99}, {"item_id": 11, "product_name": "Mouse", "quantity": 1, "price": 29.99} ] }
문서 구조
- 문서 ID
-
OpenSearch 문서는 상위 테이블의 기본 키 값으로
_id설정됩니다. 동일한 상위 항목에 대한 모든 하위 레코드가이 단일 문서에 병합됩니다. - 버전 추적
-
version_field(기본값:__versions)는 테이블별 버전 카운터의 맵을 저장합니다."__versions": { "orders": 12345678901, "order_items": 12345678902, "shipping": 12345678903 }각 테이블의 버전은 내보내기 타임스탬프 또는 binlog 타임스탬프에서 파생됩니다. 내보내기 또는 CDC 이벤트가 도착하면 Painless 스크립트는 수신 버전이 해당 특정 테이블에 대해 저장된 버전보다 최신 버전인지 확인합니다. 오래된 경우 이벤트를 건너뜁니다. 이렇게 하면 다음이 보장됩니다.
-
Idempotent 처리 - 재생된 이벤트는 안전하게 무시됩니다.
-
독립 버전 관리 - 주문 업데이트가 항목 업데이트를 방해하지 않습니다.
-
동시 안전 - 동일한 상위에 대한 여러 하위 삽입이 올바르게 처리됩니다.
-
- 문서 _버전
-
OpenSearch
_version필드는 업서트가 성공할 때마다 증가합니다. 상위 항목 1개 + N개 항목 + 배송 레코드 1개가 있는 문서의 경우_version= N + 2입니다.
제한 사항
-
단일 수준 조인만 - 상위 → 하위. 다단계(상위 → 하위 → 손자)는 지원되지 않습니다.
-
파이프라인당 상위 테이블 1개. 모든 하위 테이블은 동일한 상위 테이블에 조인합니다.
-
하위 테이블은 동일한 파이프라인의 여러 상위 테이블에 속할 수 없습니다.
-
max_child_records는one_to_many조인의 배열 크기를 제한합니다. 이 제한을 초과하는 레코드는 삭제됩니다.
필드 이름 충돌
one_to_one 조인의 경우 하위 필드는 루트 수준에서 평면화됩니다. 하위 테이블에 상위 열과 이름이 같은 열이 있는 경우 하위 값은 상위 값을 덮어씁니다. 상위 테이블과 one_to_one 하위 테이블에서 고유한 열 이름을 사용합니다.
one_to_many 조인의 경우 하위 필드는 하위 테이블의 이름을 따서 라는 배열 내에 중첩되므로 충돌이 문제가 되지 않습니다.
문제 해결
- 하위 레코드가 누락된 문서
-
-
문서를
__versions확인합니다. 하위 테이블의 버전이 누락된 경우 하위 이벤트가 아직 처리되지 않은 것입니다. -
파이프라인이 활성 상태이고 지표가
changeEventsProcessed0이 아닌지 확인합니다.
-
- OpenSearch에 표시되지 않는 문서
-
-
원본 테이블에 상위 레코드가 있는지 확인합니다.
-
tables.include목록에 필요한 모든 테이블이 포함되어 있는지 확인합니다. -
파이프라인 로그에서 수집 실패 및 구성 문제를 확인합니다
/aws/vendedlogs/.pipeline-log-group
-