MySQL로 전환, Shopify 재고 예약 시스템의 놀라운 확장성!

by DD
1주 전
조회수 10

Shopify는 재고 예약 시스템(Inventory Reservation System)의 성능 향상을 위해 기존 Redis 기반 아키텍처를 MySQL 기반 아키텍처(MySQL-based Architecture)로 전환

MySQL 8의 SKIP LOCKED 기능을 활용하여 동시성 문제를 해결하고, ACID 트랜잭션(ACID Transactions)을 보장하여 데이터 일관성을 확보

데이터베이스 연결(Database Connection) 관리의 중요성을 강조하며, 병목 현상의 원인을 정확히 파악하는 것이 중요함을 역설

커뮤니티에서는 기술 선택보다 아키텍처 설계(Architecture Design)의 중요성을 강조하며, MySQL의 성능에 대한 긍정적 평가가 주를 이룸

MySQL SKIP LOCKED를 활용한 동시성 제어

Shopify는 MySQL 8의 SKIP LOCKED 기능을 활용하여 재고 예약 시스템의 동시성 문제를 해결했다. SKIP LOCKED는 다른 트랜잭션에 의해 잠긴 행을 건너뛰고 사용 가능한 행을 반환하여, 여러 사용자가 동시에 동일한 재고를 예약하려는 경우에도 경합(Contention)을 최소화한다. 특히, 재고 단위당 하나의 행(One Row Per Unit)을 할당하는 설계를 통해, 예약 및 갱신 연산을 효율적으로 처리할 수 있도록 했다.

데이터베이스 연결 관리 및 병목 현상 분석

Shopify는 데이터베이스 연결(Database Connection)의 중요성을 강조하며, 병목 현상의 원인을 정확히 파악하는 것이 중요하다고 밝혔다. 애플리케이션 레이어(Application Layer)에서 각 SQL 문에 주석을 추가하여 비즈니스 프로세스를 식별하고, ProxySQL 레이어(ProxySQL Layer)에서 각 호출자가 연결을 유지하는 시간을 측정하는 방식으로 연결 사용량을 분석했다. 그 결과, 예약 시스템 자체가 아닌 다른 프로세스에서 과도한 연결 사용(Excessive Connection Usage)이 병목 현상의 원인임을 밝혀냈다.

MySQL 설정 최적화 및 트랜잭션 격리 수준 조정

Shopify는 MySQL 설정을 최적화하고, 트랜잭션 격리 수준(Transaction Isolation Level)을 조정하여 성능을 향상시켰다. 특히, READ COMMITTED 격리 수준(READ COMMITTED Isolation Level)을 사용하여 갭 락(Gap Lock)을 방지하고, InnoDB 스레드 동시성(InnoDB Thread Concurrency)을 증가시켜 CPU 사용률을 개선했다. 이러한 설정 변경을 통해, 시스템은 피크 트래픽(Peak Traffic)에서도 안정적인 성능을 유지할 수 있었다.

아키텍처 설계의 중요성: Redis vs MySQL

커뮤니티에서는 기술 선택보다 아키텍처 설계(Architecture Design)의 중요성을 강조하며, MySQL의 성능에 대한 긍정적 평가가 주를 이룬다. Redis와 MySQL의 기술적 차이보다는, 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 데이터 일관성을 확보하고, ACID 트랜잭션(ACID Transactions)을 보장하는 것이 핵심이라고 지적한다. 또한, MySQL의 SKIP LOCKED 기능인덱싱(Indexing) 전략을 통해 성능을 극대화한 점을 높이 평가한다.

We replaced Redis with MySQL for inventory reservations — and it scaled