LY Corporation Tech Blog

LY Corporation과 LY Corporation Group(LINE Plus, LINE Taiwan and LINE Vietnam)의 기술과 개발 문화를 알립니다.

일 평균 30억 건을 처리하는 결제 시스템의 DB를 Vitess로 교체하기 - 1. 솔루션 선정기

들어가며

안녕하세요. LINE Billing Platform 개발 팀의 김영재, 이정재입니다. LINE Billing Platform 개발 팀에서는 LINE 앱 내 여러 서비스에서 사용하는 결제 및 포인트 플랫폼을 이용한 결제 기능을 제공하고 있습니다. 

저희 팀에서는 최근 가장 핵심 시스템이자 오랫동안 운영해 온 결제 시스템의 DB를 Nbase-T에서 Vitess로 마이그레이션했습니다. 마이그레이션하게 된 가장 큰 이유는 기존에는 비용이 들지 않았지만 최근 계약 관계에 변화가 발생해 라이선스 비용이 추가되는 상황이 되었기 때문입니다.

저희는 마이그레이션할 솔루션 선정 과정과 마이그레이션 후 실제 개발 및 운영 단계에서 Vitess를 어떻게 활용하고 있는지 두 편으로 나눠 소개하려고 합니다. 먼저 이번 글에서는 마이그레이션할 솔루션으로 Vitess를 선정한 과정과 이유를 말씀드리겠습니다.

PoC 후보 선정

마이그레이션 대상이 결제 코어 시스템이었기 때문에 솔루션을 선정할 때 성능 대비 운용 비용이 낮은 기준으로 어떤 솔루션이 있는지 조사했습니다. 그중 PoC까지 진행해 비교 분석했던 샤딩(sharding) 솔루션인 Apache ShardingSphere와 TiDB, Vitess의 특징을 소개하고, 진행 과정에서 발생한 이슈 및 이슈 해결 방법을 공유하겠습니다.

Apache ShardingSphere

Apache ShardingSphere의 경우 프락시와 JDBC 방식을 모두 지원하며, 각 방식의 특징은 다음과 같습니다.

카테고리프락시 레이어JDBC 레이어
아키텍처프락시 레이어 아키텍처JDBC 레이어 아키텍처
고가용성(high availability)
  • 프락시 서버 이중화 필수
  • 보통 애플리케이션 서버는 여러 대로 구성해 로드 밸런서로 처리하기 때문에 별도 이중화 필요 없음
오퍼레이션
  • 애플리케이션 레이어에서 DB 관련 코드의 인터페이스를 일관적으로 만들 수 있도록 프락시 레이어가 DB 쿼리 수행 역할을 대행함
  • 예를 들어 모든 노드에 대한 일괄 DDL 및 CRUD 쿼리 작업이 필요할 때 프락시 레이어가 담당해 제어 가능
  • 애플리케이션 레이어에서 모든 노드에 대해 일괄적으로 쿼리 질의를 수행하려면 추가 개발 필요
리밸런싱
  • 프락시 서버가 샤드키를 이용해 대상 노드 선정 작업을 제어하기 때문에 샤드키별로 락(lock) 처리가 가능하며, 이에 따라 리밸런싱 기능 구현 및 처리가 용이함
  • 애플리케이션에서 리밸런싱 기능을 구현해야 하며, 모든 컴포넌트(API, 배치, 어드민 등)별로 구현 추가 개발 비용 발생

Apache ShardingSphere은 프락시와 JDBC 방식을 모두 지원하기 때문에 서비스 상황에 맞게 유연하게 애플리케이션을 구성할 수 있는 샤딩 솔루션입니다. 다양한 샤딩 전략을 제공하며, 분산 트랜잭션도 지원하는 등 여러 기본적인 기능에 충실합니다. 

