Commit e55eb919 authored by JooHan Hong's avatar JooHan Hong

kafka, setup init

parent 42550fb7
Pipeline #5737 passed with stages
in 1 minute and 3 seconds
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# 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 설치 및 구성
1. 설치 및 다운로드
```bash
[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
```
2. 설정 및 데몬 기동
```bash
[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**로 데몬을 제어하고 싶은 경우 다음과 같이 별도로 생성해야 한다.
```bash
[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하고 시작한 후 활성화 한다.
```bash
[node N]# systemctl daemon-reload
[node N]# systemctl start zookeeper.service
[node N]# systemctl enable zookeeper.service
```
!참고 : 만약 systemd를 사용하지않고, Zookeeper에서 기본적으로 제공하는 스크립트를 이용하려면, 다음과 같이 한다.
```bash
[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
```
3. 설치후 기본 구성 확인
아래와 같이 클러스터의 상태를 보면, 현재 2번 노드가 **리더**인 것을 확인할 수 있다.
```bash
[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 명령을 통해서 확인할 수 있다.
```bash
# 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는 실시간으로 기록 스트림을 게시, 구독, 저장 및 처리할 수 있는 분산 데이터 스트리밍 플랫폼 이다.
그럼, 다음과 같이 설치 및 구성을 진행 한다.
1. 설치 파일 다운로드
```bash
[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
```
2. 설치 구성 및 데몬 기동
```bash
[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 기반으로 한다.
```bash
[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하고 시작한 후 활성화 한다.
```bash
[broker N]# systemctl daemon-reload
[broker N]# systemctl start kafka.service
[broker N]# systemctl enable kafka.service
```
!참고 : 만약 systemd를 사용하지않고, Kafka에서 기본적으로 제공하는 스크립트를 이용하려면, 다음과 같이 한다.
```bash
[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
```
3. 설치 후 기본 구성 확인
설치된 **Kafka의 버전**은 다음과 같이 확인할 수 있다.
```bash
[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
```
그리고 클러스터에 **브로커의 리스트**는 다음과 같이 확인할 수 있다.
```bash
[broker 1]# bin/kafka-broker-api-versions.sh --bootstrap-server 172.24.0.171:9092 | grep id | awk '{print $(NF-6)}'
브로커01:9092
브로커02:9092
브로커03:9092
[broker 2]# bin/kafka-broker-api-versions.sh --bootstrap-server 172.16.0.172:9092 | grep id | awk '{print $(NF-6)}'
브로커01:9092
브로커02:9092
브로커03:9092
[broker 3]# bin/kafka-broker-api-versions.sh --bootstrap-server 172.24.0.173:9092 | grep id | awk '{print $(NF-6)}'
브로커01:9092
브로커02:9092
브로커03:9092
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment