Apache Kafka – A high-throughput distributed messaging system

1. Apache Kafka?

LinkedIn에서 자사의 내부 데이터 처리를 위해 개발한 대용량 분산 메세징 시스템 입니다.

Kafka는 확장이 용이하고, 높은 처리량과 분산처리를 할수 있으며, In-Memory에 비해 뒤지지 않는 성능과 비휘발성으로 데이터를 디스크 저장 한다는 장점이 있습니다.

Kafka를 활용하는 대표적인 기업으로는 LinkedIn, Twitter, Netflix, Tumblr, Foursquare가 사용하는 것으로 알고 있으며, 그 외에도 대용량 메세징을 다루는 기업에서 활용 중인걸로 알고 있습니다.

처리할 로그와 메세지들은 넘쳐나고, 안전을 생각하자니 In-Memory는 안될 것 같고, 디스크로 처리 하자니 성능이 발목을 잡고.. 이런 걱정 하시는 분들에게 좋은 솔루션인듯 합니다.

 

2. Kafka Architecture

Kafka는 Producer, Broker, Consumer로 나누어져 있고, 시스템에서 발생 되는 메세지를 topic으로 분류 하고 있습니다.

이해를 돕기 위해 아래 그림을 통해 원리를 알아보도록 하겠습니다.

Apache-Kafka-Architecture

Figure 1. Kafka Architecture

3. 실제 구성
위의 Architecture를 토대로 실제로 구성 해보면서 이해를 해보도록 하겠습니다.

서버는 총 9대로 producer 3대, broker 3대, consumer 3대로 구성하겠습니다.

각각의 서버의 Hostname, IP는 아래와 같습니다.

 

3.1. 공통 설정

– Hostname 별칭 설정
producer와 consumer에서 이 부분이 설정 되어있지 않으면, https://gist.github.com/ruo91/980719a9f7e1f7ef72c5 와 같은 에러를 만나 볼수 있으며, 특히 topic을 생성시에 무한대의 Exception 에러를 만나 보실수 있습니다. ㅋㅋ

 

– JDK 설치

 

– Kafka 설치
Kafka 0.8.1.1 버전을 사용하겠습니다.

 

3.2. Broker
Broker에서는 config/zookeeper.properties, config/server.properties 설정 파일을 수정 합니다.

– ZooKeeper 설정
기존에 kafka에서 포함 되어 있는 config/zookeeper.properties 설정 파일에는 tickTime, initLimit, syncLimit 옵션들이 빠져 있습니다.
이 옵션들을 추가하고, 동일한 standalone 형태의 ZooKeeper들을 복제 모드로 설정 합니다.

 

데이터 디렉토리를 변경하고, 복제 모드로 설정을 합니다.

 

ZooKeeper 서버들에게 myid 번호를 부여 합니다.
kafka-broker-1의 경우 myid는 1, kafka-broker-2의 경우 myid는 2, kafka-broker-3의 경우 myid는 3으로 설정 합니다.

 

– Broker 설정
config/server.properties의 broker.id를 설정합니다.
kafka-broker-1에는 1, kafka-broker-2에는 2, kafka-broker-3에는 3으로 변경 합니다.

 

Broker의 partition 및 서버 로그가 생성 될 디렉토리를 변경 합니다.

 

ZooKeeper 서버들을 추가 합니다.

 

– ZooKeeper 실행

 

– Broker 실행
Broker 서버를 실행과 동시에 kafka-broker-1 서버가 리더로 선출된 것을 확인 할수 있고, 나머지 kafka-broker-2, 3은 Follower로써 역할을 수행하게 됩니다.

 

3.3. Producer
config/producer.properties 설정 파일의 metadata.broker.list에 Broker 서버들을 추가 합니다.

 

– Topic 생성
producer-1, 2, 3의 topic을 생성 합니다.

 

– Topic 확인

 

Topic, Partition, Replication Factor 정보 확인

 

– Producer 실행

 

3.4. Consumer
config/consumer.properties 설정 파일의 zookeeper.connect에 ZooKeeper 서버들을 추가 합니다.

 

– Consumer 실행
구독(Subscribe)할 Topic을 지정하여 실행 합니다.

 

4. 테스트
위 구성을 통해 실제로 producer 서버에서 메세지를 발생시켜, consumer가 메세지를 받을수 있는지 확인 해보겠습니다.

– Producer
kafka-producer-1의 topic은 producer-1, kafka-producer-2의 topic은 producer-2, kafka-producer-3의 topic은 producer-3으로 지정하여 실행 하고,
메세지를 발생 시킵니다.

apache_kafka_producer

Figure 2. Apache Kafka Producer

– Consumer
Producer와 마찬가지로 각각의 topic을 지정하여 실행하여, Broker로 부터 메세지를 받아 오는지 확인 합니다.

apache_kafka_consumer

Figure 3. Apache Kafka Consumer

5. 참고
http://kafka.apache.org/documentation.html
http://www.infoq.com/articles/apache-kafka
http://www.slideshare.net/search/slideshow?searchfrom=header&q=apache+kafka
http://www.michael-noll.com/blog/2013/03/13/running-a-multi-broker-apache-kafka-cluster-on-a-single-node/