다만 프락시 레이어 방식은 SQL 통합 처리 정도의 매우 단순한 기능만 처리할 수 있다는 한계가 있습니다. JDBC 레이어 방식 또한 여러 컴포넌트에서 사용할 경우 개별 구현 포인트가 많아지고 관리 비용도 무시할 수 없다는 단점이 있습니다. 특히, 두 방식 모두 데이터가 각 샤드에 고르게 분배될 경우 데이터 리샤딩(리밸런싱)을 직접 구현해야 한다는 단점이 있습니다. 이러한 추가적인 개발 비용을 제외한다면 괜찮은 샤딩 솔루션이지만, 저희가 구현해야 할 추가적인 개발 포인트가 많아 PoC 대상에서는 제외되었습니다.

TiDB

TiDB의 경우 사내 MySQL DB 팀의 추천으로 알게 됐으며, 사내 VOOM 팀의 ESPA 조직에서 사용한 선례가 있어 PoC 진행시 MySQL DB 팀과 VOOM 팀의 많은 도움을 받았습니다.

TiDB는 MySQL 호환 분산형 SQL 데이터베이스입니다. 대규모 데이터 처리와 고가용성, 확장성을 목표로 OLTP(Online Transactional Processing) 및 OLAP(Online Analytical Processing) 워크로드 모두에 적합하도록 설계돼 있습니다. 기존 샤딩 솔루션과는 메커니즘이 완전히 다른데요. TiDB는 아래 그림과 같이 크게 세 개(TiDB, PD, 스토리지)로 나뉜 클러스터 영역으로 구성됩니다.

TiDB 클러스터 영역 아키텍처

각 영역에서 수행하는 역할은 다음과 같습니다.

  • 스토리지 클러스터: 스토리지 클러스터는 OLTP 워크로드를 위한 행 기반(row-based) 스토리지인 TiKV와, OLAP 워크로드를 위한 열 기반(column-based) 스토리지인 TFlash로 구성됩니다.
    • 여기서 TiKV는 분산 키-값 저장소로, TiDB의 데이터 저장 계층을 구성 데이터를 분산해 저장하고, ACID 트랜잭션을 지원합니다. 이 영역에서 실제 데이터가 분산 저장됩니다.
  • TiDB 클러스터: TiDB는 SQL 계층으로 MySQL 프로토콜을 지원하며, 사용자의 SQL 요청을 받아 이를 실행 계획으로 변환해 TiKV에 데이터를 읽고 쓰는 작업을 수행합니다.
  • PD 클러스터: PD는 클러스터의 메타 데이터 관리 및 조정 작업을 담당합니다. TiKV 클러스터의 데이터 분할 및 배치를 관리하며, 클러스터의 전체적인 균형을 유지합니다.

TiDB는 실제로 MySQL 영역인 TiDB 클러스터에 데이터를 저장하는 것이 아니라 스토리지 클러스터 내의 TiKV에 데이터를 저장합니다. 따라서 별도의 샤딩 전략이 필요하지 않고, 데이터 관리할 때 샤딩키값도 필요 없습니다. 메커니즘 자체가 전체 TiKV에 자동으로 리밸런싱되는 형태이기 때문에 부하와 데이터를 균등하게 분산할 수 있는데요. 이런 점을 고려했을 때 현재 저희 상황에서 개발과 DBA의 운용 비용을 상당히 줄일 수 있는 이점이 있다고 판단해 PoC를 진행했습니다. 

Vitess

Vitess는 대규모 MySQL 데이터베이스 클러스터를 관리하기 위한 오픈 소스 데이터베이스 클러스터링 시스템입니다. YouTube에서 MySQL 데이터베이스의 확장 문제를 해결하기 위해 개발했으며, 현재는 CNCF(Cloud Native Computing Foundation)의 프로젝트로 관리되고 있습니다(참고).

