Amazon Web Services 한국 블로그

Amazon DynamoDB 데이터 백업 및 복원 방법 – (2) 리전간 복제 기능을 활용한 데이터 이동

지난 번에 Amazon DynamoDB를 Export/Import 하는 두 가지 방법을 설명 드렸습니다. 즉,  AWS 관리 콘솔을 통해 DataPipeine과 EMR을 활용하는 방법과 github에 공개되어 있는 Import/Export Java Library를 이용하는 방법입니다.

이전 글에서는 Amazon DynamoDB 현재 저장 내용을 백업하는 용도라면, 이번 글은 원본 DynamoDB 테이블에 변경 내용만 다른 테이블에 지속적으로 복제(Replication)하는 방법을 안내해  드립니다.  이 방법은 공식 기술 문서에 따라 Github에 있는 소스 코드를 활용하는 것으로, 여기서 활용되는 리전간 복제 기능(Cross-region replication)은 기존 저장된 데이터를 읽어 옮기지는 않는다는 점에 유의하시기 바랍니다.

Amazon DynamoDB 리전간 복제 기능
Amazon DynamoDB 리전간 복제 기능은 자바(Java)로 개발되어 있습니다. 해당 라이브러리는 원본 DynamoDB ㅌ테이블에서 데이터 변경이나 새로운 데이터가 입력되면,  이동 대상 DynamoDB 테이블에 복제하는 기능을 합니다.  본  기능을 수행하는 라이브러리는 DynamoDB Stream을 통해 만들어졌으며,  이는 Amazon Kinesis를 활용하여  원본 테이블에서 변경된 정보를 Kinesis 스트림에 넣고 이를 가져와서 처리하거나 저장하게 됩니다.

본 기능을 잘 활용하면, 글로벌 멀티 플레이어 게임 서비스에서 각 리전(Region)에서 DynamoDB를  게임 마스터 DB로 사용할 경우,  다른 리전에서 업데이트 되거나 새로 입력된 데이터를 DynamoDB Stream을 통해 가져와  동기화할 수 있습니다. 또한, 변경되거나 새로 생성된 데이터를 DynamoDB Stream으로 받아 분석하거나 모니터링하는 용도로 활용 가능합니다.

또한, 이 도구는 병렬 처리를 지원합니다. 예를 들어, 매우 큰 사이즈의 DynamoDB 테이블의 경우 빠르게 옮기기 위해 이 도구를 여러 EC2 인스턴스에서 실핼 할 수도 있습니다. 이는 내부적으로 체크포인트(Checkpoint)를 사용하여 겹치지 않도록 병렬로 데이터를 옮길 수 있습니다. 병렬 처리 외에 복수 개의 DynamoDB 테이블도 지원합니다. 즉, 원본 테이블이 버지니아 리전에 있고, 서울 리전과 더블린 리전으로 복사하고 싶다면, 별도로 두 개의 프로세스를 실행 시켜서 복제가 가능합니다.

리전간 복제 라이브러리 설치
Amazon DynamoDB 리전간 복제 기능을 실행하기 위해서는 몇 가지 준비가 필요합니다. 우선 설치 후 실행할 리눅스 인스턴스가 필요합니다. 이 블로그에서는 Amazon Linux AMI를 이용하여 서울 리전에 인스턴스를 실행하여 설치하였습니다.

1. 빌드를 위해서는 메이븐(Maven)이 필요합니다. 메이븐을 받아 설치를 합니다. 다운로드 받은 후 원하는 위치에서 압축을 해제합니다. 보통 /usr/local 에 설치합니다. 메이븐 실행 파일인 mvn 을 실행하기 위해서 설치된 폴더 위치를 PATH환경 변수에 등록하여 줍니다. mvn 설치를 확인합니다.

$ wget http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
$ tar -zxvf ./apache-maven-3.3.9-bin.tar.gz
$ export PATH=/usr/local/apache-maven-3.3.9/bin:$PATH
$ mvn --version
[ec2-user@ip-172-31-13-42 apache-maven-3.3.9]$ mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
Maven home: /usr/local/apache-maven-3.3.9
Java version: 1.7.0_111, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.111.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.23-31.54.amzn1.x86_64", arch: "amd64", family: "unix"

