태그: Apache

ElasticStack 사용하기 – (2) Apache Kafka 개요

ElasticSearch, Logstash, Kibana만으로 ElasticStack을 구축할 수는 있지만, 이 구조는 확장성이 부족하다.

ElasticSearch의 부하는 클러스터 구성으로 분산할 수 있지만, Feeder의 역할을 하는 Logstash는 수평적으로 확장하기 힘들다.
또한, 로깅 시스템에는 Fault Tolerant가 필요하다.

Apache Kafka는 이러한 고민거리를  한번에 해결해 준다.

 

ZooKeeper를 기반으로 만들어진 비동기 메시지 프레임워크인 Apache Kafka는 시스템의 가용성과 확장성, 성능을 모두 보장해준다.
그것을 확인하기 위해, Kafka의 아키텍처를 잠시 살펴보자.


Image from http://cloudurable.com/blog/kafka-architecture

Kafka의 아키텍처에서 핵심이 되는 부분은 총 3개이다. Producer, Consumer 그리고 Topic.

Producer는 Record를 생성해 특정 Topic에 발행한다. 이 Record는 Kafka 클러스터 내부에서 자동으로 복제/병렬화되어 저장된다.
Topic을 구독하는 Consumer들은 클러스터에 Record를 요청하여 가져간다. 이 모든 작업이 비동기/분산적으로 이루어진다.

또한 Kafka는 Record를 디스크에 저장하여 영속성을 보장하는데, Disk I/O wait을 줄이기 위하여 적극적으로 페이지 캐시를 사용한다.
이러한 특성 상 Kafka 노드는 쓰기 횟수에 제한이 있는 SSD보다는 RAID 구성의 HDD를 사용하고, 넉넉한 메모리를 확보해야 정상적인 동작을 보장할 수 있다.

Kafka의 분산 처리 매커니즘을 이해하기 위해서는 Partition과 Offset 개념을 알아야 하는데, 이것은 나중에 다시 설명하도록 하겠다.

 

여하튼 Kafka를 브로커로 끼워넣으면, 다음과 같은 시스템이 완성된다.

Telegraf(로그 수집기) -> Kafka(로그 브로커) -> Logstash(로그 가공) -> ElasticSearch(로그 저장/분석) -> Kibana(대시보드)

이 때, Kafka의 입장에서 Telegraf는 Producer, Logstash는 Consumer가 된다.
그리고 Topic에 저장되는 로그의 주인을 식별하기 위해, hostname을 사용할 것이다.

 

이제 데모를 위해 Kafka를 설치하고, 클러스터를 구성한 뒤 Topic을 생성해 볼 것이다.

 

1. Kafka 설치, Zookeeper 설정/실행

Kafka는 구동을 위해 Java를 필요로 한다. Kafka Ver 2.1부터 Java 11을 지원하기 때문에 java11-openjdk를 설치할 것이다.

다음으로 Kafka 다운로드 페이지에서 Kafka의 다운로드 경로를 얻은 뒤 압축을 푼다.

적당한 폴더에 압축을 풀었으면, 먼저 ZooKeeper를 설정한다. Kafka의 실행을 위해서는 ZooKeeper가 실행되어 있어야 하기 때문이다.
여기서는 Kafka에 포함되어 있는 ZooKeeper를 사용한다. 실제 서비스에서는 ZooKeeper를 별도로 유지하는 편이 좋을 것이다.

이제 /bin/zookeeper-server-start.sh <ZooKeeper Config>를 통해 ZooKeeper를 실행할 수 있다.

ZooKeeper의 동작 확인은 다음과 같은 명령어로 가능하다.

서버가 정상적으로 동작한다면, 위와 같은 화면을 볼 수 있을 것이다.

 

2. Kafka 설정/실행

ZooKeeper가 정상 동작하는 것을 확인하였으니, 이제 Kafka를 설정할 차례다.

먼저, Kafka의 config를 수정한다.

Kafka의 설정이 완료되었으면

명령으로 Kafka Server를 실행할 수 있다.

Kafka 클러스터를 실행하였다면 클러스터에 Topic을 추가할 수 있다.
여기서는 ‘test’ 토픽을 추가할 것이다.

이 때, 하나의 노드에서 만들어진 Topic은 전체 클러스터와 동기화되며, 클러스터의 모든 브로커로부터 Pub/Sub가 가능하다.

이와 같이 3번 노드에서 생성한 ‘test’ 토픽을 2번 노드에서 확인할 수 있다.