Zookeeper Overview
Zookeeper(주키퍼)는 분산 어플리케이션들을 위한 오픈 소스 분산 관리 서비스 이다. 다른 말로는 분산 코디네이터라고 한다. 따라서 Kafka 클러스터 도입을 위해 반드시 설치해야하는 솔루션 이다.
Zookeeper는 전체 Node의 과반수가 살아있는 시점까지는 Fault Tolerance를 보장한다. 따라서 최소의 Node 수는 3 대
이다.
-
3 Node
에서는 1대 Server의 Fault에 대한 Fault Tolerance를 보장 -
4 Node
역시 1대 Server의 Fault에 대한 Fault Tolerance를 보장
!중요
: 위의 구성에 따라 시스템을 홀수로 구성하는 것이 권장
Zookeeper 설치 및 구성
- 설치 및 다운로드
[node N]# yum install -y java-11-openjdk.x86_64
[node N]# wget --no-check-certificate https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0.tar.gz
[node N]# tar zxvf apache-zookeeper-3.7.0-bin.tar.gz
[node N]# mv apache-zookeeper-3.7.0-bin /usr/local/zookeeper
[node N]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
[node N]# cd /usr/local/zookeeper
- 설정 및 데몬 기동
[node N]# cat conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper
dataLogDir=/var/log/zookeeper
clientPort=2181
4lw.commands.whitelist=*
server.1=서버01:2888:3888
server.2=서버02:2888:3888
server.3=서버03:2888:3888
[node N]# mkdir -p /var/lib/zookeeper /var/log/zookeeper
[node 1]# echo 1 > /var/lib/zookeeper/myid
[node 2]# echo 2 > /var/lib/zookeeper/myid
[node 3]# echo 3 > /var/lib/zookeeper/myid
만약 systemd로 데몬을 제어하고 싶은 경우 다음과 같이 별도로 생성해야 한다.
[node N]# cat /etc/systemd/system/zookeeper.service
[Unit]
Description=zookeeper-server
After=network.target
[Service]
Type=forking
User=root
Group=root
SyslogIdentifier=zookeeper-server
WorkingDirectory=/usr/local/zookeeper
Restart=always
RestartSec=0s
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
마지막으로 위의 service 파일을 flush하고 시작한 후 활성화 한다.
[node N]# systemctl daemon-reload
[node N]# systemctl start zookeeper.service
[node N]# systemctl enable zookeeper.service
!참고 : 만약 systemd를 사용하지않고, Zookeeper에서 기본적으로 제공하는 스크립트를 이용하려면, 다음과 같이 한다.
[node N]# ./bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
* 중지의 경우는
[node N]# ./bin/zkServer.sh stop
- 설치후 기본 구성 확인
아래와 같이 클러스터의 상태를 보면, 현재 2번 노드가 리더인 것을 확인할 수 있다.
[node 1]# ./bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[node 2]# ./bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
[node 3]# ./bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
주키퍼의 통계는 다음과 같이 간략하게 telnet 명령을 통해서 확인할 수 있다.
# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.8.0-5a02a05eddb59aee6ac762f7ea82e92a68eb9c0f, built on 2022-02-25 08:49 UTC
Latency min/avg/max: 0/0.0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: follower
Node count: 5
Connection closed by foreign host.
Kafka 설치 및 구성
Kafka는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼 이다.
그럼, 다음과 같이 설치 및 구성을 진행 한다.
- 설치 파일 다운로드
[broker N]# wget --no-check-certificate https://archive.apache.org/dist/kafka/3.0.1/kafka_2.13-3.0.1.tgz
[broker N]# tar xvf kafka_2.13-3.0.1.tgz
[broker N]# mv kafka_2.13-3.0.1 /usr/local/kafka
[broker N]# mv /usr/local/kafka/config/server.properties /usr/local/kafka/config/server.properties_src
- 설치 구성 및 데몬 기동
[broker 1]# cat server.properties
broker.id=1
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://브로커01:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/var/lib/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=주키퍼01:2181,주키퍼02:2181,주키퍼03:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
[broker 2]# cat server.properties
broker.id=2
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://브로커02:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/var/lib/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=주키퍼01:2181,주키퍼02:2181,주키퍼03:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
[broker 3]# cat server.properties
broker.id=3
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://브로커03:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/var/lib/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=주키퍼01:2181,주키퍼02:2181,주키퍼03:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
[broker N]# mkdir /var/lib/kafka
!중요
- num.partitions=1
파티션 개수에 대한 설정이다. 이는 토픽 생성 시 이 설정과 반드시 같아야 문제가 발생되지 않는다.
- offsets.topic.replication.factor=3
리플리케이션 개수에 대한 설정이다. 이는 토픽 생성 시 이 설정과 반드시 같아야 문제가 발생되지 않는다.
- transaction.state.log.replication.factor=3
리플리케이션 개수에 대한 설정이다. 이는 토픽 생성 시 이 설정과 반드시 같아야 문제가 발생되지 않는다.
데몬의 경우 다음과 같이 systemd 기반으로 한다.
[broker N]# cat /etc/systemd/system/kafka.service
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/bin/sh -c '/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties > /usr/local/kafka/kafka.log 2>&1'
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
마지막으로 위의 service 파일을 flush하고 시작한 후 활성화 한다.
[broker N]# systemctl daemon-reload
[broker N]# systemctl start kafka.service
[broker N]# systemctl enable kafka.service
!참고 : 만약 systemd를 사용하지않고, Kafka에서 기본적으로 제공하는 스크립트를 이용하려면, 다음과 같이 한다.
[broker N]# mkdir /var/lib/kafka
[broker N]# pwd
/usr/local/kafka
[broker N]# bin/kafka-server-start.sh -daemon config/server.properties
*중지
[broker N]# bin/kafka-server-stop.sh
- 설치 후 기본 구성 확인
설치된 Kafka의 버전은 다음과 같이 확인할 수 있다.
[broker N]# find /usr/local/kafka/ -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*' | awk -F'-' {'print $2'} | cut -d '.' -f 1-3
3.0.1
그리고 클러스터에 브로커의 리스트는 다음과 같이 확인할 수 있다.
[broker 1]# bin/kafka-broker-api-versions.sh --bootstrap-server 브로커01:9092 | grep id | awk '{print $(NF-6)}'
브로커03:9092
브로커02:9092
브로커01:9092
[broker 2]# bin/kafka-broker-api-versions.sh --bootstrap-server 브로커02:9092 | grep id | awk '{print $(NF-6)}'
브로커02:9092
브로커03:9092
브로커01:9092
[broker 3]# bin/kafka-broker-api-versions.sh --bootstrap-server 브로커03:9092 | grep id | awk '{print $(NF-6)}'
브로커03:9092
브로커01:9092
브로커02:9092