Infra/Kafka, MQTT

[Kafka] Kafka Producer 압축 방법을 어떤 걸 써야할까? (gzip, snappy, lz4, zstd 성능 비교 테스트)

Nellie Kim 2024. 11. 7. 15:54
728x90

 

Kafka를 사용할 경우, Producer에서 데이터를 전송할 때 압축률(compression.type)을 지정할 수가 있는데, 자주 쓰는 4가지 압축 방법을 비교하여 포스팅을 해보려고 한다. (매번 헷갈린다..)

 

자주 쓰는 압축 방법은 gzip, snappy, lz4, zstd 4가지 정도가 있는데, 이 4가지를 테스트해보았다. 

파티션이 1개인 Kafka Topic에 건당 10KB 데이터를 전송하여, 압축률 /속도 /CPU 사용량을 비교해보았다. 

 

※ 테스트 카프카 구성 스펙

- 버전 : 3.8.1

- 브로커 : 3개

- 파티션: 1개 

- 카프카 프로듀서 : 자바 API (postman으로 호출)

- 사용한 모니터링 도구 : Kafka UI 

 

 

1. gzip

1) 100건 전송 (1MB)

Kafka UI에서 좌측 Topic을 클릭하면 Topic 목록이 보이는데 이 부분에서 압축 후의 데이터 크기를 확인할 수 있다.

우측에 7KB 라고 적힌 부분이 압축 후의 데이터 크기이다. 압축률 0.007 이다. 

 


2) 1,000건 전송 (10MB)

압축률 0.005 이다. 

 

 

3) 10,000건 전송 (100MB)

설명 없이 쭉 나열하도록 하겠다. (아래 표 참고)

 

4) 100,000건 전송 (1GB)

 

 

5) 1,000,000건 전송 (10GB)

 

원 데이터 사이즈는 Topic > Statistics에서 Value size - Total size를 보고 확인할 수 있다. 

 

 

 

 

2. snappy

1) 100건 전송 (1MB)

 

2) 1,000건 전송 (10MB)

 

 

3) 10,000건 전송 (100MB)

 

4) 100,000건 전송 (1GB)

 

5) 1,000,000건 전송 (10GB)

 

 

 

 

 

3. lz4

1) 100건 전송 (1MB)

 

2) 1,000건 전송 (10MB)

 

3) 10,000건 전송 (100MB)

 

4) 100,000건 전송 (1GB)

 

5) 1,000,000건 전송 (10GB)

 

 

 

 

4. zstd

1) 100건 전송 (1MB)

 

 

2) 1,000건 전송 (10MB)

 

 

3) 10,000건 전송 (100MB)

 

4) 100,000건 전송 (1GB)

 

5) 1,000,000건 전송 (10GB)

 

 

 

정리

 

압축률 성능은 zstd > gzip > lz4 > snappy 순으로 높았다.  

속도는 zstd > lz4 > gzip > snappy 순으로 빨랐다. (100만건 전송 시)

 

zstd는 매우 높은 압축 성능을 자랑하지만 CPU 사용량이 높아 대용량 데이터 저장, 장기 보관용 데이터, 네트워크 대역폭 절감이 필요할 때 유용하지만, 실시간 시스템에서는 속도 저하가 발생할 수 있다고 한다. 

 

gzip도 zstd 못지 않은 높은 압축 성능으로 데이터 저장 공간을 줄이는 데 매우 효과적이지만, 속도가 느린 단점이 있어 중요한 실시간 처리 환경에는 부적합하다. 

 

lz4는 매우 빠른 압축/해제 속도와 낮은 CPU, 메모리 사용량 덕분에 실시간성이 중요한 시스템에 적합하여, Kafka, Redis, Spark 등에서 LZ4가 권장 압축 방식으로 많이 사용된다. 현재 필자의 회사에서도 lz4를 사용하고 있다. 

 

 

결론

특별한 경우가 아니라면 제일 무난한 lz4를 쓰자.