Apache Kafka
대용량 분산 메시징 시스템?
Apache Kafka(아파치 카프카) — 대용량 분산 메시징 시스템
- LinkedIn에서 개발
- 대용량의 실시간 로그처리에 특화된 아키텍처 설계를 통하여 기존 메시징 시스템보다 우수한 TPS
- 메시지를 메모리가 아닌 파일시스템에 저장, 페이지 케시를 통해 성능보장
- kafka에서는 파일 시스템에 저장된 메시지를 네트워크를 통해 consumer에게 전송할 때 zero-copy기법을 사용하여 데이터 전송 성능향상
Zero Copy는 디스크에서 소켓으로 데이터를 복사할때 커널레벨에서 데이터를 복사하는 방식으로
CPU 사용율과 메모리 대역폭 사용도 줄이고 커널모드와 사용자모드간 컨텍스트 전환 비용도 줄일수 있기 때문에 성능이 좋아진다.자바는 java.nio.channels.FileChannel.transperTo() 메소드를 통해 Zero Copy를 제공한다.
Kafka 는 발행-구독 모델을 기반으로 producer — broker — consumer로 구성
- producer가 특정 topic의 메시지를 생성한뒤 broker에 전달
- broker가 전달받은 메시지를 topic별로 분류하여 적재
- 해당 topic을 구독하는 consumer 들이 메시지를 가져가 처리
(broker가 push 하지 않고 , consumer가 pull 한다.)
kafka는 확장성과 고가용성을 위해 broker 들이 클러스터로 동작하도록 설계
클러스터된 broker들 간의 분산처리는 zookeeper가 담당
서버로그 파일 > filebeat > logstash > elasticsearch
위와 같이 로그를 elasticsearch 로 적재하도록 하고 있을 때.
트래픽이 몰리게 되면 대용량 로그처리를 해야한다.
logstash( kafka publisher) > kafka cluster > logstash (kafka consumer) > elasticseach
kafka cluster에서 파일시스템으로 메시지를 저장하여 처리하기 때문에 로그유실을 줄일수있고 logstash > elasticsearch 의 중간단계에 kafka cluster 라는 buffer를 두기 때문에 급격한 트래픽으로 발생되는 메시지 유실과 부하를 줄일 수 있을거라 …. 생각된다.