Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

Zookeeper 설치 방법 - 앙상블 (ensemble) 구성 본문

Kafka, MSK, Kinesis/아키텍처 및 내부 구조

Zookeeper 설치 방법 - 앙상블 (ensemble) 구성

`O` 2025. 6. 15. 23:22
728x90
반응형

 

이 페이지에서는 Kafka 를 설치하기 위해 필요한 zookeeper 를 앙상블 (ensemble) 클러스터 단위로 설치하는 방법에 대해서 다룬다. 이 게시글은 아래의 게시글에 이어지는 글이기에 이전 글을 먼저 읽는 것을 권장한다.

 

[+] 2025.06.13 - [Kafka, MSK, Kinesis/아키텍처 및 내부 구조] - Zookeeper 설치 방법 - 기본설치

 

또한 설치하는 방법에 추가로 덧붙일 내용은 ※ 로 추가한다.

 

Zookeeper 의 기본설치 방법을 확인했다면 이제 실제 운영환경에서의 Zookeeper 의 고가용성도 고려 할 수 있다.

Zookeeper 는 이를 앙상블 (ensemble) 이라는 클러스터 개념으로 구현한다. 이에 대한 정보는 AI 검색을 하면 더 상세한 정보를 확인 해 볼 수 있다.

 

[Zookeeper 앙상블에 대해서 알려줘]

 

 

ZooKeeper 앙상블(Ensemble)이란?

ZooKeeper 앙상블은 여러 대의 ZooKeeper 서버가 하나의 클러스터를 이루어 동작하는 구조를 의미합니다. 이 구조는 고가용성(HA)과 데이터 일관성을 보장하기 위해 사용됩니다. 앙상블 내의 ZooKeeper 서버들은 서로 복제(replication) 및 동기화(synchronization)를 하며, 분산 시스템의 신뢰성과 안정성을 높입니다145.


주요 특징 및 구조

  • Leader-Follower 구조
    앙상블에는 반드시 한 대의 Leader와 여러 대의 Follower가 존재합니다.
    • Leader: 모든 쓰기(Write), 업데이트(Update), 삭제(Delete) 요청을 처리합니다.
    • Follower: Leader의 복제본 역할을 하며, 주로 읽기(Read) 요청을 처리하고 Leader의 명령에 따라 데이터를 동기화합니다157.
  • 리더 선출(Leader Election)
    서버가 시작되면 자동으로 리더 선출 과정이 진행됩니다. 리더가 장애가 나면 나머지 서버 중 하나가 새로운 리더로 선출됩니다15.
  • 쿼럼(Quorum) 기반 합의
    ZooKeeper 앙상블은 과반수(쿼럼) 이상의 서버가 동작해야 쓰기 작업이 가능합니다. 예를 들어, 3대 앙상블이면 2대 이상이 살아 있어야 정상 동작합니다4710.
  • 홀수 개 서버 권장
    쿼럼 구조상 서버 수는 홀수(3, 5, 7...)로 구성하는 것이 일반적입니다. 짝수로 구성해도 되지만, 장애 허용 범위와 쿼럼 계산상 효율이 떨어집니다2347.

앙상블의 동작 방식

  • 쓰기(Write) 요청:
    모든 쓰기 요청은 리더에게 전달되어, 리더가 팔로워들에게 제안(Propose) 후 과반수(쿼럼) 이상의 승인(ACK)을 받으면 커밋(Commit)합니다. 이 과정에서 데이터 일관성이 보장됩니다5.
  • 읽기(Read) 요청:
    팔로워 서버에서도 읽기 요청을 처리할 수 있으나, 강한 일관성이 필요한 경우 리더를 통해 읽기도 가능합니다.
  • 장애 허용:
    예를 들어 3대 앙상블이면 1대가 장애 나도 2대가 살아 있으면 정상 동작합니다. 5대면 2대까지 장애 허용410.

ZooKeeper 앙상블 구성 예시

tickTime=2000 
dataDir=/data 
clientPort=2181 
initLimit=10 
syncLimit=5 
server.1=zk01:2888:3888 
server.2=zk02:2888:3888 
server.3=zk03:2888:3888
  • 각 서버는 고유한 myid(1, 2, 3 등)를 부여받아야 하며, 설정 파일에 서버 정보를 명시합니다68.

ZooKeeper 앙상블의 활용

  • Kafka, HBase, ClickHouse 등 다양한 분산 시스템에서 메타데이터 관리, 클러스터 상태 동기화 등에 필수적으로 사용됩니다57.
  • 앙상블이 구성되어 있으면 한 대의 ZooKeeper 서버가 장애 나더라도 서비스가 중단되지 않고 지속적으로 동작할 수 있습니다10.

요약

  • ZooKeeper 앙상블은 여러 대의 ZooKeeper 서버로 구성된 클러스터
  • Leader-Follower 구조, 리더 선출, 쿼럼 기반 합의 방식
  • 서버 수는 홀수로 구성 권장(최소 3대)
  • 고가용성, 장애 허용, 데이터 일관성 보장
  • Kafka 등 다양한 분산 시스템에서 필수적으로 사용

