원문 캡처 · stackgres.io
원문 캡처 · stackgres.io

StackGres는 오픈소스 Citus에 쿼리 라우터를 추가해 초당 약 1,003만 건을 처리했으며, 같은 처리량을 낸 PlanetScale의 Neki보다 데이터 노드를 52% 적게 사용했다고 밝혔다. 다만 두 벤치마크의 저장장치와 측정 조건은 완전히 같지 않으며, 재현에 필요한 전체 코드는 후속 글에서 공개할 예정이다.

StackGres 창업자 겸 CEO 알바로 에르난데스(Álvaro Hernández)는 Citus의 단일 코디네이터가 처리량 확장에 제약이 되던 문제를 해결하기 위해 StackGres 1.19에 여러 Query Router를 추가했다고 설명했다. Query Router는 Citus 코디네이터처럼 쿼리를 전달하면서 여러 개로 확장할 수 있다. StackGres 측은 워커 3개 구성에서 라우터를 하나에서 세 개로 늘리자 초당 처리량이 55만 건에서 140만 건으로 증가했다고 밝혔다.

벤치마크는 EKS에서 StackGres의 오픈소스 Citus를 사용해 진행했다. 워크로드는 단일 행 기본 키 읽기였고 쓰기와 샤드 간 쿼리는 없었다. 각 워커에는 2.43TB의 데이터를 두고 복제본 없이 프라이머리만 사용했다. 소프트웨어는 PostgreSQL 18.4, Citus 14.1.0, StackGres 1.19.3 등이었으며 하드웨어는 Graviton4 기반이었다.

워커라우터초당 처리량확장성효율성p50 지연시간
361,430,3831.00×100.0%1.30ms
6122,799,4761.96×97.9%1.24ms
12245,335,4223.73×93.3%1.08ms
244810,032,0847.01×87.7%1.06ms

StackGres 측이 공개한 비교에서 Citus는 약 100만 처리량 구간에서 데이터 노드 3개로 Neki의 5개보다 적었고, 약 1,000만 구간에서는 24개로 Neki의 50개보다 적었다. 1,000만 구간의 총 데이터베이스 vCPU는 Citus가 3,072개, Neki가 4,736개로 집계됐다. 이 비교에서 Neki의 라우터는 공개된 인스턴스 정보를 바탕으로 32 vCPU라고 가정했으며, Citus 코디네이터 4 vCPU는 합계에서 제외했다.

비용 비교도 StackGres가 추산한 수치다. PlanetScale은 Neki 샤드를 프라이머리와 복제본 두 개가 포함된 고가용성 구성으로 판매하며, 비교를 위해 StackGres는 프라이머리만 사용하는 동등 구성도 계산했다. StackGres의 추산에 따르면 월 1,000만 처리량 기준 Citus의 Savings Plan 비용은 81,449달러였다. Neki는 판매 구성 기준 946,660달러, 프라이머리만 쓰는 동등 구성 기준 371,660달러였다. 따라서 Citus가 각각 약 11.6배, 4.6배 저렴하다는 계산이다. 가격에는 StackGres가 EC2 인스턴스 비용만 반영했으며, Neki 비용은 PlanetScale 가격표를 바탕으로 추정했다고 밝혔다.

비교에는 한계가 있다. Neki는 네트워크 저장장치를, Citus는 로컬 NVMe를 사용해 저장장치 차이가 특히 꼬리 지연시간에 유리하게 작용할 수 있다고 StackGres는 인정했다. 두 시스템의 지연시간 측정 지점과 캐시 적중률 정의도 달라 직접 비교하기 어렵다. Neki는 118.5M을 16분간 유지했고, Citus는 15분 예열 뒤 각 구간을 300초 측정했다. 또한 1,000만 구간에서 Citus의 전체 데이터는 58TB로 Neki의 134TB보다 작았으며, StackGres는 노드당 데이터 양을 기준으로 비교하는 편이 공정하다고 설명했다.

StackGres는 모든 유효한 측정 구간에서 실패한 트랜잭션과 중단된 클라이언트가 0건이었다고 밝혔다. 다만 Neki와 벤치마크가 동일하다고 주장하지는 않았으며, 재현 코드와 세부 방법은 후속 글에서 공개할 계획이다. 공개된 참고 자료는 PlanetScale의 Neki 벤치마크, Citus Query Router 소개, StackGres 1.19.3 릴리스, PlanetScale 가격표다.

부록: 원문 예시

text
hot.sql      @80   SELECT abalance FROM pgbench_accounts WHERE aid = :aid   -- aid in the top hot_pct=5% of the keyspace uniform.sql  @10   SELECT abalance FROM pgbench_accounts WHERE aid = :aid   -- aid uniform over all rows  tellers.sql  @5    SELECT tbalance FROM pgbench_tellers  WHERE tid = :tid   -- reference table  branches.sql @5    SELECT bbalance FROM pgbench_branches WHERE bid = :bid   -- reference table pgbench -n -M prepared -c 400 -j 16 \         -D naccounts=<count(*)> -D hot_pct=5 --log --sampling-rate=0.01