[Kafka] 카프카(Kafka)의 기본 구성 요소와 동작

2023. 1. 24. 16:01IT

 Kafka의 기본 구성 요소와 동작

 

Kafka에 기본 구성요소와 동작에 대해 '데브원영 DVWY'님이

유튜브에 올린 내용들을 필기한 내용들을 적어놓았다.

 

유튜브 영상과 함께 공부하고 싶다면 가장 아래에

URL을 적어두었다!!

 

 

카프카가 무엇이고 왜 사용하는지 궁금하다면 아래의 블로그로 이동해보자!!

 

[Kafka] 아파치 카프카(Apache Kafka)에 대한 정의와 사용하는 이유

Apache Kafka(아파치 카프카) 대용량 데이터 처리에 대해 공부한다면 '아파치 카프카'라는 단어를 많이 들어봤을 것이다!!! 대체 카프카가 무엇이길래 사람들이 이야기하며 공부하는 것일까? 오늘은

getfelix.tistory.com

이모티콘

 

 

이제 카프카가 어떻게 동작하고 구성요소들은 무엇이 있는지 확인해보자!!!

 

'데브원영 DVWY'님의 유튜브

 

 

Kafka는 발행-구독(publish-subscribe) 모델을 기반으로 동작하며

 크게 producer, consumer, broker로 구성된다.


 여러개의 producer가 Kafka Cluster를 중심으로

여러명의 consumer들과 데이터를 push하고 pull하는 구조이다.

 

 

1) 프로듀서(Producer)

데이터를 발생시키고 카프카 클러스터(Kafka Cluster)에 적재하는 프로세스이다.

(데이터를 넣는 역할)

 

 

2) 컨슈머그룹(Consumer Group)

컨슈머의 집합을 구성하는 단위이다.

(컨슈머 : 데이터를 가져가는 역할)

 

카프카에서는 컨슈머 그룹으로서 데이터를 처리하며

컨슈머 그룹 안의 컨슈머 수만큼 파티션의 데이터를 분산처리하게 된다.
                                              

카프카 클러스터에서 데이터를

가져오게 될 때는 컨슈머 그룹(Consumer Group)단위로 가져오게 된다.

 

이 컨슈머 그룹은 자신이 가져와야하는 토픽 안의

파티션의 데이터를 Pull하게 되고 각각 컨슈머 그룹안의

컨슈머들이 파티션이 나뉘어져 있는 만큼 데이터를 처리하게 된다.   
 

3) 카프카 클러스터(Kafka Cluster)

카프카 서버로 이루어진 클러스터를 말한다. 

(3개 이상의 카프카 브로커로 구성)

컴퓨터 클러스터(Computer Cluster) :
여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합

 

 

 4) 브로커(Broker)

카프카가 설치되어 있는 서버 단위이며 보통 3개 이상의 브로커로 구성하여 사용한다.

 

 

 5) 토픽(Topic)

다양한 데이터가 들어가는 공간으로 여러개 생성이 가능하다.

(DB의 테이블이나 파일시스템의 폴더와 유사한 성질)

 

하나의 토픽은 여러개의 파티션(Partition)으로 구성될 수 있으며 0번 부터 시작한다.

하나의 파티션은 프로듀서에 의해 큐와 같이 내부의 데이터가 파티션 끝에서부터 쌓이고

이때, 각 데이터에 오프셋이라고 하는 숫자가 붙게된다.

 

컨슈머가 붙게되면 데이터를 가장 오래된 순서대로 가져가게 된다.

더 이상 데이터가 들어오지 않으면
 컨슈머는 데이터가 들어올때까지 대기, 컨슈머가 토픽 내부의 

파티션에서 래코드를 가져가도 데이터는 삭제되지 않고 그대로 남게된다.


 삭제 되지 않는 데이터를 새로운 컨슈머들이 지속적으로 

사용 가능하여 동일 데이터를 목적에 따라 다르게 여러번 처리할 수 있다.

(컨슈머 그룹이 달라야 하고 auto.offset.reset=earliset이어야 사용가능)

오프셋(offset) :
일반적으로 동일 오브젝트,배열 안에서 오브젝트 처음부터 주어진 요소나 지점까지의변위차를 나타내는 정수형.
이를테면, 문자 A의 배열이 abcdef를 포함한다면 'c' 문자는 A 시작점에서 2의 오프셋을 지닌다고 할 수 있다.
어셈블리어와 같은 저급 프로그래밍 언어에서 오프셋은 상대 주소(relative address)로 부른다.

 

        파티션이 여러개일 경우 올바른 파티션에 넣기위해 

프로듀서는 데이터에 보낼때 키를 지정하여 키의 해시(Hash)값을 구해 특정 파티션에 할당한다.


                      키가 없고 기본 파티셔너를 사용할 경우 라운드 로빈(Round robin)으로 파티션이 지정

0번 -> 1번 -> 0번 이런식으로 할당된다.


