Kafka
2020. 5. 8. 18:18ㆍ기타
728x90
1. Apache Kafka란
Apache Kafka란 대용량의 실시간 로그 처리에 특화되어 설계된 메시징 시스템입니다. Kafka는 Pub/Sub 모델을 기반으로 동작하며 크게 producer, consumer, broker로 구성됩니다. 그림으로 표현하면 아래와 같이 나타납니다.
- Producer: 데이터를 발생시키고 Kafka Cluster에 적재하는 프로세스
- Kafka Cluster: 카프카 서버로 이루어진 클러스터
- Broker: 카프카 서버
- Zookeeper: 분산 코디네이션 시스템으로, Kafka Broker를 하나의 Cluser로 코디네이팅하는 역할을 하며, Cluster의 Leader를 발탁하는 방식을 제공
- Topic: Kafka Cluster에 데이터를 관리할 때 그 기준이 되는 개념. Topic은 Cluster에서 여러 개 만들 수 있으며, 하나의 Topic은 1개 이상의 Partition으로 구성되어 있음
- Partition: 각 Topic 당 데이터를 분산 처리하는 단위. Kafka에서는 Topic 안에 Partition을 나누어 그 수대로 데이터를 분산 처리.
- Leader: 모든 읽기, 쓰기 연산을 담당
- Follwer: 단순히 리더의 데이터를 복사하는 역할
- Consumer Group: Consumeer의 집합을 구성하는 단위.
2. Apache Kafka Partition Read & Write
Kafka에서의 read, write는 Cluster 내의 Leader에만 적용됩니다. 하늘색으로 칠해진 Partition들은 Leader이며 이 Partiton들에게 Producer가 write 연산을 진행합니다. 그리고 Leader에 연산이 진행되고 나면, 업데이트된 데이터는 Follwer들에게로 복사됩니다.
Kafka는 Queue 형태로 데이터를 디스크에 저장합니다. 이 때 Partition들은 각각의 데이터들의 순차적인 집합인 Offset으로 구성되어 있습니다. Consumer Group의 각 Consumer들은 Partition의 Offset을 기준으로 데이터를 순차적으로 처리하게 됩니다. 참고로, 같은 Consumer Group내에 있는 Consumer는 같은 Partition의 데이터를 처리할 수 없습니다.
3. Apache Kafka의 특징
- 분산 시스템을 기본으로 설계되었기 때문에, 분산 및 복제 구성이 쉬움
- TCP 기반의 프로토콜을 사용하여 프로토콜에 의한 오버헤드를 감소시킴
- 다수의 메시지를 Batch 형태로 Broker에게 한번에 전달할 수 있어 TCP/IP 라운드 트립 횟수가 줄어듬
- 메시지를 파일 시스템에 저장
- 파일 시스템에 메시지를 저장하기 때문에 데이터의 영속성이 보장됨
- 메모리에 저장하는 기존 시스템은 메시지가 많을수록 성능이 크게 감소하였으나, Kafka는 파일 시스템에 저장하기 때문에 성능이 크게 감소하지 않음
- 기존 시스템은 처리된 메시지를 바로 삭제하는 반면에, Kafka는 파일 시스템에 두었다가 수명이 지나면 삭제하도록 처리
- 기존의 메시징 시스템은 broker가 consumer에게 메시지를 push 하는 방식인데 반해, Kafka는 consumer가 broker로부터 직접 메시지를 가져가는 pull 방식으로 동작.
- consumer는 자신의 처리 능력만큼의 메시지만 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있음
- push 방식에서 broker는 각 consumer가 어떤 메시지를 처리해야 하는지 계산하고 어떤 메시지를 처리 중인지 트래킹했지만, Kafka는 직접 필요한 메시지를 broker로부터 pull 하므로 broker의 consumer와 메시지 관리에 대한 부담이 경감됨
- pull 방식으로 메시지를 처리하기 때문에, 메시지를 쌓아두었다가 주기적으로 처리하는 batch consumer의 구현이 가능
728x90
'기타' 카테고리의 다른 글
Vue.js (0) | 2020.06.05 |
---|---|
Rabbit MQ (0) | 2020.05.13 |
Message Queue (0) | 2020.05.08 |
Pub/Sub 모델 (0) | 2020.05.07 |
Git Merge와 Rebase (0) | 2020.04.26 |