Apache Kafaka의 주요 요소 - Topic, Partition, Segment
Apache Kafaka의 주요 요소 - Topic, Partition, Segment
토픽은 파일이나 디렉토리처럼 눈에 보이는게 아닌 논리적인 표현
- Producer: 메세지를 생산(Produce)해서 Kafka의 Topic으로 메세지를 보내는 애플리케이션
- Consumer: Topic의 메세지를 가져와서 소비(Consume)하는 애플리케이션
- Consumer Group: Topic의 메세지를 사용하기 위해 협력하는 Consumer들의 집합
- 하나의 Consumer는 하나의 Consumer Group에 포함되며, Consumer Group 내의 Consumer들은 협력하여 Topic의 메세지를 분산 병렬 처리함
프로듀서와 컨슈머 동작방식
프로듀서와 컨슈머 애플리케이션은 서로 알지 못한다. 그저 각각의 고유의 속도로 Commit Log에 Write와 Read를 수행한다.
Consumer Group A 와 Consumer Group B는 서로 알지 못한다.
Commit Log는 추가만 가능하고 변경이 불가능한 데이터 스트럭처. 데이터는 항상 로그 끝에 추가되고 변경되지 않음
0,1,2,3,4,5,6,7처럼 새로운 이벤트 데이터가 들어오면 끝에 추가만 된다
0,1,2,3,4,5,6,7과 같은 Commit Log에서 Event의 위치를 Offset 이라고 한다.
카프카에서는 Producer가 Write하는 제일 끝을 LOG-END-OFFSET(로그엔드오프셋)이라고 하고,
Consumer가 가져가서 읽어간 위치(Read)를 commit(마킹)을 하는데 이를 CURRENT-OFFSET이라고 한다.
LOG-END-OFFSET과 CURRENT-OFFSET의 차이를 Consumer Lag(컨슈머 랙)라고 한다.
토픽, 파티션, 세그먼트
토픽: 눈에 보이지 않는 논리적인 단위
파티션: 시스템상에서 눈에 보이는 것, 파티션이 앞에서 말한 커밋 로그이다. 하나의 토픽은 하나의 파티션 이상으로 이루어 지게 되어있다.
이렇게 여러개의 파티션으로 만든 이유는 병렬처리로 성능의 향상을 위해서이다.
세그먼트: 메세지가 실제 물리 파일로 저장되는 형태
토픽은 생성시에 파티션의 개수를 지정하게 되어있음
세그먼트 파일은 용량을 정하거나, 시간을 정해서 계속 롤링하면서 분리하게 되어있음
엑티브 세그먼트
파티션0번은 세그먼트0~3까지, 고로 마지막 세그먼트(3)가 엑티브 세그먼트이다.
→ 파티션 0번은 3번이 액티브 세그먼트
파티션 1번은 세그먼트 0~2까지, 고로 마지막 세그먼트(2)가 엑티브 세그먼트이다.
→ 파티션 1번은 2번이 액티브 세그먼트
요약 - 토픽, 파티션, 세그먼트의 특징
- 토픽 생성시에 파티션 개수를 지정 → 운영중에 변경 할 수는 있지만, 권장하지 않음
- 파티션 번호는 0번 부터 시작하고 오름차순이다.
- 토픽내의 파티션들은 서로 독립적이다.
- 이벤트의 위치를 나타내는 오프셋이 존재한다
- 오프셋은 하나의 파티션에서만 의미를 가진다. (파티션 0의 오프셋 1은 파티션 1의 오프셋 1과 다르다)
- 이벤트의 순서는 하나의 파티션 내에서만 보장된다. (서로 각각 움직이기 때문이다.) 메세지의 순서는 차례대로 저장된다.
- 파티션에 한번 저장된 데이터는 변경이 불가능하다.
- 파티션에 Write되는 데이터는 맨 끝에 추가되어 저장된다.
- 파티션은 세그먼트 파일들로 구성된다. (너무 커지는것을 방지하기 위해) → 파일의 용량 또는 시간을 기준으로 쪼개서 저장한다.