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를 클릭합니다.
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개 리전에서 사용 가능하며 향후 더 많은 리전이 계획되고 있습니다. 요금에는 변화가 없습니다. 추가 리전에서 사용하는 리소스 및 리전 간 데이터 전송에 대해서만 비용을 지불하면 됩니다.
이 업데이트에는 고객들의 가장 일반적인 피드백이 반영되었으며 향후 추가 기능을 구축하기 위한 플랫폼으로 사용될 것입니다. 고객 여러분께서 글로벌 테이블을 사용하는 방식은 어떠하며 앱에 중요한 요소는 무엇인지 계속해서 알려 주십시오.