siner308 / blog-posts

blog post store
https://github.com/siner308/blog
1 stars 0 forks source link

cdc 파헤치기 #45

Open siner308 opened 1 year ago

siner308 commented 1 year ago

title: "CDC 알아보기" subtitle: "무중단 데이터베이스 마이그레이션 방법론" tags:

이번 글에서는 API 하위호환 지원에 대한 내용은 다루지 않습니다.

서론

구글과 같이 무중단 마이그레이션을 점검없이 잘 수행하는 능력을 가지고 싶은 개발자 되고싶다.

항상 위와 같은 생각을 하고있었고, 이번기회에 데이터베이스 마이그레이션에 대해 조금 더 깊게 공부하고자 글을 작성하게 되었습니다.

단순 마이그레이션의 한계

기존에는 사용하던 데이터베이스에 마이그레이션 쿼리를 적용했고, 아래의 순서를 따릅니다.

  1. 서버가 시작되면서 마이그레이션 파일들을 스캔하고, 어디까지 db에 반영되었는지 migration history 테이블을 조회하여 체크한다.
  2. 아직 db에 반영되지 않은 마이그레이션 쿼리를 반영한다.
  3. 마이그레이션이 제대로 반영되었다면, migration history 테이블에 기록한다.
  4. 서버가 실행된다.

위의 과정은 다음과 같은 문제를 발생시킬 수 있습니다.

  1. 다음 버전의 서버가 천천히 하나씩 뜨지 않고 한번에 뜨게 되는 경우, 두개 이상의 서버가 하나의 마이그레이션을 동시에 실행시켜서 문제를 일으킬 수 있습니다.
  2. 적용할 쿼리의 영향 범위와 트랜잭션 격리 레벨에 따라 서비스에 다운타임이 발생할 수 있습니다.
  3. 롤백을 할 수 없는 breaking change 쿼리가 있다면 (one way door), 문제가 발생했을 경우 snapshot을 기준으로 롤백을 해야할 수 있는데, 이는 2번의 케이스보다 더 긴 다운타임이 발생할 수 있습니다.

게임과 같이 모든 사용자가 동시에 같은 버전을 사용해야하는 케이스가 아니라면, 어느 회사나 무중단으로 서비스를 운영하여 이익을 극대화 하고 싶을 것입니다.

CDC (Change Data Capture)

무중단 마이그레이션이라는 키워드로 검색을 해보면, CDC라는 솔루션이 있는 것을 확인할 수 있습니다.

CDC(Change Data Capture)는 DB의 변경사항을 트래킹하여 이를 활용하는 방법론에 가까운 포괄적인 개념입니다. 이러한 CDC는 애플리케이션 레이어에 구현할 수도 있고, 물리적 스토리지에 구축할 수도 있다고 합니다.

이전에 혼자서 무중단 마이그레이션에 대해 고민해볼 때, PostgreSQL의 WAL이나 MySQL의 Redo Log와 같은 개념을 적용하면 되지 않을까 라는 생각을 했었는데, CDC도 이러한 개념을 사용하고 있었습니다.

방법론

설명을 돕기 위해 최초에 존재했던 db를 v1, 새로 이전할 장소의 db를 v2라고 부르겠습니다.

마이그레이션을 진행한다고 하면, 특정 시점을 기반으로 v1 snapshot을 기준으로 v2를 생성하고, v2에 마이그레이션을 반영하게 될 것입니다. 하지만 그러는 동안에도 v1에는 새로운 데이터가 쌓이게 될 것이고, 이러한 데이터들을 놓치지 않고 v2로 잘 마이그레이션을 해 주어야 합니다.

위에서 언급한 것 처럼, v1에 기록된 데이터 중 어디까지가 v2에 반영되었는지를 알 수 있어야 나머지 v1에 있는 데이터를 잘 옮길 수 있을 것입니다.

위키피디아 CDC 문서에는 다음과 같은 방법론이 제시되고 있습니다.

정리

이러한 CDC 방법론을 적용하면 다운타임이 없고 견고한 서비스를 유지하는 것이 가능합니다. 물론 마이그레이션의 영향도가 낮거나, 다운타임에 대한 리스크가 크지 않은 제품에 대해서는 불필요한 비용이 될 수도 있습니다. 이러한 CDC를 잘 적용하기 위해서는 incremental primary key를 사용하는 것이 아닌, UUID와 같은 timestamp 기반의 id를 사용하는 것이 두 데이터베이스간의 무결성을 유지하는데 도움이 될 것 같습니다.

References