🚨 비상!!

부하테스트를 하던 도중 데이터베이스 서버에서 다음과 같은 심각한 리소스 상태가 확인되었다.

분명히 데이터베이스에 엄청난 문제가 발생했음은 누구나 알 수 있을 것이다. 그렇다면 우리는 어떤 대응을 해야할까? (사실 아래 상황은 Clickhouse보다 MySQL이 문제였지만…)

데이터베이스 서버 CPU 리소스(가장 높은 부하발생 구간)

데이터베이스 서버 CPU 리소스(가장 높은 부하발생 구간)

🔍 분석

가장 먼저 의심했던 부분은 HTTP 요청을 로깅하는 과정이었다. 현재 구현된 방식은

  1. HTTP 요청에 대한 응답 수신
  2. HTTP 응답 로깅 객체 생성
  3. 로깅 객체 Clickhouse에 삽입

으로 매 요청마다 Clickhouse에 삽입이 발생했다. 즉, 초당 1000번 요청이 발생하면 초당 1000번 Clickhouse 데이터베이스 삽입이 발생하게 된다. Clickhouse의 삽입 성능이 압도적으로 빠르다고 하더라도 1000번의 네트워크 오버헤드가 발생한다.

<aside> <img src="/icons/exclamation-mark_yellow.svg" alt="/icons/exclamation-mark_yellow.svg" width="40px" />

추가로 Clickhouse 공식문서에서는 1개의 row 삽입을 추천하지 않는다. Clickhouse는 OLAP으로 방대한 데이터를 처리하기 위한 데이터베이스이기 때문에 기본적으로 batch방식을 추천한다. 심지어, 100개~1000개 수준이 아닌 1만개~10만개 수준의 batch를 추천한다… (네?)

https://clickhouse.com/docs/en/cloud/bestpractices/bulk-inserts - Clickhouse의 공식문서 왈

</aside>

최적화 과정

최적화는 크게 두 가지 방식으로 이루어졌다.

1️⃣ Clickhouse Async Insert (비동기 삽입 설정)

클릭하우스는 Async Insert 설정을 키게 되면 내부적으로 버퍼를 생성한다. 데이터 삽입이 발생하면 버퍼에 저장하고 비동기적으로 해당 버퍼를 비우고 디스크에 저장한다.

비동기 삽입은 데이터베이스의 디스크 쓰기 작업을 줄임으로써 쓰기 성능을 높일 수 있다.

자세한 내용)