Amazon Web Services 한국 블로그

Amazon DynamoDB 기존 로컬 테이블을 글로벌 테이블로 전환 가능

수십만의 AWS 고객들이 Amazon DynamoDB를 사용하고 있습니다. 2017년에는 멀티 리전의 멀티 마스터 DynamoDB 테이블을 배포할 수 있는 글로벌 테이블을 출시했습니다. 글로벌 테이블을 생성할 때, 테이블을 제공할 AWS 특정 리전을 지정하기만 하면 각 리전에 동일한 테이블을 생성하고 지속적인 데이터 변경 내용을 해당하는 모든 리전으로 전파를 수행합니다.

AWS 고객은 두 가지 중요한 이유 때문에 DynamoDB 글로벌 테이블을 사용하고 있습니다. 첫째는 지연 시간이 짧은 환경을 고객에게 제공하는 것이고, 둘째는 백업 또는 재해 복구 프로세스를 지원하는 것입니다. 지연 시간은 정보가 네트워크를 통해 이동하는 데 걸리는 시간입니다. 지연 시간이 짧은 앱은 고객 참여도가 높고 더 많은 수익을 창출합니다. 고객과 인접한 여러 리전에 백엔드를 배포하면 앱의 지연 시간을 줄일 수 있습니다. 다른 리전에 데이터의 전체 사본이 있으면 리전 설정이 손상되거나 매우 드물지만 리전에 장애가 발생하는 경우 다른 리전으로 트래픽을 쉽게 전환할 수 있습니다. Amazon CTO인 Werner Vogels 박사는 “장애는 피할 수 없으며, 어떤 것이든 시간이 지나면 장애가 발생할 수밖에 없습니다”라고 언급한 바 있습니다.

오늘부터는 AWS 관리 콘솔에서 몇 번 클릭하거나 AWS CLI(명령줄 인터페이스) 또는 Amazon DynamoDB API를 사용하여 기존 DynamoDB 테이블을 글로벌 테이블로 변환할 수 있습니다. 과거에는 빈 테이블만 글로벌 테이블로 변환할 수 있었습니다. 따라서 테이블을 생성할 때 테이블의 리전 사용 범위를 추측해야 했습니다. 이제 언제든지 기존 글로벌 테이블을 추가 리전으로 확장할 수 있습니다.

복제를 설정하는 동안에도 애플리케이션에서 계속 테이블을 사용할 수 있습니다. 테이블에 리전을 추가하면 DynamoDB에서 기존 테이블의 스냅샷을 사용하여 새 복제본을 채우기 시작합니다. DynamoDB가 새 복제본을 구축하는 동안에도 애플리케이션은 기존 리전에 계속 기록할 수 있으며 결국에는 모든 인플라이트 업데이트가 새 복제본으로 복제됩니다.

AWS CLI(명령줄 인터페이스)를 사용하여 DynamoDB 글로벌 테이블을 생성하기 위해 먼저 미국 서부(오레곤) 리전(us-west-2)에서 로컬 테이블을 만들어 보겠습니다.

aws dynamodb create-table --region us-west-2 \
                          --table-name demo-global-table \
                          --key-schema AttributeName=id,KeyType=HASH \
                          --attribute-definitions AttributeName=id,AttributeType=S \
                          --billing-mode PAY_PER_REQUEST

이 명령은 다음을 반환합니다.

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "id",
                "AttributeType": "S"
            }
        ],
        "TableName": "demo-global-table",
        KeySchema:
            {
                "AttributeName": "id",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1570278914.419,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 0,
            "WriteCapacityUnits": 0
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:us-west-2:400000000003:table/demo-global-table",
        "TableId": "0a04bd34-bbff-42dd-ae18-78d05ce641fd",
        "BillingModeSummary": {
            "BillingMode": "PAY_PER_REQUEST"
        }
    }
}

테이블이 생성되면 몇 가지 항목을 추가합니다.

aws dynamodb batch-write-item --region us-west-2 --request-items file://./batch-write-items.json

(json 파일은 gist로 사용 가능합니다.)

그런 다음 미국 동부(버지니아 북부) 리전(us-east-1)을 추가하기 위해 테이블을 업데이트합니다.

aws dynamodb update-table --region us-west-2 --table-name demo-global-table --add-region us-east-1 (TBD??)

이 명령은 긴 JSON을 반환합니다. 주의를 기울여야 하는 속성입니다.