앙상블 구조 덕분에 ZooKeeper는 분산 환경에서 신뢰성과 안정성을 확보할 수 있으며, 실제 운영 환경에서는 반드시 앙상블로 구성하는 것이 표준입니다145710.

  1. https://westlife0615.tistory.com/487
  2. https://data-engineer-tech.tistory.com/8
  3. https://mr-spock.tistory.com/58
  4. https://yooloo.tistory.com/102
  5. https://sungchul-p.github.io/zookeeper-on-k8s
  6. https://namsick96.github.io/zookeper/zookeeper-ensemble-start-withaws/
  7. https://jh-labs.tistory.com/391
  8. https://cornswrold.tistory.com/527
  9. https://velog.io/@moon_happy/%EC%A3%BC%ED%82%A4%ED%8D%BC%EB%8A%94-%EB%AD%98%EA%B9%8C
  10. https://d2.naver.com/helloworld/583580

 

※ Quorum 은 AWS Aurora Cluster 의 장애 관리 logic 에도 쓰이는 개념이므로 Aurora Cluster 도 같이 이용하는 사용자라면 같이 알아 두면 좋다.

 

※ 앙상블은 합의 프로토콜로 운영됨에 따라 이와 연관되는 성능을 고려 시, 9대 이내의 서버로 구성되는 것이 권장된다. (출처 : O'REILLY - '카프카 핵심 가이드' 

 

※ 위의 예시는 3대의 서버로 앙상블을 구성 하는 예시며, 이때 사용되는 config 명령문은 server.{x}={hostname}:{peerPort}:{leaderPort} 로 정의된다. 이 때, x 는 서버ID, hostname 은 서버의 호스트명 또는 IP 주소, peerPort 는 각 서버간 통신을 할 때 사용할 TCP port, leaderPort 는 리더를 선출하는 데 사용할 TCP port 번호다. 이 때, client 는 clientPort 에 지정된 port 만 사용해도 되지만 앙상블 구성 서버들은 이 3개의 port 를 모두 사용 할 수 있어야 한다.

 

※ 모든 앙상블 서버의 dataDir 디렉토리에는 myid 라는 이름의 파일에 각 서버 ID 번호를 가지고 있어야하며 이를 통해 앙상블간 통신이 가능하다.

 

실제 운영환경에서는 3개의 독립적인 서버에 zookeeper 를 설치해 이를 구현하나, 테스트환경에서는 한대의 서버 또는 클라우드 instance 에 아래의 방법으로 구현 할 수 있다.

 

1대의 EC2 에 3개의 node 로 앙상블 구현하기

 

먼저, 아래와 같이 3개의 node 가 이용될 data 디렉토리, zoo.cfg, myid 를 구성해야한다.

 

# 각 node 가 사용할 data 디렉토리 생성, 필자는 /home/ec2-user/ 디렉토리에 생성한다.

$ mkdir zookeeper1
$ mkdir zookeeper2
$ mkdir zookeeper3

# 기본 설치에서 사용했던 zoo.cfg 를 각 디렉토리에 복사 후, 각 환경에 맞게 수정한다.

$ cp zoo.cfg ~/zookeeper1/zoo.cfg
$ cp zoo.cfg ~/zookeeper2/zoo.cfg
$ cp zoo.cfg ~/zookeeper3/zoo.cfg

# 각 노드의 zoo.cfg 를 수정시, 한대의 ec2 에서 모든 node 를 구성하려면 아래와 같이 dataDir, clientPort 및 통신 Port 가 달라야한다.

[zookeeper1 - zoo.cfg]

tickTime=2000
dataDir=/home/ec2-user/zookeeper1/data
clientPort=2181
initLimit=20
syncLimit=5
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

[zookeeper2 - zoo.cfg]

tickTime=2000
dataDir=/home/ec2-user/zookeeper2/data
clientPort=2182
initLimit=20
syncLimit=5
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

[zookeeper3 - zoo.cfg]

tickTime=2000
dataDir=/home/ec2-user/zookeeper3/data
clientPort=2183
initLimit=20
syncLimit=5
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883

# 각 data directory 에 myid 파일 생성및 ID 를 순차적으로 1,2,3 을 부여 (이 번호는 사용자가 임의로 지정 가능)


$cat ~/zookeeper1/data/myid
1
$cat ~/zookeeper2/data/myid
2
$cat ~/zookeeper3/data/myid
3

 

해당 사항을 작성하면 이제 순차적으로 아래의 명령어들로 각 node 를 실행하면 된다.

 

$cd  ~/apache-zookeeper-3.8.4-bin/bin

$ sh zkServer.sh start /home/ec2-user/zookeeper1/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper1/zoo.cfg
Starting zookeeper ... STARTED
$ sh zkServer.sh start /home/ec2-user/zookeeper2/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper2/zoo.cfg
Starting zookeeper ... STARTED
$ sh zkServer.sh start /home/ec2-user/zookeeper3/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/ec2-user/zookeeper3/zoo.cfg
Starting zookeeper ... STARTED

 

3개의 node 가 모두 실행되면 이전 게시글의 test 과정 처럼 telnet 을 통해 접속을 수행 및 Mode 가 leader 인지, follower 인지 확인한다.

 

$ telnet localhost 2181
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: follower
Node count: 5
Connection closed by foreign host.

$ telnet localhost 2182
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: leader
Node count: 5
Proposal sizes last/min/max: -1/-1/-1
Connection closed by foreign host.

$ telnet localhost 2183
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 2024-02-12 22:16 UTC
Latency min/avg/max: 0/0.0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 5
Connection closed by foreign host.
728x90
반응형
Comments