Vitess의 특징은 다음과 같습니다.

  • 확장성: 대량의 트래픽을 처리하기 위해 데이터베이스를 수평으로 확장할 수 있습니다. 이를 위해 샤딩 기술을 사용합니다.
  • 고가용성: 자동 장애 조치 및 복제를 통해 고가용성(high availability, 이하 HA)을 보장합니다.
  • 데이터베이스 추상화: 애플리케이션이 데이터베이스의 물리적 레이아웃을 알 필요 없도록 Vitess가 이를 추상화해 처리합니다.
  • 쿼리 라우팅 및 최적화: 쿼리를 적절한 샤드로 라우팅하고 최적화해 성능을 향상시킵니다.
  • 클라우드 네이티브: 컨테이너 환경에서 쉽게 배포하고 관리할 수 있도록 설계됐습니다.

Vitess는 서비스의 성격이나 상황에 따라 유연하게 선택할 수 있도록 클라우드와 베어 메탈(bare metal), 하이브리드 환경을 모두 제공합니다. 저희 서비스는 결제 시스템이라는 특성상 잠시라도 페일오버(failover)가 발생하면 회사에 손실이 발생하기 때문에 베어 메탈 방식, 즉 물리적인 서버에 직접 설치하는 방식을 선택했습니다. Vitess 베어 메탈 환경은 GitHub이나 Slack 등의 서비스에서도 사용하고 있는데요. 이와 같은 유수의 기업들이 사용하고 있다는 것도 큰 장점으로 작용했습니다.

Vitess 구성도

Vitess는 필요에 따라 매우 다양한 방식으로 구성할 수 있고, 컴포넌트별로 설정할 수 있는 옵션값도 상당히 다양합니다. 실제로 저희 팀에서도 다양한 옵션값을 테스트하는 데 많은 리소스를 사용했는데요. 다양한 기능을 제공해 주는 만큼 각 옵션의 기능과 내부 구조를 이해하는 게 중요한 솔루션입니다.

다음은 Vitess를 구성하는 컴포넌트와 각 컴포넌트의 관계를 간략히 표현한 그림입니다. 

Vitess 컴포넌트 아키텍처

각 컴포넌트의 역할과 특징은 다음과 같습니다. 

컴포넌트설명
VTGate
  • 클라이언트와 Vitess 클러스터 간의 게이트웨이 역할을 담당하며, 클라이언트의 쿼리를 적절한 VTTablet으로 라우팅하고 데이터베이스 샤딩 및 분산 트랜잭션을 처리합니다.
  • 클라이언트 측에서 마치 단일 데이터베이스처럼 보이도록 만들기 때문에 애플리케이션 측에서는 데이터베이스의 물리적 토폴로지를 신경 쓸 필요가 없습니다.
  • 여러 개를 배치해 HA 구성을 할 수 있습니다.
  • 조회와 입력을 구별해 프라이머리와 레플리카로 나눌 수 있는 기능을 지원합니다.
  • 모든 DB 노드에 일괄적으로 쿼리 질의 및 DDL을 수행할 수 있습니다.
VTTablet
  • VTTablet은 MySQL 인스턴스 앞에 위치해 MySQL과의 직접적인 인터페이스를 담당하며 데이터베이스 요청을 처리하는 컴포넌트입니다.
  • 각 MySQL 샤드에 대해 하나 이상의 VTTablet이 존재하며, 쿼리 실행 및 데이터 복제, 장애 조치 등을 관리합니다.
  • Vitess에서는 VTTablet을 MySQL과 함께 1:1 묶음으로 하나의 인스턴스에서 관리하는 것을 권장하고 있습니다.
VTAdmin
  • Vitess 클러스터 관리 및 모니터링을 위한 웹 기반 UI를 제공합니다.
  • 관리자는 클러스터의 상태를 시각적으로 확인하며 다양한 관리 작업을 수행할 수 있습니다.
VTctld
  • Vitess 클러스터 제어 및 관리 작업 수행에 사용하는 서비스입니다.
  • 관리자는 CLI(command line interface)를 통해 클러스터 구성과 샤드 관리, 데이터베이스 백업 및 복구 등의 작업을 수행할 수 있습니다.
