DB & AWS Knowledge
Zookeeper 설치 방법 - 앙상블 (ensemble) 구성 본문
이 페이지에서는 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 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
ZooKeeper 앙상블의 활용
- Kafka, HBase, ClickHouse 등 다양한 분산 시스템에서 메타데이터 관리, 클러스터 상태 동기화 등에 필수적으로 사용됩니다57.
- 앙상블이 구성되어 있으면 한 대의 ZooKeeper 서버가 장애 나더라도 서비스가 중단되지 않고 지속적으로 동작할 수 있습니다10.
요약
- ZooKeeper 앙상블은 여러 대의 ZooKeeper 서버로 구성된 클러스터
- Leader-Follower 구조, 리더 선출, 쿼럼 기반 합의 방식
- 서버 수는 홀수로 구성 권장(최소 3대)
- 고가용성, 장애 허용, 데이터 일관성 보장
- Kafka 등 다양한 분산 시스템에서 필수적으로 사용
앙상블 구조 덕분에 ZooKeeper는 분산 환경에서 신뢰성과 안정성을 확보할 수 있으며, 실제 운영 환경에서는 반드시 앙상블로 구성하는 것이 표준입니다145710.
- https://westlife0615.tistory.com/487
- https://data-engineer-tech.tistory.com/8
- https://mr-spock.tistory.com/58
- https://yooloo.tistory.com/102
- https://sungchul-p.github.io/zookeeper-on-k8s
- https://namsick96.github.io/zookeper/zookeeper-ensemble-start-withaws/
- https://jh-labs.tistory.com/391
- https://cornswrold.tistory.com/527
- https://velog.io/@moon_happy/%EC%A3%BC%ED%82%A4%ED%8D%BC%EB%8A%94-%EB%AD%98%EA%B9%8C
- 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.
'Kafka, MSK, Kinesis > 아키텍처 및 내부 구조' 카테고리의 다른 글
Kafka server.property (config 설정) 관련 옵션들 - 1 (0) | 2025.07.01 |
---|---|
Kafka Broker 설치 방법 (0) | 2025.06.16 |
Zookeeper 설치 방법 - 기본설치 (0) | 2025.06.13 |
Zookeeper 개요 (0) | 2025.05.24 |
Kafka 기본 요소들에 대한 추가 이해 - 2 (0) | 2025.05.21 |