들어가며
안녕하세요. LINE Plus에서 Global E-Commerce Platform 개발을 맡고 있는 장효택입니다.
LINE Brand Catalog와 통합 커머스 검색 서비스(이하 통합 커머스 검색으로 통칭)에는 다양한 위치에 수많은 이미지가 사용되고 있습니다. 가장 흔하게 접할 수 있는 상품, 카탈로그 이미지부터 브랜드와 카테고리 영역 등에서도 이미지가 사용됩니다.
통합 커머스 검색에서는 외부 상점의 상품 이미지를 OBS라는 사내 미디어 플랫폼에 저장해서 사용자에게 보여줍니다. 이 과정에서 불필요한 이미지 중복 저장 방지와 성인 이미지 검출, 이미지 사용처 확인 등 다양한 기능을 최적화해 사용하기 위해 이미지의 고유 ID와 크기, 색상 정보, 성인 이미지 점수 등 여러 정보를 MySQL에 저장해 관리하고 있습니다.
현재 통합 커머스 검색에 존재하는 상품 수는 10억 개를 상회하고 각 상품은 여러 장의 이미지를 사용할 수 있기 때문에 결과적으로 26억 개가 넘는 이미지가 저장 및 관리되고 있는데요. 통합 커머스 검색 서비스의 규모가 계속 커지면서 DB 마이그레이션을 진행할 수밖에 없었습니다.
저희 팀은 DB 마이그레이션을 진행하면서 독특하게 Kafka 생태계와 ETL 데이터를 적극 활용하는 방법을 사용해서 MySQL에서 MongoDB로의 마이그레이션을 성공적으로 완료할 수 있었습니다. 이번 글에서는 마이그레이션을 결정한 순간부터 마이그레이션 성공 후 MongoDB로 운영하는 현재에 이르기까지의 경험을 공유하겠습니다.
마이그레이션이 필요하다는 신호
통합 커머스 검색에 새로운 상점이 입점하고 등록되는 상품이 계속 증가하면서 자연스레 저장하고 관리하는 이미지가 더욱 많아졌습니다. 새로 추가되는 이미지의 개수를 살펴보면 한 달에 적게는 4,000만 건에서 많게는 2억 건이 넘는 이미지가 새로 추가되고 있습니다.
신규 이미지가 증가하면서 이미지의 정보를 저장하는 테이블(이하 이미지 테이블)과 이미지 사용처의 정보를 저장하는 테이블(이하 참조 테이블)이 빠르게 커졌습니다.
이와 같이 두 테이블의 크기가 빠르게 증가하면서 다음 두 가지 문제에 대한 우려가 커졌습니다.
MySQL 디스크가 가득찰 것으로 예상
MySQL에서는 이미지 관련 테이블뿐 아니라 통합 커머스 검색 서비스 운영에 필요한 다른 여러 테이블도 함께 존재하는데요. 이미지 관련 테이블이 빠르게 커지면서 MySQL의 디스크 사용량이 90%를 초과했고, 그중 이미지 관련 테이블의 비율이 70%을 초과했습니다. 한 달에 약 1%씩 크기가 증가하고 있었고, 이 추세라면 일 년 내에 이미지 테이블은 물론 다른 테이블에도 영향을 미칠 수 있는 상황이었습니다. 타 테이블들은 서로 연관성이 깊고, 안정성을 확보하기 위한 트랜잭션 작업과 스키마 정의가 필수라서 마이그레이션하기가 어려웠습니다.

데이터가 너무 많아 스키마 변경 어려움
서비스를 운영하다 보면 필드를 변경하거나 새로 추가해야 하는 일이 발생하는데요. 이미지 테이블의 경우 데이터가 워낙 많다 보니 스키마를 변경하면 시스템이 느려지거나 멈추는 현상(hang up)이 발생해 쉽게 변경할 수 없었습니다.
MongoDB를 선택한 이유
앞으로 수억 건의 대규모 이미지 유입이 예정돼 있었기에 그전에 안정적인 DB를 구축하는 것이 중요한 상황이었습니다. 다양한 선택지가 있었는데요. 그중에서 MongoDB는 아래와 같은 장점이 있었습니다.
- 샤딩(sharding)을 이용한 확장이 자유로워 신규 이미지가 대규모로 유입돼도 쉽게 대응할 수 있다.
- 서비스를 최적화하기 위해 이미지 정보를 추가하는 일이 발생하는데 스키마리스(schemaless) 특성이 있어서 스키마 변경에 부담이 없다.
이미 최대 성능을 사용하고 있어서 더 이상 스케일 업을 할 수 없는 MySQL을 대체하기에는 MongoDB가 가장 적합하다고 판단했고, MongoDB로 마이그레이션하기로 결정했습니다.
마이그레이션 개요
마이그레이션의 긴 여정을 떠나기 전에 아래 그림과 함께 전체 흐름을 살펴보겠습니다. 초록색 박스는 MySQL의 데이터를 MongoDB로 옮기고, 실시간으로 동기화된 상태 만드는 작업들을 의미합니다. 주황색 박스는 MySQL을 사용하는 Image service의 DB를 MongoDB로 전환하는 작업들을 의미합니다.
마이그레이션 과정을 한 번에 이해하지 못하셔도 괜찮습니다. 마이그레이션에서 사용했던 모듈을 순서대로 살펴볼 예정이며, 길을 잃지 않도록 중간중간 어느 모듈을 설명하는지 함께 표기할 테니 마이그레이션 여정의 끝까지 함께 하시길 기원해 봅니다. 그러면 본격적으로 마이그레이션 여정을 떠나보겠습니다.