VTorc
  • MySQL 인스턴스의 고가용성을 관리하기 위한 자동화 도구로, orchestrator 오픈 소스를 랩핑해 장애 자동 복구 역할을 담당합니다.
  • MySQL 복제 토폴로지를 모니터링하고, 장애 발생 시 자동으로 장애 조치를 수행해 고가용성을 보장합니다.
토폴로지 서버
  • Vitess의 각 컴포넌트가 클러스터 구성 정보를 공유하고 동기화하는 데 필요한 메타데이터(클러스터 구성, 샤드 및 테이블, 노드 상태 정보 등)를 저장하고 관리하는 중앙 저장소 역할을 담당합니다.
  • Apache ZooKeeperetcd, Consul과 같은 분산 키-값 저장소를 사용할 수 있습니다.

PoC 진행

저희는 최종 선정된 두 후보인 TiDB와 Vitess를 기존 솔루션인 Nbase-T와 성능, 비용, 가이드, 기능, 운영 측면에서 비교 분석했습니다. 비교 방법과 결과를 공유하겠습니다. 참고로 Vitess의 경우 v20.0 버전을 기반으로 테스트했습니다.

PoC 환경 설정

실제 환경과 최대한 동일한 조건에서 PoC를 수행하기 위해 장비와 테이블 양식 및 기능을 통일했습니다. 아래 표는 각 솔루션별 스펙 정보를 정리한 것입니다. 

솔루션역할사양서버 개수
Nbase-TShard DB8vCPU_16GB_100GB_SSD4대(프라이머리 2, 레플리카 2)
VitessShard DB8vCPU_16GB_100GB_SSD4대(프라이머리 2, 레플리카 2)
Non Shard DB2vCPU_4GB_100GB_SSD1대
VTGate4vCPU_18GB_100GB_SSD4대
TiDBTiDB8vCPU_16GB_100GB_SSD2대(프라이머리 2)
PD4vCPU_18GB_100GB_SSD3대
TiKV8vCPU_16GB_100GB_SSD4대
모니터링2vCPU_4GB_100GB_SSD1대
  • 샤드 DB 4대는 프라이머리/레플리카 구조로 두 세트씩 구성했습니다.
  • TiDB의 경우 TiDB MySQL DB는 실제 데이터 저장소의 역할이 아니므로 2대로, TiKV는 실제 저장소이므로 4대로 구성했습니다.
  • Vitess의 경우 샤드 DB 대 VTGate의 비율을 1:1로 권장하기 때문에 최초에는 각 4대씩 1:1 비율로 구성했습니다.

성능 측면 비교 분석

저희는 실제 결제 API를 기반으로 한 시나리오(결제와 조회를 일정 비율로 요청) 성능 테스트를 진행했습니다. 스레드 개수를 단계적으로 증가시키며 스레드 대비 요청 처리량과 리소스 처리 상태를 확인했습니다.

성능 테스트 결과 순수 성능 관점에서는 가장 적은 장비로도 높은 TPS(transactions per second)와 함께 서버 자원을 효율적으로 사용하는 모습을 보여준 Nbase-T가 가장 좋은 솔루션이었습니다.

TPS 그래프

CPU 사용량 그래프

Nbase-T와 TiDB는 CPU 사용률이 스레드 개수에 비례해 선형적으로 증가하는 일반적인 형태를 보여줬습니다. 반면 Vitess는 스레드 개수가 증가해도 CPU 사용률이 더 오르지 못하고 50% 정도에서 계속 머물렀는데요. 이에 저희는 Vitess의 어떤 특정 부분에서 CPU 사용률을 제한하고 있다고 판단하고 조금 더 살펴봤습니다.

Vitess 병목 문제 해결

