데이터베이스 migration을 위한 script 만들기

migration script 소개

데이터를 마이그레이션하는 방법에는 여러가지가 있지만 핏펫은 서비스 다운타임을 고려한 신규 버전 런칭을 진행했습니다. 다운타임 내에 DB를 완전히 이전해야 했고 이 작업은 실수로 인한 데이터의 오염을 최대한 방지해야 했습니다.

settings.py, DB router 설정

pyenv. 혹은 anaconda 환경에 대한 설명은 생략하겠습니다.(공식링크 참조) 다음 명령어를 입력해서 django 설치 및 project를 생성합니다. (개인적으로 config 라는 이름의 project 생성을 선호해서 해당 이름으로 생성하겠습니다.)

# pip install django# django-admin startproject config

Inspectdb (레거시 DB의 모델화)

# python manage.py inspectdb > legacy/models.py --database=old_db
이렇게 명령어 한번으로 legacy DB table의 model class 지정이 가능합니다.

기본적인 script import setting

django는 기본적으로 web framework 입니다. template engine web을 구축하거나 api server를 구축하기도 하는데 기본적으로 웹사이트를 구동하기 위해 개발된 오픈소스입니다.

script 파일 경로

migration script 예시

이제 아주 간단한 스크립트를 작성하고 실행해보겠습니다. 가장 데이터가 적은 편인 카테고리를 예를 들어 작성해보겠습니다.

# python legacy/scripts/migrate_category.py
기존 legacy DB의 카테고리 데이터
migration 후 신규 DB의 카테고리 데이터

image migration

레거시 서비스가 AWS S3를 사용중이고 S3 버킷을 변경할 예정이 없다면 이미지 마이그레이션의 필요성이 없지만, 핏펫의 V3 서비스는 새로운 S3 버킷을 준비하기도 했고 무엇보다 커머스 솔루션의 기존 업로드 된 이미지들을 가져와야 했기에 이미지 마이그레이션이 필수였습니다.

ORM query 최적화

  1. bulk 활용

번외 — limit, offset의 함정

핏펫 레거시 DB의 쿠폰 테이블은 약 7천만 개의 row가 있었습니다. 상당히 많은 데이터의 테이블을 조회해야 하는 경우였는데 이 때 겪었던 이슈를 공유하겠습니다.

offset 0, limit 500의 쿼리 속도
offset 50000000, limit 500의 쿼리 속도
No Offset 쿼리 속도

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store