데이터 마이그레이션이란 데이터베이스 스키마의 버전을 관리하기 위한 하나의 방법으로, 데이터 전환을 의미한다. 데이터베이스 마이그레이션은 프레임워크의 특정 명령어(장고의 경우 migrate)를 통해 실행하고, 이 결과를 별도의 테이블에서 버전 관리 하게 된다.
애플리케이션과 스키마가 바뀌어 개발 과정에는 적용 됐지만 운영 환경에는 적용되지 않아 데이터베이스 전환시 애를 먹는 경우가 있는데, 데이터베이스 마이그레이션은 이러한 문제를 해결한다.
prod 환경의 DB를 dev 환경으로 가져오기 위해 사용할 수 있다.
아래의 공식문서에 장고에서 boto3로 dms를 사용하는 방법이 나와 있다.
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dms.html#client
처음 task를 생성한 뒤 아래의 방법을 이용해 ‘ongoing replication task’를 만들 수 있다.
아래 메소드를 이용할 수 있다.
start_replication_task(**kwargs)
그 전에, aws docs에 따르면 “source endpoint”와 “target endpoint”를 지정해 놓아야 한다.
따라서, RDS의 데이터를 로컬로 옮기고 싶다면 “source endpoint”는 RDS의 endpoint가 되어야 한다.
사용 방법은 다음과 같다.
response = client.start_replication_task(
ReplicationTaskArn='string',
StartReplicationTaskType='start-replication'|'resume-processing'|'reload-target',
CdcStartTime=datetime(2015, 1, 1),
CdcStartPosition='string',
CdcStopPosition='string'
)
StartReplicationTaskType에서 ‘start-replication’은 처음 task를 실행할 때만 유효하며 그 뒤로는 ‘resume-proecessing’ 혹은 ‘reload-target’을 이용해야 한다.
위 요청을 실행하면 response에 아래 값들이 들어온다.
{
'ReplicationTask': {
'ReplicationTaskIdentifier': 'string',
'SourceEndpointArn': 'string',
'TargetEndpointArn': 'string',
'ReplicationInstanceArn': 'string',
'MigrationType': 'full-load'|'cdc'|'full-load-and-cdc',
'TableMappings': 'string',
'ReplicationTaskSettings': 'string',
'Status': 'string',
'LastFailureMessage': 'string',
'StopReason': 'string',
'ReplicationTaskCreationDate': datetime(2015, 1, 1),
'ReplicationTaskStartDate': datetime(2015, 1, 1),
'CdcStartPosition': 'string',
'CdcStopPosition': 'string',
'RecoveryCheckpoint': 'string',
'ReplicationTaskArn': 'string',
'ReplicationTaskStats': {
'FullLoadProgressPercent': 123,
'ElapsedTimeMillis': 123,
'TablesLoaded': 123,
'TablesLoading': 123,
'TablesQueued': 123,
'TablesErrored': 123,
'FreshStartDate': datetime(2015, 1, 1),
'StartDate': datetime(2015, 1, 1),
'StopDate': datetime(2015, 1, 1),
'FullLoadStartDate': datetime(2015, 1, 1),
'FullLoadFinishDate': datetime(2015, 1, 1)
},
'TaskData': 'string',
'TargetReplicationInstanceArn': 'string'
}
}
이 중, 원하는 값만을 취하여 사용하면 된다.
response = client.describe_replication_tasks(
Filters=[
{
'Name': 'string',
'Values': [
'string',
]
},
],
MaxRecords=123,
Marker='string',
WithoutSettings=True|False
)
migration시 인덱스가 바뀔 수 있으니 이를 재설정 해주는 작업도 꼭 해야 한다.
response에는 다음과 같은 내용이 들어 온다.
{
'Marker': 'string',
'ReplicationTasks': [
{
'ReplicationTaskIdentifier': 'string',
'SourceEndpointArn': 'string',
'TargetEndpointArn': 'string',
'ReplicationInstanceArn': 'string',
'MigrationType': 'full-load'|'cdc'|'full-load-and-cdc',
'TableMappings': 'string',
'ReplicationTaskSettings': 'string',
'Status': 'string',
'LastFailureMessage': 'string',
'StopReason': 'string',
'ReplicationTaskCreationDate': datetime(2015, 1, 1),
'ReplicationTaskStartDate': datetime(2015, 1, 1),
'CdcStartPosition': 'string',
'CdcStopPosition': 'string',
'RecoveryCheckpoint': 'string',
'ReplicationTaskArn': 'string',
'ReplicationTaskStats': {
'FullLoadProgressPercent': 123,
'ElapsedTimeMillis': 123,
'TablesLoaded': 123,
'TablesLoading': 123,
'TablesQueued': 123,
'TablesErrored': 123,
'FreshStartDate': datetime(2015, 1, 1),
'StartDate': datetime(2015, 1, 1),
'StopDate': datetime(2015, 1, 1),
'FullLoadStartDate': datetime(2015, 1, 1),
'FullLoadFinishDate': datetime(2015, 1, 1)
},
'TaskData': 'string',
'TargetReplicationInstanceArn': 'string'
},
]
}
response에 들어오는 값들 중 "ReplicationTaskStats"에서 '진행 상태'와 관련된 값들을 확인할 수 있는데, "ElapsedTimeMillis"로는 진행 시간을 알 수 있고 "FullLoadProgressPercent"로는 진행 정도를 알 수 있다.
포스타입 팀에서 작성한 블로그에 따르면, 테이블 하나씩 DMS를 하는 것이 좋다고 한다... 그래야 일부 테이블 이전시 오류가 발생해도 해당 작업만 일시 중지한 후 다시 시작할 수 있기 때문이라고 한다~! 하지만 번거롭다는 단점이 있을 수 있다. 그렇기 때문에 진행 시간과 상황을 확인해 보며 DMS를 진행하는 것도 좋을 것 같다.
참고
(1) 아마존 ARN
https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws-arns-and-namespaces.html
(2) 아마존 DMS doc
https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.html
(3) 포스타입 팁 DMS