먼저 Vitess의 각 구간별 스레드 옵션을 설정해 봤지만 별다른 변화가 없었습니다. 이에 Vitess 구간별 모니터링을 진행했는데요. 이를 통해 CPU 사용률을 제한하는 근복적인 병목 구간이 VTGate임을 인지했고 먼저 아래와 같이 GO GC(garbage collector) 설정을 변경해 봤습니다.

  • GOMEMLIMIT 설정 변경: Go 런타임이 메모리 사용량 기준으로 GC 트리거를 제어하면서 불필요한 GC 실행 빈도 감소 확인
  • GOGC=off 설정: GOGCoff로 설정하면 자동 GC가 비활성화되며, 이를 통해 GC 실행 빈도가 대폭 줄어들면서 쿼리 지연(latency)과 분산(variance) 감소 확인

위 조치로 어느 정도 효과를 보기는 했으나 그럼에도 DB 장비의 성능을 최대치까지 사용하지는 못했습니다. 이에 DB 장비 수준에 부합되도록 VTGate를 증설해 보기로 결정했는데요. 이때 DB 장비 대 VTgate의 적정 비율을 찾기 위해 테스트를 진행했습니다.

이 테스트를 진행할 때에는 프라이머리 샤드를 세 대로 늘려서 테스트했으며, 이에 맞춰 VTGate 역시 세 대부터 시작해 그 배수로 개수를 늘려보면서 변화를 확인했습니다. 아래는 테스트하면서 TPS와 CPU 사용률 수치 변화를 기록한 것입니다.

VTGateTPSVTGate 상태
33835

VTGate 3 CPU load graph

VTGate 3 CPU Usage graph

66420

VTGate 6 CPU load graph

VTGate 6 CPU Usage graph

98637

VTGate 9 CPU Load graph

VTGate 9 CPU Usage graph

1210354

VTGate 12 CPU load graph

VTGate 12 CPU Usage graph

1511671

VTGate 15 CPU Load graph

VTGate 15 CPU Usage graph

1812295

VTGate 18 CPU Load graph

VTGate 18 CPU Usage graph

위 표와 같이 TPS가 3배의 비율(DB 장비 3대에 VTGate 9대)까지는 큰 폭으로 상승하다가 4배 비율부터는 상승량이 조금씩 감소하기 시작했습니다. 즉, Vitess의 경우 프라이머리 샤드 개수와 VTGate 개수의 비율을 최소 1:3 정도로는 유지해야 Vitess DB의 최대 성능을 발휘할 수 있는 것입니다. 더불어 알게 된 사실은, VTGate 자체는 로직이 복잡하지 않기 때문에 고성능의 서버가 필요하지 않았습니다. 따라서 VTGate 서버의 사양을 낮추고 대신 개수를 늘리는 것이 훨씬 효과적이었습니다.

Vitess 옵션 성능 테스트: queryserver-config-transaction-cap

저희는 Vitess를 튜닝하면서 다양한 옵션을 테스트해 봤는데요. 그중에서 유의미한 결과가 도출된 queryserver-config-transaction-cap 옵션 설정 사례를 공유하겠습니다. 참고로 Vitess는 버전별로 옵션이 상이하기 때문에 각 버전에 따른 옵션의 형태를 꼭 확인하셔야 합니다.

queryserver-config-transaction-cap은 VTTablet 옵션 중 하나입니다. VTTablet은 앞서 MySQL 인스턴스 앞에 위치해 MySQL과의 직접적인 인터페이스를 담당하며 데이터베이스 요청을 처리하는 컴포넌트라고 말씀드렸는데요. queryserver-config-transaction-cap은 DB가 트랜잭션 처리를 받을 수 있는 허용치를 조절하는 옵션으로, 기본값은 20으로 설정돼 있습니다. 저희 시스템의 경우 결제 트랜잭션이 많이 발생하기에 트랜잭션 허용치를 적절히 조절할 필요가 있는데요. 아래는 스레드가 700개인 상태에서 설정값을 50 혹은 100 정도로 수치를 늘렸을 때 성능이 얼마나 개선되는지 테스트한 결과입니다. 

queryserver-config-transaction-cap 설정값TPSVTGate 상태
5011268

image

image

10015639

image

image

성능 테스트 결과

