Kafka - 기본 아키텍처 알아보기
1. 개요
졸업논문으로 Kafka와 RabbitMQ에 대해 작성하고 있습니다. 그 과정에서 다양한 자료 조사를 해야 했고 유용한데 번역되지 않은 자료, 논문들도 많이 있었습니다. 그래서 논문 작성 김에 해당 자료 조사를 여러 차례 블로그 글로 정리해서 올리고자 합니다 :)
Kafka만의 특징
- push 방식
Kafka는 push 방식으로 동작하는 기존 message Queue(RabbitMQ 등)와는 다르게 Consumer가 Broker 로부터 메시지를 직접 가져가는 Pull 방식으로 동작합니다. 즉 Consumer는 자신의 처리 능력만큼의 메시지만 가져와 처리합니다.
- 로그 방식
또한 in-memory 저장 방식이 아닌 메세지를 디스크에 저장한다는 특징을 가집니다. 일반적인 메세징 시스템은 Consumer가 메세지를 읽어가면 큐에서 삭제하는 방식이지만 Kafka는 다릅니다. Kafka는 메세지를 파일로 저장하고 TTL이 지나면 삭제합니다.
또한 In-memory가 아닌만큼 Queue를 활용하는 것이 아닌 Topic과 Partition을 활용한 log 방식으로 메시지를 Consumer에게 전파하게 됩니다. 인메모리가 아니라고 해서 캐시를 활용하지 않는 것은 아닙니다. 오히려 순차 접근으로 적극적으로 os의 page cache를 활용합니다. 그래서 속도까지 챙길 수 있었습니다.
2. 기본 아키텍처
- Broker: Kafka를 구성하는 각 서버
- Topic: 데이터가 저장되는 곳. Kafka에 저장되는 메시지는 Topic으로 분류된다. (ex: email topic, purchase topic)
- Partition: Topic 내에서 메시지가 분산되어 저장되는 단위. 한 Topic에 Partition이 6개 있다면 6개의 Partition에 대해 메세지가 분산되어 저장된다. Partition안에 메세지의 상대적 위치를 나타내는 Offset Id가 할당되며 동시에 들어오는 많은 데이터를 여러개의 파티션에 나누어 저장하기 때문에 병렬로 빠르게 처리할 수 있다.
- Producer: Broker에 데이터를 쓰는 역할. Data를 특정 Topic으로 전송한다.
- Consumer: Broker에서 데이터를 읽는 역할.
- Consumer-Group: Consumer의 묶음 단위. Topic에 대한 Offset은 Consumer Group 단위로 구분
- Zookeeper: 클러스터의 설정 정보, 동기화, leader 채택 등 클러스터 서버들이 공유하는 데이터를 관리하기 위해 사용한다.
읽기/쓰기:
Producer는 1개 이상의 Partition에 나뉘어 데이터를 Write하며
Consumer는 Partition단위로 데이터를 병렬로 읽을 수 있다.
복제:
Kafka에서는 높은 가용성을 위하여 Replication이란 기능을 제공합니다.
Replication은 각 Topic의 Partition들을 Kafka Cluster내의 다른 Broker들로 복제하는 것을 말하며 Topic생성 시 Replication의 수를 지정할 수 있습니다.
Replication 수를 지정하여 Topic을 만들수 있습니다. replication-factor 옵션으로 지정합니다.
ex) "Topic-3"은 replication-factor=3
Kafka Cluster내에는 Broker 간에 Leader/Follower Partition 개념이 있으며 Topic의 모든 데이터에 대한 Read/Write는 오직 Leader에서 이루어집니다. Follower는 Leader와 Sync를 유지함으로써 Leader에 문제가 생겼을 경우 Follower들 중 하나가 Leader역할을 합니다.
복제를 하기 위한 시간과 네트워크 비용이 들기 때문에 데이터 중요도에 따른 설정이 가능합니다. 해당 설정을 ACKS 설정이라고 합니다.
- acks=0
Producer는 Broker로 메시지를 전송만 하고 응답을 기다리지 않는다.
- acks=1
Producer는 Broker로 메시지를 전송하고 응답을 기다린다.
- acks=all(-1)
Producer는 Broker로 메시지를 전송하고, 리더는 모든 서버들의 복제가 끝난 후 Producer에게 응답을 한다.