kafka 서비스 이해하기 - 01

Kafka 서비스는 몇 가지 영역에서 특화된 서비스이다.
정확하게 이해하고 서비스에 적용하기 위해서는 많은 이해도가 필요한 서비스다.

Kafka 개발 컨셉

일반적인 시스템에서 병목이 걸리는 부분은 디스크로 특히 쓰기 부분에서 많은 부하가 발생한다. 특히 Random Read나 Random Write에서 부하가 많이 걸리는데, Write에서 엄청난 성능저하가 발생한다.

Kakfa Doc를 보면, Kafka 개발 컨셉은 최대한 Random Access를 최대한 줄이고, Sequential Access로 디스크를 접근하도록 개발된 서비스이다.

또한 Page Cache라는 개념이 나오면서, 이를 너무나도 이용하게 적용한 솔루션이라고 생각하면된다. 최초 데이터를 Ram에 할당된 Page Cache에 빠르게 데이터를 적제하고, 이를 이용해서 Sequential Write/Read만 발생 시키는 솔루션으로 만들었다.

마지막으로 Kafka Client Library에서 Kafka로 보내는 데이터를 모아서 한꺼번에 보내는 기능도 제공한다.(라이브러리에 따라 다를 수 있습니다.)

 

데이터 흐름을 보면 Kakfa로 전송하기 전 데이터를 모아두는 버퍼를 구성해서 데이터를 모으고, 모은 데이트를 kakfa로 전송하면 Page Cache로 전송한다.

Page Cache는 OS 단에서 관리하는 영역으로 사실 Kafka와 무관하다. Linux에서 Page Cache를 디스크와 동기화 시키는 역할을 하는 파라미터가 아래와 같으니 참고하자.
 

# sysctl -a |grep -i dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200

Page Cache에 대해서 좀 더 알고 싶으면 아래 우병우님 블로그를 읽어보면 좋다.
우병우님 - dirty page가 I/O에 미치는 영향

 

Kafka 구축 컨셉

1. 디스크 요구사항

보통 100Mbyte의 데이터가 Kakfa 유입이 된다고 생각했을 때, 해당 데이터를 몇 개의 복사본(replication)을 둘 것인지가 중요하다. 보통 3개의 복사본을 둔다고 가정하면 Kakfa로 유입되는 총 데이터는 300Mbyte 이며 해당 성능의 디스크 성능치가 요구된다.

최종적으로 kafka가 3대로 클러스터(cluster)로 구성된다면, 각 서버로 100Mbyte로 분산되어 서버당 100Mbyte의 디스크 성능을 요구하게 된다.

 

2. 메모리 요구 사항

메모리는 가능한 Page Cache 영역으로 많이 사용하기 위해서 많으면 많을 수록 좋다.

 

3. 서버 컨셉

최근 솔루션 특성과 같이 고사양의 시스템 1대를 요구하기 보다는, 적절하거나 작은 성능의 시스템 여러대가 하나의 솔루션으로 묶어 더 높은 성능을 내도록 만들어지는 솔루션이 많다. Kafka 솔루션도 동일한 컨셉으로 만들어진 솔루션이다. 시스템 구성 시, 고사양의 단독 시스템보다는 여러 대의 작은 서버들의 구성이 더 좋은 성능을 낼 수 있다.