2. 미리 Java JDK devel를 설치하여 mvn install 시에 중간에 에러가 없도록 준비합니다.

$ sudo yum install -y java-1.7.0-openjdk-devel

3. Github 의 소스를 Local로 가져옵니다. (만약 git이 설치되어 있지 않다면, sudo yum install git명령으로 먼저 설치합니다.)

$ git clone https://github.com/awslabs/dynamodb-cross-region-library.git

4. dynamodb-cross-region-libray가 복사된 폴더로 이동하여 아래 명령을 통해 빌드와 설치를 진행합니다.

$ sudo env "PATH=$PATH" mvn install
[ec2-user@ip-172-31-13-42 dynamodb-cross-region-library]$ mvn install
[INFO] Scanning for projects...
Downloading: https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk-bom/1.10.77/aws-java-sdk-bom-1.10.77.pom
Downloaded: https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk-bom/1.10.77/aws-java-sdk-bom-1.10.77.pom (14 KB at 9.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk-pom/1.10.77/aws-java-sdk-pom-1.10.77.pom
Downloaded: https://repo.maven.apache.org/maven2/com/amazonaws/aws-java-sdk-pom/1.10.77/aws-java-sdk-pom-1.10.77.pom (9 KB at 27.0 KB/sec)
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building DynamoDB Cross-region Replication 1.1.0
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.7/maven-resources-plugin-2.7.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.7/maven-resources-plugin-2.7.pom (8 KB at 25.3 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/25/maven-plugins-25.pom
……………………………………
Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.5/plexus-utils-3.0.5.jar (226 KB at 719.0 KB/sec)
[INFO] Installing /usr/local/dynamodb-cross-region-library/target/dynamodb-cross-region-replication-1.1.0.jar to /root/.m2/repository/com/amazonaws/dynamodb-cross-region-replication/1.1.0/dynamodb-cross-region-replication-1.1.0.jar
[INFO] Installing /usr/local/dynamodb-cross-region-library/pom.xml to /root/.m2/repository/com/amazonaws/dynamodb-cross-region-replication/1.1.0/dynamodb-cross-region-replication-1.1.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:07 min
[INFO] Finished at: 2016-10-24T08:57:10+00:00
[INFO] Final Memory: 34M/128M
[INFO] ------------------------------------------------------------------------

데이터 복제 진행 여부 확인하기
원본 테이블에서 DynamoDB Stream을 활성합니다. 테이블은 이전 블로그 테이블을 활용하였습니다.

새로 저장될 테이블은 DynamoDB-replica1으로 원본 테이블과 동일한 Partition key(resource), Sort key를 설정하여 테이블을 생성합니다.

최종 빌드 된 jar파일이 있는 폴더로 이동하여 Github에 나온 안내를 참고하여 필요한 인자(Argument)를 주어 실행합니다. 위에서 설명드린 것처럼 버지니아 리전에 있는 Kinesis-Data-Visualization-CountsDynamoDBTable-49AHMYW180WC 테이블을 원본 테이블로 지정하고, 버지니아 리전에 DynamoDB-replica1이라는 테이블로 복제하는 명령의 예제입니다. 아래 명령은 실행된 후에 스탠드얼론(Standalone)으로 계속 실행 중이 됩니다.

$ sudo java -jar dynamodb-cross-region-replication-1.1.0.jar --sourceEndpoint dynamodb.us-east-1.amazonaws.com --sourceTable Kinesis-Data-Visualization-CountsDynamoDBTable-49AHMYW180WC --destinationEndpoint dynamodb.us-east-1.amazonaws.com --destinationTable DynamoDB-replica1

원본 테이블에 데이터를 하나 생성하여 입력합니다.

DynamoDB-replica1에 해당 아이템이 생성되었는지 확인합니다.

2회에 걸쳐 Amazon DynamoDB의 내용을 백업 및 복원, 그리고 변경이나 새로운 데이터를 바로 복제하는 방법을 알아 보았습니다. 글로벌 게임 개발 시 다양한 시나리오 따라 활용 사례가 많으므로 도움이 되시길 바랍니다.

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 김일호 솔루션즈 아키텍트께서 작성해주셨습니다.