파티션은 늘리는건 가능하지만 줄일 수는 없어 조심해서 늘려야 한다.

파티션을 늘리면 켠슈머의 개수를 늘려 데이터 처리를 분산시킬 수 있기 때문에 추가한다.

 

파티션의 레코드는 저장되는 최대시간과 크기를 초과하게 되면 삭제된다.

(최대 보존 시간 = log.retension.ms, 최대 보존 크기 = log.retension.byte)

 

   

 6) 파티션(Partition)

각 토픽 당 데이터를 분산 처리하는 단위이다.

(하드디스크를 논리적으로 나눈 구역)


카프카에서는 토픽 안에 파티션을 나누어 그 수대로 데이터를 분산처리하고
카프카 옵션에서 지정한 replica(복제, 모형)의 수만큼 파티션이 각 서버들에게 복제된다.

 

 7) 파티셔너(Partitioner) 

 프로듀서가 데이터을 보낼 때 데이터를 어떤 파티션에 넣을지 결정하는 역할을 한다.

(레코드에 포함된 키 or 메시지 값에 따라 결정)

       프로듀서를 사용할 때 파티셔너를 따로 설정하지 않으면 UniformStickyPartitioner로 설정된다.

(메시지 키가 있을 때와 없을 때 다르게 동작)


메시지 키가 있을때, 파티셔너에 의해 특정한 해쉬값을 생성하고

 이 해쉬값을 기준으로 파티션의 위치를 결정하고

동일한 메시지 키 = 동일한 해쉬값을 가져

동일한 파티션에 들어가기 때문에 순서를 지켜서 데이터 처리한다.


메시지 키가 없을때, 라운드 로빈(Round robin)으로

파티션이 지정되지만 UniformStickyPartitioner는 프로듀서에서 배치로 모을 수 있는

최대한의 레코드를 모아 파티션으로 전송하여 라운드 로빈(Round robin)으로 분배한다.

 

 

8) 복제(Replication) 

클러스터에서 서버에 장애가 생길 때 카프카의 가용성을 보장하는 가장 좋은 방법이다.

(파티션의 복제)
Replication 1이라면 파티션은 원본1개만 존재한다는 것이고

Replication 2이라면 파티션은 원본 1개와 다른 브로커에 복제본 1개가 존재한다.

 

브로커 개수에 따라 Replication 개수가 제한되는데

브로커 개수가 3개라면 Replication 개수가 3개 이상 될수 없다.


원본 파티션은 Leader 파티션, 복제 파티션은 Follower 파티션이라 부르고

원본과 복제 파티션의 그룹을 ISR(In Sync Replica)이라고 부른다.


Replication은 파티션의 고가용성을 위해 사용되는데 1개의 브로커를 사용할 수 없을 때

Follower 파티션이 있으면 복구할 수 있게 된다.

(Leader 파티션 역할 승계)
  
  Leader 파티션은 프로듀서가 전달해주는 파티션을 전달받는 주체이다.

(프로듀서에는 'ack'라는 상세옵션이 존재하여  고가용성을 유지)


ack = 0 일때, 프로듀서는 Leader 파티션에 데이터를 전송하고 

응답값을 받지 않아 정상적으로 전송 되었는지 복제되었는지

알수 없어 속도는 빠르지만 데이터 유실 가능성이 있다.


ack = 1 일때, 프로듀서는 Leader 파티션에 데이터를 전송하고

 응답값을 받지만 복제되었는지 알수 없어 데이터 유실 가능성이 있다.


ack = all 일때, 프로듀서는 Leader 파티션에 데이터를 전송하고 

응답값을 받고 Follower 파티션에 복제 유무 또한 확인하지만 속도가 느리다.

Replication이 많을 수록 브로커의 개수도 많아져 리소스 사용량이 늘어나므로 환경에 맞게 잘 설정해야 한다.

 

9) 리더, 팔로워(Leader, Follower)

카프카에서는 각 파티션당 복제된 파티션 중에서 하나의 리더가 선출된다. 
이 리더는 모든 읽기, 쓰기 연산을 담당한다.


리더를 제외한 나머지는 팔로워가 되고 이 팔로워들은

단순히 리더의 데이터를 복사하는 역할만 한다.

 

10) 주키퍼(Zookeeper) 

주키퍼(Zookeeper)는 분산 코디네이션 시스템입니다. 
카프카 브로커를 하나의 클러스터로 코디네이팅하는 역할을 하며 
카프카 클러스터의 리더(Leader)를 발탁하는 방식도 주키퍼가 제공하는 기능을 이용한다.

 

 

 

'데브원영 DVWY'님의 유튜브는 아래를 통해 들어갈수 있다.

 

https://www.youtube.com/watch?v=waw0XXNX-uQ&list=PL3Re5Ri5rZmkY46j6WcJXQYRlDRZSUQ1j 

'데브원영 DVWY'님의 유튜브