Apache Kafka - Topic, Partition, Segment

현시기얌·2022년 2월 9일
0

Apache Kafka

목록 보기
2/12

Apache Kafka 주요 요소

위의 그림을 보면 가운데는 Apache Kafka Cluster가 있고 그 안에 Topic이라는 것을 만든다.
Topic은 Kafka내에서 전송되는 메시지가 저장되는 장소이다.
Topic은 논리적인 표현으로 시스템 상에(파일, 디렉토리) 눈에 보이지 않는다.

그림 왼쪽을 보면 Producer라고 하는 Application이 있고 Consumer라고 하는 Application이 존재한다.

  • Producer: 메시지를 생산(Produce)해서 kafka의 Topic으로 메시지를 보내는 애플리케이션
  • Consumer: Topic의 메시지를 가져와서 소비(Consume)하는 애플리케이션
  • Consumer Group: Topic의 메시지를 사용하기 위해 협력하는 Consumer들의 집합

하나의 Consumer는 하나의 Consumer Group에 포함되며
Consumer Group내의 Consumer들은 협력하여 Topic의 메시지를 분산 병렬 처리 한다.

Producer와 Consumer의 기본 동작 방식

Producer와 Consumer Application은 서로 알지 못하며 Producer와 Consumer는 각각 고유의 속도로 Commit Log에 Write 및 Read를 수행한다.

다른 Consumer Group에 속한 Consumer들은 서로 관련이 없으며, Commit Log에 있는 Event(Message)를 동시에 다른 위치에서 Read할 수 있다.

Kafka Commit Log

Commit Log: 추가만 가능하고 변경 불가능한 Data Structure
데이터(Event)는 항상 로그 끝에 추가되고 변경되지 않는다.
데이터가 들어오면 맨처음에 0번에 Write가 되고 또다른 데이터가 들어오면 0번을 변경하는 것이 아니라 1,2,3 같이 순차적으로 추가만 된다.

Offset : Commit Log에서 Event의 위치
위의 그림에서는 0부터 10까지의 Offset을 볼 수 있다.

Commit Log에서 Event의 위치

Producer가 Write하는 LOG-END-OFFSET과 Consumer Group의 Consumer가 Read하고 처리한 후 Commit한 CURRENT-OFFSET과의 차이(Consumer Lag)가 발생할 수 있다.

Logical View

Topic : kafka 안에서 메시지가 저장되는 장소, 논리적인 표현
Partition: Commit Log, 하나의 Topic은 하나 이상의 Partition으로 구성된다. 병렬처리(Throughput 향상)를 위해서 다수의 Partition을 사용한다.
Segment: 메시지(데이터)가 저장되는 실제 물리 File, Segment File이 지정된 크기보다 크거나 지정된 기간보다 오래되면 새 파일이 열리고 메시지는 새 파일에 추가된다.

Physical View

Topic 생성 시 Partition의 개수를 지정하고 각 Partition은 Broker들에 분산되며 Segment File들로 구성된다.

Apache Kafka Cluster는 여러개의 Broker들로 만들어져 있다. (확장/축소 가능)
이 때 만약 Topic A를 Partition 3개를 가지고 만들겠다고 한다면 Topic A의 Partition들은 Broker들에게 분산이 되어 만들어진다.
마찬가지로 Topic B를 Partition 3개를 가지고 만들겠다고 한다면 Topic B의 Partition들도 Broker들에게 분산이 되어 만들어진다.
Topic C처럼 Partition 2개를 가지고 만들어도 마찬가지로 Broker들에게 분산되어 만들어진다.

Partition들이 분산되는 방식은 Broker Cluster 내에서 최적화해서 최적의 곳에 Partition들을 위치 시킨다.

위의 사진을 보면 Broker102는 Topic A의 Segment File이 3개로 분리된 Partition과 Topic B의 Segment File이 4개로 분리된 Partition이 각각 하나씩 들어가 있다.

Rolling Strategy : log.segment.bytes(default 1GB), log.roll.hours(default 168 hours)
Segment File은 분리시켜서 만든다. 하나의 시스템내에 10G, 100G 파일을 만들 수는 없기 때문이다.
따라서 Segment File을 용량이나 시간에 따라 분리시켜서 만든다.

Partition당 하나의 Active Segment

Partition당 오직 하나의 Segment가 활성화(Active) 되어 있다.
--> 데이터가 계속 쓰여지고 있는 중

Partition 0은 Segment가 0번부터 3번까지 만들어져 있다.
Segment 0,1,2는 이미 파일을 끊고 나왔기 때문에 Write를 할 수 없다.
따라서 Active 되어 있는 Segement3에서만 Write할 수 있다.

요약 - Topic, Partition, Segment의 특징

  • Topic 생성시 Partition의 개수를 지정한다. (개수 변경은 가능하나 운영시에서는 변경을 권장하지 않는다.)
  • Partition 번호는 0부터 시작하고 오름차순이다.
  • Topic 내의 Partition들은 서로 독립적이다.
  • Event(Message)의 위치를 나타내는 Offset이 존재한다.
  • Offset은 하나의 Partition에서만 의미를 가진다.
    ex) Partition 0의 Offset 1 != Partition 1의 Offset 1
  • Offset 값은 계속 증가하고 0으로 돌아가지 않는다.
  • Event(Message)의 순서는 하나의 Partition내에서만 -보장된다. (각각 Partition들은 독립적이기 때문이다.)
  • Partition에 저장된 데이터(Message)는 변경이 불가능(Immutable)하다.
  • Partition에 Write되는 데이터는 맨 끝에 추가되어 저장된다.
  • Partition은 Segment File들로 구성된다.
    Rolling 정책 : log.segment.bytes(default 1GB), log.roll.houres(default 168 hours)
profile
현시깁니다

0개의 댓글