Apache kafka는 분산 메시지 스트리밍 플랫폼이로 대용량 데이터 스트림을 안정적으로 수집, 저장, 전송 및 처리하는 데 사용되는 소프트웨어이다. 특히 대용량 데이터 처리 및 실시간 데이터 스트리밍에 적합하다.
kafka는 2010년 링크드인에서 개발되었다. kafka가 도입되기 전엔 서비스가 내부적으로 통신하여 높은 결합도를 가지는 end-to-end 연결 방식으로 데이터를 주고받았다. 이후 서비스가 성장하며 해당 연결 방식으로 인해 복잡도가 증가하기 시작했다. 따라서 서비스와 통신 관리에 문제가 생겼으며 유지보수도 어려웠다. 또한 여러 개의 데이터 파이프라인은 데이터 처리 방법이 모두 다르기 때문에 확장성에 관한 고민이 생기게 된다.
kafka는 위의 문제들을 해결하기 위해 도입되었다. kafka를 도입하면서, 모든 데이터와 데이터 흐름을 중앙에서 관리할 수 있게 되었고 서비스의 특정 부분에서 장애가 생기더라도 유연하게 대처할 수 있게 됐다.
토픽은 메시지를 구분하는 통로다. 하나의 카프카 안에 여러 메시지가 뒤섞여서 오가는데, 그 메시지를 구분하는 기준이 토픽이다. 데이터베이스의 테이블 역할을 수행한다고 보면 된다. 토픽은 여러 개를 만들 수 있고, 이름으로 구분된다.
파티션은 토픽 당 데이터를 분산 처리하는 단위다. 병렬 처리와 많은 양의 데이터 처리를 위해 파티션을 늘릴 수 있다. 다만 파티션은 증가만 가능하고, 삭제는 불가하다.
각각의 파티션은 인덱스를 가지며, 파티션 별로 증가하는 아이디(Offsets)을 가지게 된다. Offset은 파티션에서만 의미가 있다. 예를 들어 파티션1, 파티션2가 있다면 Offset 0번은 파티션 별로 다른 데이터를 가지게 된다.
파티션 안에서는 데이터의 순서가 보장되며, 파티션에 데이터가 한번 쓰이면 변경되지 않는다. 더불어 파티션에 데이터를 push하고자 할 때는 key값을 줘야 한다. key 값을 주지 않으면 데이터는 라운드로빈 방식으로 들어간다.
Topic은 주제별로 모아둔 단톡방이라고 생각할 수 있다. 예를 들어 마블 정보를 공유하는 단톡방이 있다고 하자. 여기에는 참여한 사람들이 공유하는 다양한 정보가 담겨있을 것이다. 사람들은 이 정보를 차곡차곡 쌓아(partition) 필요한 경우, 데이터가 들어온 순서 별로 조회했다.
시간이 지나 단톡방에서 공유되는 정보가 바로 처리하기 힘들 정도로 늘어나기 시작한다. 따라서 사람들은 정보들을 분산처리하기로 한다. '아이언 맨', '캡틴 아메리카', '스파이더맨' 등 고유한 key값을 설정하여 정보들을 쌓아두고, 조회를 해야 할 때 key값에 따라 데이터를 순서 별로 조회한다.
다만 사람들이 설정한 고유한 key값에 따라 생성된 partition은 삭제할 수 없다. 만약 '스파이더맨'을 key값을 정보를 저장해야 하는데 깜빡하고 설정하지 않은 경우 어느 partitions에 들어가 있는지 찾을 수 없다. 즉, 데이터가 꼬일 수 있기 때문에 partition을 여러 개 설치하고자 하는 경우에는 관리에 유의해야 한다.
카프카를 클러스터로 구성했을 때, 각각의 서버를 Broker라고 부른다. Broker는 각각 토픽 파티션을 가지고, Read 및 Write를 관리한다. 어떤 Broker에 접속해도 전체 카프카 클러스터에 접속할 수 있다.
Broker는 ID(숫자)로 식별할 수 있다. 단, Broker ID와 Partition ID 간에는 아무런 관계가 없다. Partitions들은 여러 Broker 산에 분산되며, Topic이 생성될 때 Kafka는 자동으로 Topic을 구성하는 여러 Partitions들을 모든 Broker에게 할당 및 분배한다.
Broker는 데이터를 분산 저장하여 장애가 발생하더라도 안전하게 사용할 수 있게 도와주는 애플리케이션이다. 데이터를 안전하게 보관하고 처리하기 위해 3개의 Broker 서버를 1개의 클러스터로 묶어서 운영한다. 즉, Broker는 데이터를 안전하게 저장하기 위해 분산 저장하고 복제하는 역할을 수행한다.
Zookeeper는 Broker를 관리하고 Partitions의 Leader 선출을 돕는다. 또한 Kafka 변경에 관해 알림을 준다. Kafka는 Zookeeper 없이는 동작하지 못하며 Zookeeper의 Leader는 write, Follower는 read 작업을 수행한다.
Producer는 메시지를 생선하여 토픽으로 메시지를 보내는 애플리케이션이다. 메시지를 전송할 때 Key 옵션을 줄 수 있는데, 해당 Key 값으로 특정 파티션에 미시지를 보낼 수 있다. Key 옵션을 주지 않을 때는 파티션에 라운드로빈 방식으로 균등하게 메시지를 보낸다.
Producer는 전송 방식을 선택할 수 있따.
토픽 이름으로 저장된 메시지를 가져가는 애플리케이션이나 서버 등을 Consumer라고 부른다. Consumer의 집합을 Consumer Group이라고 부르며, Kafka는 Consumer Group 단위로 데이터를 처리한다.