결론적으로 Vitess는 Nbase-T에 비해 단위 성능은 낮지만 상대적으로 안정적이고 일관적인 성능을 보여줬습니다. 특히 서버 자원을 효율적으로 사용했고, 트래픽 대비 응답 시간의 편차가 크지 않아 안정적이었습니다. TiDB의 경우 TiDB와 TiKV를 1:3 비율로 맞춰 장비를 추가할수록 성능이 향상됐지만 클러스터마다 장비 대수가 최소 3배 정도 더 필요했고, 기본적으로 서버 자원을 많이 사용했습니다. 즉 성능 테스트 결과, 새로운 솔루션들은 기존과 같은 성능을 내기 위해서 기존 솔루션보다 각각 일정 비율로 추가 장비가 필요하다는 것을 알 수 있었습니다. 

비용 측면 비교 분석

저희는 최초에 비용 문제 때문에 마이그레이션을 시작했습니다. 따라서 성능 테스트 결과에 따라 기존과 같은 성능을 발휘하는 수준에서의 각 솔루션의 비용도 분석할 필요가 있었습니다.

아래는 각 솔루션별로 기존 시스템과 동일한 성능을 발휘할 수 있는 수준으로 운영했을 때 매월 발생할 인프라 비용을 예시로 정리해 본 것입니다. 예시를 위해 같은 사양의 경우 서버 단가는 모두 임의의 같은 비용으로 가정했습니다(아래 비용은 실제 비용이 아닌 이해를 돕기 위한 예시입니다).

솔루션상세 분류사양인프라월별 비용월별 비용 총합
Nbase-TNbase DB
  • PM
  • 2.2Ghz, 10코어*2(20코어)
  • 16GB*8(128GB)
  • 프라이머리 25대
  • 레플리카 25대
1,000,0001,000,000
VitessVitess DB
  • PM
  • 2.2Ghz, 10코어*2(20코어)
  • 16GB*8(128GB)
  • 프라이머리 25대
  • 레플리카 25대
1,000,0001,050,000
Vitess GW
  • VM
  • 2.2Ghz, 8코어
  • 16GB
  • 25대
50,000
TiDBTiDB
  • PM
  • 2.2Ghz, 10코어*2(20코어)
  • 16GB * 8(128GB)
  • 프라이머리 50대(성능 테스트에 기반한다면 3배로 늘려야 하지만 최소 사양으로 2배 정도 규모로 산정)
1,000,0003,006,000
TiKV
  • PM
  • 2.2Ghz, 10코어*2(20코어)
  • 16GB * 8(128GB)
  • 70대
1,400,000
PD
  • PM
  • 2.2Ghz, 10코어*2(20코어)
  • 16GB * 8(128GB)
  • 5대
100,000
TiFlash
  • PM
  • 2.2Ghz, 10코어*2(20코어)
  • 16GB * 8(128GB)
  • 25대
500,000
모니터링
  • VM
  • 2.2Ghz, 8코어
  • 16GB
  • 3대
6,000

위와 같이 가정했을 때, TiDB의 경우 개발자와 DBA의 운용 비용을 줄여주는 기능과 형태였지만 기본 장비 비용이 기존보다 최소 3배 이상 필요했습니다. 결과적으로 불필요한 비용을 줄이면서 최대한 성능을 보여주는 솔루션은 Vitess였습니다. 

그 외 측면 비교 분석

솔루션을 도입하기 위한 PoC를 진행하면서 성능과 비용 측면 외에도 솔루션을 사용하면서 참고할 수 있는 가이드나 제공 기능, 운영 측면에서도 비교 분석을 진행했습니다. 각 분야별로 비교 분석 결과를 정리한 표를 공유드립니다. 

가이드 측면 비교 분석

Nbase-TApache ShardingShpereVitessTiDB
커뮤니티 지원

  • 관련 회사의 사내 개발 솔루션으로 즉각적인 문의 및 지원 가능

