데이터베이스 마이그레이션 방안

이택영·2023년 8월 15일
1

Database

목록 보기
1/1

기존에 배포했던 PoC-서비스(Proof of Concept Service)에 수많은 기능 추가와 변경사항이 있었습니다. 그래서 데이터베이스 구조 부터 새로 서비스를 설계해서 개발/배포하려고 하고있습니다.
그런데 기존의 사용자들도 새로운 서비스로 이전시켜야 하는 상황이어서, 데이터베이스 마이그레이션을 진행하려고 하고있습니다.

이전에 작은 규모의 복잡도 낮은 서비스에 대해서 파이썬을 사용해 마이그레이션을 진행해본 경험이 있었는데, 파이썬 ORM 라이브러리를 사용해 소스-데이터베이스와 타겟-데이터베이스에 연결하고, 소스-데이터베이스 에서 데이터를 읽어오고 적절하게 구조를 변경한 후에, 타겟-데이터베이스로 값을 쓰는 방식이었습니다.

그런데 이러한 방식은 하나의 데이터를 불러오고, 하나의 데이터를 쓰는 방식이라 많지 않은 데이터 였음에도 수시간 이상이 소요되었습니다.
또한 하나의 프로세스내에서 데이터를 읽어오고, 변경하고, 쓰는 과정이 포함되어 있어서 데이터 이전중에 데이터에 대해서 검증을 진행할 수 있는 방법이 없었습니다.

그래서 이번에는 소스-데이터베이스에서 타겟-데이터베이스에 데이터를 이전하는데 중간에 큐(Queue)를 두는 방식으로 진행해 보려고 합니다.
아마도 소스-데이터베이스에서 데이터를 불러온후에 이를 타겟-데이터베이스 구조에 알맞게 변경을 하고. 변경된 데이터를 큐에 적제합니다.
그렇게 큐에 이전해야하는 모든 데이터들이 적제되고 나면, 큐에 대해서 데이터들의 개수나 구조 등을 검증합니다. 그렇게 검증이 완료된 데이터들이 적제된 큐를 타겟-데이터베이스의 트렌젝션 내에다 이전합니다.

이때 특이사항으로는 기존 PoC-서비스와 새로운 서비스가 모두 Nodejs를 사용해 개발되었고, 같은 ORM 라이브러리 TypeORM을 사용했다는 것입니다.
TypeORM은 Typescript의 Class(TypeORM Entity)를 사용해 데이터베이스의 테이블 구조를 나타낼 수 있습니다.
그래서 소스-데이터베이스, 타겟-데이터베이스들의 테이블 구조에 대해서 Class(Entity) 들이 선언된 상태입니다.

이러한 상황을 토대로 예상되는 데이터베이스 마이그레이션 방안은 이러합니다.
1. 소스-데이터베이스를 사용하는 서비스를 중지합니다.
2. 소스-데이터베이스로부터 데이터를 불러오고, 불러온 데이터를 TypeORM Entity에 매핑합니다.
3. 매핑된 소스-데이터베이스 TypeORM Entity를 새로운 구조, 타겟-데이터베이스 TypeORM Entity로 매핑시킵니다.
4. 그리고 매핑된 타겟-데이터베이스 TypeORM Entity를 큐에 적제합니다.
5. 모든 데이터들이 큐에 적제되고 나면 - 큐에 적제된 데이터들의 개수, 정합성 등 데이터들에 대한 검증을 진행합니다.
6. 큐에 적제된 데이터들에 문제가 없다고 결정되면, 큐에 적제된 데이터들을 차례대로 타겟-데이터베이스에, 하나의 트렌젝션 내에서, 적제합니다. - (데이터 베이스 트렌젝션 크기제한에 대한 의견)
7. 데이터들이 타겟-데이터베이스에 문제없이 적제되고나면, 새로운 타겟-데이터베이스를 사용하는 서비스를 사용자들에게 배포합니다.

글을 쓰면서 생각해보니, 데이터베이스이전을 위한 다운타임이 필요하고 이 다운 타임을 최소화하고 다운타임에 문제가 발생했을 때 어떻게 조치할지에 대해서도 생각해 봐야겠습니다.

profile
괴발개발

2개의 댓글

comment-user-thumbnail
2023년 8월 15일

좋은 글 감사합니다.

1개의 답글