1. 원래 우리는 데이터 파이프라인을 어떻게 만들었나 

 

 

Kafka 가 있기 전의 전통적인 데이터 아키텍쳐는 Rest API 처럼 Api 요청을 보내고, 데이터를 받아와서 Data Lake 를 구축하곤 하는 방식을 주로 사용했었다. 그런데, 이 방식은 데이터 파이프라인이 복잡해지면 복잡해질수록 신뢰도가 점점 떨어지고, 저 연결고리가 복잡하다면 어떤 에러가 발생했을 때, 어디에서 에러가 나는지 모니터링하기도 어렵다는 단점이 있다. 

 

 

 

그래서 이 복잡도를 낮춰줄 중간 단계로서  Kafka 가 등장한 것인데,... 

 

쉽게 생각해 Data Lake 에 넘어가기 전 단계에 이 프로세스들을 한데로 연결할 중간 고리를 만들었다고 생각하면 된다

 

 

이렇게 파이프라인을 구축하면, 복잡도가 선형적으로 상승하기 때문에 확장성이 좋고, 새로운 프로토콜을 통합할때도 작업이 간단하다. 또, 속도도 빠른 편이고, 클러스터 환경에서 작동해서 가용성이 좋다. 

 

Kafka 는 이런 경우에 많이 사용한다고 한다 

 

- 우리 서비스에서 유저들에게 실시간 알림을 보내야 하는 경우

- 우리 서비스에서 로그를 수집하고 싶은 경우 

- 우리 서비스에서 실시간으로 데이터를 보고, 예측하고, 지수를 관리하는 경우 

 


 

2. Kafka 아키텍쳐 

 

카프카는 분산 스트리밍 플랫폼이다. (여러개의 서버로 데이터를 쪼개서 효율적으로 처리를 한다!) 

 

먼저 전체 아키텍쳐는 다음과 같이 만들어져있는데, 구성 요소를 떼어놓고 먼저 하나하나 보도록 하자. 

카프카는 용어나 구조가 상당히 복잡하기 때문에 개념을 잘 익혀야 하는 것 같다... 

 

 

 

 

 

2.1. Topic / Message/ Partition 

 

Topic 은 하나의 채널이나 폴더같은 개념으로 보면 된다. 기본적으로 분산처리를 하고싶어서 Kafka 를 쓰는 거니깐 뭔가 나누어 줄 만한게 필요하지 않겠나... 토픽은 다음 그림처럼 데이터가 들어오고 나갈 때 분리해주는 역할을 하는데, 이 Topic 안에 또 한번 더 Partition(파티션) 이란 개념으로 분리를 해주는 기능이 있다. 이렇게 예쁘게 정렬이 되어 기록들이 쌓이고, 이들은 변하지 않는다. 이 모든 기록들은 offset 이라는 id 를 부여받는데 (고유값같은거) 이걸 기준으로 메시지를 찾을 수 있다. 

 

주황색: 메시지 / 하늘색: 파티션

바로 이 기능으로 카프카는 분산처리를 하는거다! 다만 성능을 위해서 파티션 당 들어가있는 데이터의 크기는 작은게 좋다고 한다

 

 

2.2. Broker / Cluster 

 

Broker 는 서버 역할을 한다. Topic 을 생성을 하면 모든 카프카 브로커에 Topic 이 생성이 되는데, 파티션을 분산시키는 방법에 두개가 있다.

 

1- 사용자가 key 를 지정해 주는 방법

: 데이터 너 저기로 가! 

 

2. 따로 지정해주지 않는 방법

: 알아서 적절한 곳으로 배치된다 (Round robin 을 검색하면 좀 더 자세히 이 방법을 볼 수 있다) 

 

 

 

 

2.3. Producer / Consumer 

 

Producer 는 바깥 부분에서 메시지를 보내는 역할, Consumer 는 메시지를 받는 역할을 한다. 

Kafka 내의 Topic 으로 메시지를 보내는건데, key 를 지정해서 Topic 내의 어떤 위치(어떤 파티션) 으로 갈지를 지정해주면 된다. 이때, 파티션 키를 따로 지정해주지 않으면 Round Robin 방식으로 파티션에 메시지를 분배한다.

 

Consumer 는 Producer 보낸 메시지를 받는데, Consumer 들은 어떤 Consumer group 안에 속하게 된다. 새로 만들때 따로 Consumer 를 만들때 어떤 그룹에 들어갈질 지정을 안해주면 각각 독립적인 개체로서 그룹이 형성이 된다. Consumer 들은 지정된 파티션들로부터만 메시지를 받을 수 있다! (그러니까, 같은 그룹 안의 두 Consumer 는 같은 파티션으로부터 동시에 메시지를 받을 수는 없다!) 

 

 

 

2.4. Cluster

 

Kafka 는 확장성을 위해 클러스터를 이루고 있다 (브로커가 여럿으로 나뉘었다는 뜻) 그래서 만약에 하나의 서버가 다운되더라도 분산처리 기능이 작동되어 복제된 토픽의 파티션이 작동하게 된다. 이때 원본과 복제한걸 구분하기 위해 Leader, Floower 이란 이름으로 둘을 두분하게 된다. 

 

 

 

 

2.5. Zookeeper

 

Zookeeper 는 Consumer 와 통신을 하면서 시스템간의 정보를 공유하고, 서버의 동기화를 도와주며,  Cluster 의 여러 요소들을 설정하는 역할을 한다. 

 

- Cluster 관리: 클러스터에 존재하는 Broker (서버) 를 관리한다

- Topic 관리 : 토픽에 할당된 파티션을 관리한다

- 파티션 Leader 관리 : 파티션의 리더가 될 브로커를 선택하고, 리더가 다운될 경우 다음 리더를 선택한다

 

 

 

지금까지 카프카를 구성하는 요소들과 작동 원리를 알아봤다 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
허니비 honeybee