PlanetScale, 샤딩 Postgres 'Neki'로 초당 1억 1,800만 쿼리 벤치마크 공개

Hacker News29일 전조회 5

PlanetScale이 샤딩된 Postgres 서비스 'Neki'를 플랫폼 프리뷰로 선보이면서, 자사 인프라가 어디까지 버티는지 확인하는 대규모 벤치마크 결과를 함께 공개했다. 핵심 숫자는 512개 샤드에서 초당 1억 1,853만 건(118,538,803 QPS)의 읽기 쿼리를 16분 동안 처리했다는 것이다. 데이터 규모는 1.22 PiB였고, 측정 구간 최고치는 118,747,267 QPS까지 올라갔다.

테스트 조건은 단순하다. 프라이머리 키로 행 하나를 가져오는 단일 샤드 포인트 조회만 사용했고, 쓰기나 조인, 샤드를 가로지르는 쿼리는 섞지 않았다. 각 샤드가 받는 부하는 서로 독립적이어서 여러 샤드를 동시에 건드리는 질의가 존재하지 않는다.

확장은 샤드당 20만 QPS를 유지한다는 목표 아래 클러스터를 키우는 방식으로 진행됐다. 샤드를 5개에서 50개로, 다시 512개로 늘렸는데 5개에서 50개 구간에서는 샤드당 처리량 편차가 0.8% 안쪽에 머물렀다. 512개 구간에서는 샤드에 여유가 남아 부하 생성기가 더 밀어붙였고, 그 결과 샤드당 23만 1천 QPS까지 올라갔다.

구성은 샤드마다 Postgres 프라이머리 한 대씩을 r8g.16xlarge에 올리고, 480대의 Neki 라우터를 각각 8xlarge 인스턴스에 배치하는 형태였다. 라우터 기준 p99 지연은 6.06ms, 클라이언트 기준은 13.95ms로 기록됐다. 초당 오류는 67건으로 약 180만 쿼리에 한 건꼴이며, 전체 플릿에서 1,580만 읽기 IOPS와 초당 2Tb를 넘는 네트워크 트래픽이 발생했다.

PlanetScale은 MySQL 기반 샤딩으로 이름을 알린 회사인데, Neki는 Postgres를 샤딩해 수평 확장하는 쪽을 겨냥한 제품이다. 단일 Postgres 인스턴스는 수직 확장 한계와 커넥션 병목에 부딪히기 쉬우며, 샤딩은 그 벽을 넘는 대표적인 선택지다. 다만 샤딩은 라우팅, 리밸런싱, 샤드를 넘나드는 트랜잭션 같은 문제를 함께 데려오기 때문에 이런 대규모 수치가 실제 운영 환경에서도 유지되는지가 관건이 된다.

실무에서 눈여겨볼 지점은 샤드 수를 열 배씩 늘려도 샤드당 처리량이 거의 그대로 유지됐다는 부분이다. 샤딩 계층이 병목이 되지 않는다면 용량 계획을 '샤드 추가'로 단순화할 수 있다는 뜻이 된다. 반대로 자신의 서비스에 조인이나 쓰기, 크로스 샤드 쿼리가 얼마나 섞여 있는지부터 따져야 한다. 이번 수치는 그런 요소를 전부 배제한 상태에서 나온 것이기 때문이다.

원문이 명시한 전제도 분명하다. 측정 구간 동안 샤드는 프라이머리만으로 구성돼 복제본이 없었고, 부하도 읽기 전용이었으며, 페일오버는 발생하지 않았다. 즉 이 숫자는 장애 상황이나 고가용성 구성에서의 성능이 아니라 정상 상태에서의 읽기 처리량 상한에 가깝다. PlanetScale은 1억 QPS에 이르기까지의 엔지니어링 과정과 그 과정에서 마주친 문제들을 후속 글에서 다룰 예정이다.