카프카란(Apache-Kafka)?
링크드인에서 개발된 데이터 파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 설계된 고성능 분산 이벤트 스트리밍 플랫폼
왜 카프카를 사용하는가?
- 서비스의 규모가 커짐에 따라 각 서비스를 쪼개서 운영할 필요가 생겼다
- 서비스를 쪼개면 서버 사이의 상호작용이 많아진다 -> 큰 오버헤드를 부름
- 데이터 파이프라인의 복잡도가 증가하여, 유지보수 및 운영에 어려움을 느낌
아래는 카프카 사용 후 데이터 처리 시스템
카프카 구성
Cluster(카프카 클러스터)
- 여러 개의 브로커들로 구성됨
- 클라이언트는 특정 브로커에 연결하면 전체 클러스터에 연결됨
- 최소 3대 이상의 브로커를 하나의 클러스터로 구성해야 함
Broker(브로커)
- 카프카 어플리케이션이 설치되어 있는 서버 또는 노드 ( 카프카 서버 )
- 파티션에 대한 읽기와 쓰기를 관리하는 소프트웨어
- 토픽 내 파티션들을 분산, 유지 및 관리
- 토픽의 일부 파티션들을 포함
- 토픽 데이터의 일부분(파티션)을 가질 뿐 데이터 전체를 갖고 있지 않음
- 브로커 내부에 여러 토픽들 생성 가능
- 토픽들에 의해 생성된 파티션들이 보관하는 데이터에 대해 분산 저장을 해주거나 장애 발생 시 안전하게 데이터를 사용할 수 있게 함
- Controller(컨트롤러)
- 클러스터의 여러 브로커 중 하나의 브로커가 컨트롤러 역할을 함
- 클러스터 내의 브로커가 장애 발생으로 사용할 수 없는 경우, 장애가 발생한 브로커의 토픽에 있는 리더 파티션을 같은 클러스터 내의 정상 동작하는 다른 브로커에게 토픽의 리더 파티션 지위를 재분배
- Coordinator(코디네이터)
- 컨슈머 그룹 내의 컨슈머가 장애가 발생하여 매칭된 파티션의 데이터를 컨슘할 수 없는 경우, 장애가 발생한 컨슈머에게 매칭된 파티션을 정상 동작하는 다른 컨슈머에게 매칭 ⇒ 리밸런싱(Rebalancing)
Topic(토픽)
- 카프카 안에서 메시지가 저장되는 장소
- 프로듀서(Producer)와 컨슈머(Consumer)들이 카프카로 보낸 메시지를 구분하기 위한 이름
⇒ 카프카 클러스터의 브로커에서 데이터를 관리할 때 기준이 됨
- 다수의 프로듀서, 컨슈머들이 동일한 카프카를 사용하게 되면, 메시지들이 뒤섞여 각자 자신이 원하는 메시지를 얻기 어렵기 때문에 이를 구분하기 위해 사용
- 토픽 내 파티션들은 독립적임
- 반드시 존재하는 리더 파티션, 존재할 수도 있는 팔로워 파티션으로 구성될 수 있음
- 리더 파티션 : 프로듀서 또는 컨슈머와 직접 통신하는 파티션
- 팔로워 파티션 : 프로듀서로부터 리더 파티션으로 전달된 데이터를 복제하여 복제된 데이터 저장
Partition(파티션)
- 하나의 토픽은 하나 이상의 파티션으로 구성
- 병렬처리(Throughput 향상)를 위해 다수의 파티션 사용
- Segment라고 하는 물리 파일로 구성되어있음
- Commit Log
- 추가만 가능하고 변경 불가능한 데이터 스트럭처
- 데이터(Event)는 항상 로그 끝에 추가되고 변경되지 않음
- Offset(오프셋)
- 커밋로그에서 데이터의 위치
- 오프셋은 하나의 파티션에서만 의미를 가짐
- 오프셋 값은 계속 증가하고 0으로 돌아가지 않음
Segment(세그먼트)
- 데이터(메시지)가 저장되는 실제 물리 File
- 세그먼트 파일이 지정된 크기보다 크거나 지정된 기간보다 오래되면 새 파일이 열리고 메시지는 새 파일에 추가됨
프로듀서(Producer)
- 메시지를 생산하여 브로커의 토픽 이름으로 메시지를 보내는 서버 또는 어플리케이션
- 데이터를 전송할 때 리더 파티션을 가지고 있는 카프카 브로커와 직접 통신
- 파티셔너(Partitioner) : 프로듀서 어플리케이션 내에서 생성된 메시지를 카프카에 보낼 때, 이 메시지가 토픽의 어떤 파티션에 전달될 지 정함
컨슈머(Consumer)
- 토픽의 파티션에 저장되어 있는 메시지를 소비하는 역할을 하는 서버 또는 어플리케이션
- 데이터를 요청할 때 리더 파티션을 갖고 있는 브로커와 통신
- Consumer Group(컨슈머 그룹) : 토픽의 메시지를 사용하기 위해 협력하는 컨슈머들의 집합
- 하나의 컨슈머는 하나의 컨슈머 그룹에 포함되며, 컨슈머 그룹내의 컨슈머들은 협력하여 토픽의 메시지를 분산 병렬 처리함
프로듀서와 컨슈머의 분리(Decoupling)
- 프로듀서와 컨슈머는 서로 알지 못하며, 프로듀서와 컨슈머는 각각 고유의 속도로 Commit Log(커밋로그)에 작성하고 읽는다
- 다른 컨슈머 그룹에 속한 컨슈머들은 서로 관련이 없으며, 커밋로그에 있는 Event(message)를 동시에 다른 위치에서 읽을 수 있다
Zookeeper(Apache-Kafka 4.0 버전부터는 없어짐)
- 브로커를 관리(브로커들의 목록/설정을 관리)하는 소프트웨어
- 주키퍼는 변경사항에 대해 카프카에 알림 -> 토픽 생성/제거, 브로커 추가/제거 등
- 주키퍼 없이는 카프카가 작동할 수 없음
- 주키퍼는 홀수의 서버로 작동하게 설계되어 있음