클릭하우스 매니지드 포스트그레스(ClickHouse Managed Postgres)가 데이터베이스 연결 풀링 도구인 PgBouncer의 고질적인 단일 스레드(single-threaded) 성능 한계를 극복하고 처리량을 약 4배 확장하는 데 성공했습니다. 기존 PgBouncer는 아무리 CPU 코어가 많은 서버에서도 단 하나의 코어만 사용해 전체 시스템의 병목 현상을 유발했지만, 클릭하우스는 다중 프로세스 플릿(fleet)과 지능적인 연결 분산, 그리고 프로세스 간 통신을 통해 이 문제를 해결했습니다.
클릭하우스는 PgBouncer의 단일 스레드 특성으로 인해 CPU 코어 하나가 병목이 되는 문제를 해결하기 위해, 서버의 사용 가능한 CPU 코어 수에 비례하여 여러 개의 PgBouncer 프로세스를 실행하는 '프로세스 플릿'을 기본 구성으로 채택했습니다. 이 모든 프로세스는 'so_reuseport' 옵션을 활성화하여 동일한 포트에 바인딩되며, 리눅스 커널이 들어오는 클라이언트 연결을 각 프로세스에 자동으로 분산합니다. 덕분에 클라이언트는 단일 엔드포인트(endpoint)에 연결하는 것처럼 느끼지만, 내부적으로는 여러 PgBouncer 프로세스가 병렬로 작동하여 효율성을 극대화합니다. 또한, 포스트그레스(Postgres)의 쿼리 취소 요청이 잘못된 PgBouncer 프로세스에 전달될 수 있는 문제를 해결하기 위해 '프로세스 피어링' 기능을 구현했습니다. 이는 PgBouncer 프로세스들이 서로 통신하여 취소 요청을 실제 세션 소유자에게 전달함으로써, 어떤 프로세스가 요청을 받더라도 플릿 전체에서 쿼리 취소가 정상적으로 작동하도록 보장합니다. 16-vCPU 서버 벤치마크 결과, 단일 PgBouncer 프로세스가 약 87,000 TPS(초당 트랜잭션 수)에서 정점을 찍은 반면, 16개 프로세스 플릿은 약 336,000 TPS까지 올라 4배 가까운 처리량 향상을 기록했습니다.
이러한 PgBouncer 확장 전략은 고성능 데이터베이스 시스템을 구축하려는 기업들에게 중요한 의미를 가집니다. 특히 대규모 트래픽을 처리해야 하는 서비스 환경에서 데이터베이스 연결 풀러가 병목이 되는 상황을 효과적으로 방지할 수 있습니다. 클릭하우스의 접근 방식은 기존 PgBouncer의 장점은 유지하면서도, 단일 스레드 아키텍처의 한계를 극복하는 실용적인 해결책을 제시합니다. 이는 데이터베이스 관리(DBA) 및 백엔드 개발자들이 시스템 성능 최적화를 고려할 때 PgBouncer를 더욱 적극적으로 활용할 수 있는 기반을 마련해 줄 것입니다. 또한, 이 기술은 마이크로서비스(microservices) 아키텍처나 컨테이너 환경(예: Kubernetes)에서 데이터베이스 연결을 효율적으로 관리하는 데도 유용하게 적용될 수 있습니다.