사용 사례
  • 네이버
  • YouTube, Slack, GitHub, 네이버 등
  • 사내 MySQL 및 VOOM 팀 등
예제 코드

기능 측면 비교 분석

Nbase-TApache ShardingShpereVitessTiDB
샤딩 전략
  • 각 행 데이터의 고유 버킷 ID를 계산(지정)해 샤딩(모듈러 샤딩)
  • VSchemaVindexes를 통해 샤딩 키를 관리해 처리(범위 기반 샤딩)
  • TiDB의 분산 메커니즘은 리전(region) 기반의 샤딩과 래프트 기반 데이터 복제를 통해 별도의 샤딩 키 관리 없이 데이터를 분산 저장 처리
분산 트랜잭셕

프락시 서버 지원

⚠️(제한적 지원)

  • 용도가 한정됨(SQL 방언(dialect) 인터페이스 및 DB 엔진 인터페이스)

  • VTGate가 프락시 서버 역할
  • 다중 인스턴스로 VTGate를 운영하고 앞단에 로드밸런서를 두는 형태로 사용하면 이중화 지원
멀티 노드 쿼리(one connection to all node)

  • VTGate가 쿼리의 WHERE 절을 분석해 Vindex 포함 여부에 따라 쿼리를 특정 샤드에 보낼지 모든 샤드에 보낼지 판단 후 처리(scatter queries)

운영 측면 비교 분석

Nbase-TApache ShardingShpereVitessTiDB
리밸런싱

  • 데이터 리밸런싱 자동화
고가용성⚠️(제한적 지원)

⚠️(제한적 지원)

  • 플랫폼 자체 지원은 없으며, DB의 고가용성 구조로 처리

  • VTorc를 통해 관리하며, 각 샤드 프라이머리가 이상 작동할 경우 자동으로 프라이머리 선출(기존 레플리카 중 하나를 프라이머리로 승격)
자동 스케일 아웃

  • 현재는 미지원이나, 쿠버네티스 환경에서의 서비스 메시 기술을 활용해, 데이터베이스 클러스터를 관리하고 조정하는 새로운 방식 개발 중

  • 미지원이지만 쿠버네티스 환경에서 운영하며 샤드 설정 및 추가를 명령어로 지원하기 때문에 스케일 아웃에 많은 공수가 필요하지 않음
관리 및 운영 도구

  • 관리자(admin) 및 CLI 기능 제공

  • 관리자(VTadmin), Prometheus, Grafana 제공(참고)

  • 관리자, Prometheus, Grafana 제공(참고)

마치며

다양한 플랫폼을 조사한 결과 기존에 사용하던 Nbase-T와 비교해 저희에게 가장 합리적인 플랫폼은 Vitess였습니다. 각 솔루션의 장단점을 간략히 요약하면 다음과 같습니다.

ShardingSphere: 개발자가 모든 것을 제어할 수 있다는 이점이 있지만 리밸런싱 기능을 비롯해 현재 저희 팀에서 사용하고 기능들을 사용하려면 추가 개발이 필요해 추가 비용이 발생한다는 단점이 있습니다.
TiDB: 개발자가 사용하기 편리하며 내부 DBA 팀의 지원까지 받을 수 있지만, 다른 플랫폼 대비 서버 비용이 약 3배 이상 든다는 단점이 있습니다.
Vitess: 성능과 비용 측면에서 가장 합리적이었고, 필요한 기능 이상을 제공하며, 많은 트래픽을 처리하고 있는 여러 회사에서 사용하고 있는 검증된 플랫폼이라는 장점이 있습니다. 다만 DBA와 개발자가 높은 학습 비용을 감내해야 한다는 단점이 있습니다.

저희 팀은 추가 학습 비용을 어느 정도 감내하기로 하고 최종적으로 Vitess를 선택했습니다. 이 글이 여러분의 상황과 서비스의 방향성에 맞춰서 샤딩 솔루션을 선정하고 도입하는 데 도움이 되기를 바라며 이만 마치겠습니다.