{
...
        "TableStatus": "UPDATING",
        "TableSizeBytes": 124,
        "ItemCount": 3,
        "StreamSpecification": {
            "StreamEnabled": true,
            "StreamViewType": "NEW_AND_OLD_IMAGES"
        },
        "LatestStreamLabel": "2019-10-22T19:33:37.819",
        "LatestStreamArn": "arn:aws:dynamodb:us-west-2:400000000003:table/demo-global-table/stream/2019-10-22T19:33:37.819"
    }
...
}

AWS 관리 콘솔에서 동일한 업데이트를 적용하고 업데이트할 테이블을 선택한 다음 Global Tables를 클릭합니다.

스트리밍 활성화는 글로벌 테이블의 필수 요건입니다. Enable stream을 클릭한 다음 Add region을 클릭합니다.

복제할 리전을 선택합니다. 예를 들면 EU West (Ireland)를 선택하고 Create replica를 클릭합니다.

DynamoDB에서는 비동기적으로 테이블을 새 리전에 복제합니다. AWS Management Console에서 복제 진행 상황을 모니터링합니다. 최종적으로 테이블의 상태는 Creating에서 Active로 변경됩니다. DescribeTable API를 호출하여 상태를 점검하고 TableStatus = Active를 확인할 수도 있습니다.

잠시 후에 새 리전에서 테이블을 쿼리할 수 있습니다.

aws dynamodb get-item --region eu-east-1 --table-name demo-global-table --key '{"id" : {"S" : "0123456789"}}'

{
    "Item": {
        "firstname": {
            "S": "Jeff"
        },
        "id": {
            "S": "0123456789"
        },
        "lastname": {
            "S": "Barr"
        }
    }
}

오늘부터 기존 테이블을 글로벌 테이블로 업데이트할 수 있습니다. 몇 주 후에는 이 새로운 기능을 활용할 수 있도록 기존 글로벌 테이블을 업데이트할 수 있는 도구가 출시될 것입니다. 업데이트 자체는 불과 몇 분이면 완료됩니다. 업데이트가 진행 중인 동안에도 애플리케이션에서 테이블을 사용할 수 있습니다.

기타 기능 개선
데이터 동기화에 사용되는 내부 메커니즘도 간소화되고 있습니다. 전에는 데이터의 동기화 상태를 유지하기 위해 DynamoDB 글로벌 테이블에서 DynamoDB 스트림을 활용했으며 스키마에서 세 가지 속성(aws:rep:*)을 추가했습니다. DynamoDB는 이제 기본적으로 복제를 관리합니다. 데이터에 동기화 속성을 노출하지 않으며 추가적인 쓰기 용량을 소비하지 않습니다.

  • 글로벌 테이블의 각 리전에서 한 번의 쓰기 작업만 발생하므로 테이블에 필요한 복제된 쓰기 용량의 소비가 감소합니다.
  • 이 때문에 두 번째 DynamoDB 스트림 레코드는 더 이상 게시되지 않습니다.
  • 이전에 채워졌던 세 개의 aws:rep:* 특성은 항목 레코드에 더 이상 삽입되지 않습니다.

이와 같은 변화는 앱에 두 가지 영향을 미칩니다. 첫째, 글로벌 테이블 사용 시 동기화 관리에 추가적인 쓰기 용량이 필요하지 않으므로 DynamoDB 비용이 절감됩니다. 둘째, 애플리케이션이 세 가지 기술적인 항목(aws:rep:*)에 의존하는 경우 약간의 코드 변경이 필요합니다. 특히, DynamoDB Mapper는 항목 레코드에 aws:rep:* 속성을 필요로 하지 않습니다.

이러한 변경 사항과 더불어 당사는 UpdateTable API도 업데이트하고 있습니다. 글로벌 테이블의 GSI(글로벌 보조 인덱스), 결제 모드, 서버 측 암호화 또는 쓰기 용량 단위를 수정하는 작업은 모든 다른 복제본에 비동기적으로 적용됩니다.

가용성
향상된 Amazon DynamoDB 글로벌 테이블Amazon DynamoDB 글로벌 테이블을 사용할 수 있는 13개 리전에서 사용 가능하며 향후 더 많은 리전이 계획되고 있습니다. 요금에는 변화가 없습니다. 추가 리전에서 사용하는 리소스 및 리전 간 데이터 전송에 대해서만 비용을 지불하면 됩니다.

이 업데이트에는 고객들의 가장 일반적인 피드백이 반영되었으며 향후 추가 기능을 구축하기 위한 플랫폼으로 사용될 것입니다. 고객 여러분께서 글로벌 테이블을 사용하는 방식은 어떠하며 앱에 중요한 요소는 무엇인지 계속해서 알려 주십시오.

— seb