Programming Insight 2015.03.18 19:31

Kafka 클러스터의 모든 분산 처리는 Zookeeper를 매개로 이루어 지기 때문에, Kafka가 사용하는 Zookeeper 트리의 구조를 파악하면 Kafka 클러스터의 동작 방식을 이해하는데 큰 도움이 된다. 아래의 그림은 Kafka가 사용하는 Zookeeper 트리의 주요 노드를 정리해 놓은 것이다. 좀 더 상세한 정보는 Kafka Wiki의 Kafka data structures in Zookeeper를 참조하길 바란다.


Zookeeper CLI로 Zookeeper 트리 탐색하기

Zookeeper 트리는 파일 시스템의 디렉토리 구조와 비슷하기 때문에 Zookeeper 패키지에 포함되어 있는 zkCli.sh라는 CLI 툴을 사용하여 디렉토리를 탐색하듯이 ls 명령어를 통해 Zookeeper 트리를 탐색할 수 있다. (Kafka 패키지에도 이와 비슷한 zookeeper-shell.sh가 들어있는데 자동 완성이나 히스토리 기능이 제공되지 않으므로 이를 제공하는 zkCli.sh를 사용하는 것을 권장한다.)


우선 아래의 커맨드를 통해 Zookeeper에 접속한다.

bin/zkCli.sh -server kafka-test-001.epicdevs.com:2181

Zookeeper에 접속하게 되면 여러가지 명령어를 통해 트리 탐색 및 조작이 가능하다. help 명령어를 사용하면 전체 명령어 리스트를 확인할 수 있다.

간단하게는 ls 명령어를 사용하면 트리의 노드를 탐색할 수 있고, get 명령어를 사용하면 노드에 저장된 값을 읽어올 수 있다(위 그림의 사각형 노드).


예를 들어

ls /brokers/ids

를 입력하면

[3, 2, 1]

라는 broker ID에 해당하는 하위 노드 리스트가 출력되고


get /consumers/test-group/offsets/test/0

를 입력하면

2574

라는 offset 값이 출력된다.


zkCli.sh에 대한 상세한 가이드는 ZooKeeper Getting Started Guide를 참조하길 바란다.


참고자료


신고
Trackback 0 Comment 2
  1. keultae 2015.07.29 23:25 신고

    이중화를 지원하는 메시지큐를 찾다가 여기까지 방문을 했는데, 글을 이해하기 쉽게 잘 정리해주셔서 정말 고맙습니다.
    여기 오기전까지는 ActiveMQ를 사용할려고 생각하고 있었는데, 글을 읽으니 카프카를 쓰는게 더 좋을것 같다는 생각이 드네요.

    카프카가 주키퍼를 사용하면 이중화를 위해서 반드시 홀수로 설치를 해야하는 건가요?
    실제 업무에서 이중화를 할떄는 대부분 장비 2대를 사용하게 되는데, 주키퍼와 관련된 글을 읽으면 꼭 홀수로 설치를 해야한다고 나와있어서 2대로 이중화를 할 수는 없는지 궁금합니다.

    검색을 해보니 카프카가 자바와 스칼라로 개발이 되어 있다고 나와 있는데, 설치할때는 JVM만 있으면 되는건가요? 제가 아직 스칼라를 써본적이 없어서 여쭤봅니다.

    저는 구로디지탈단지역 근처에서 근무하는데, 가까운곳에 계시면 무더위 이기시고 좋은글 계속 써주시라고 삼계탕을 대접하고 싶네요.

    • epicdev 2015.07.31 23:15 신고

      주키퍼 클러스터에 어떤 값을 쓸 때, 클러스터 내의 모든 노드에 대해 쓰기를 요청하여 과반(majority) 노드가 쓰기에 성공하면 쓰기가 성공한 것으로 간주합니다. 즉, 3개의 노드로 구성된 클러스터는 2개 이상, 5개의 노드로 구성된 클러스터는 3개 이상의 노드에 쓰기가 성공하면 되는 것입니다.

      따라서 3개의 노드로 이루어진 클러스터는 1개의 노드가 문제가 발생하여도 나머지 2개의 노드에서 성공하면 과반을 이룰 수 있기 때문에 클러스터엔 문제가 발생하지 않으며, 5개의 노드로 이루어진 클러스터도 이와 마찬가지로 3개의 노드에서 쓰기가 성공하면 과반을 이룰 수 있기 때문에 2개의 노드에서 문제가 발생하여도 정상적으로 동작하는 것입니다.

      그런데 만약 클러스터를 2개의 노드로 구성할 경우 1개의 노드만 문제가 발생하여도 나머지 노드가 과반을 이룰 수 없고, 4개로 할 경우 1개의 노드에 문제가 발생한 것은 버틸 수 있으나 2개의 노드에 문제가 발생한 것은 나머지 노드가 과반을 이룰 수 없기 때문에 클러스터에 문제가 발생합니다. 즉, 노드 4개로 구성된 클러스터는 노드 3개로 구성된 클러스터의 fault tolerance와 동일하기 때문에, 굳이 노드를 하나 더 추가하지 않는 것입니다.

      요약하자면, 주키퍼 클러스터를 2N + 1개의 노드로 구성하면 2N + 2개의 노드를 지닌 클러스터와 fault tolerance에서 차이가 없기 때문에 2N + 1의 노드로 클러스터를 구성하는 것입니다.