본문 바로가기
Book

[카프카, 데이터 플랫폼의 최강자] 6장. 카프카 운영 가이드

by Jordy-torvalds 2021. 9. 29.
반응형

개요

이번 장에서는 알아볼 내용은 다음과 같습니다.

  • 카프카 운영 환경에서 빈번하게 사용되는 명령어
  • 클러스터 확장을 위해 필요한 주키퍼와 카프카 스케일 아웃 방법
  • JMX를 사용한 카프카 모니터링 방법
  • 카프카를 GUI 도구로 관리할 수 있는 카프카 매니저 활용법

필수 카프카 명령어

기본적인 명령어는 ../kafka/bin 에서 확인할 수 있습니다.

토픽 설정 명령어들

# <, > 특수문자 안에 넣을 값은 카프카 클러스터, 주키퍼 클러스터 환경과 운영 목적에 따라
# 유동적으로 정해주시면 됩니다.

# 토픽 생성 명령어
../kafka/bin/kafka-topics.sh \
--zookeeper **<zk-host1:zk-port1,...,zk-hostn:zk-portn>/<znode-name>\**
--replication-factor **<replication-factor-count>** --partitions **<partiton-count> \**
--topic **<topic-name>** --create

# 토픽 생성 결과
Creadted topic **"<topic-name>".**

# 토픽 목록 조회 명령어
../kafka/bin/kafka-topics.sh \
--zookeeper **<zk-host1:zk-port1,...,zk-hostn:zk-portn/<znode-name>\**
--list

# 토픽 목록 조회 결과
__consumer_offsets
<topic-name>

# 토픽 상세보기 명령어
../kafka/bin/kafka-topics.sh \
--zookeeper **<zk-host1:zk-port1,...,zk-hostn:zk-portn/<znode-name>\**
--topic **<topic-name>** --describe

# 토픽 상세보기 결과
Topic:**<topic-name>** PatitionCount: **<partiton-count>** ReplicationFactor: **<Replication...**
Configs: ****Topic:**<topic-name>** Partitions: **<Partition-index>** Leader: **<Kafka Leader id>** 
Replicas: **<Kafka id>** Isr: **<Kafka id>**

# 토픽 보관주기 설정 명령어
../kafka/bin/kafka-configs.sh \
--zookeeper **<zk-host1:zk-port1,...,zk-hostn:zk-portn/<znode-name>\
--**alter --entity-types topic --entity-name **<topic-name>** \
--add-config retention.ms=3600000

# 토픽 보관주기 설정 삭제 명령어
../kafka/bin/kafka-configs.sh \
--zookeeper **<zk-host1:zk-port1,...,zk-hostn:zk-portn/<gnode-name>\
--**alter --entity-types topic --entity-name **<topic-name>** \
--delete-config retention.ms=3600000

# 토픽 파티션 수 변경 명령어
## 토픽 파티션 수는 증가만 가능하고 줄이는 것은 불가능
## 정확한 판단이 어렵다면 최소한의 숫자로 생성해두고 필요시 점차적으로 늘려나가는 것을 추천
## 프로듀서 ㅡ 파티션 ㅡ 컨슈머의 수가 전반적으로 함께 상승해야 성능이 좋아짐.
## 파티션수만 늘리는 것은 성능 향상에 도움이 되지 않음.
## 또한 파티션 수를 늘리는 것이 메시지 순서에 영향을 줄 수 있음.
../kafka/bin/kafka-topics.sh \
--zookeeper **<zk-host1:zk-port1, ... ,zk-hostn:zk-portn/<gnode-name>\**
--alter --topic **<topic-name>** --partitions **<partition-count>**

# 토픽 리플리케이션 팩터 변경
## 토픽의 리플리케이션 팩터를 변경하려면 json 형식의 파일 작성 필요
## 토픽 명은 jordy-meal-menu, 파티션은 2개, 레플리케이션 팩터 2개라고 가정
## 0번 파티션은 브로커 1, 2번에 할당 / 1번 파티션은 브로커 2, 3번에 할당함.

## 리플리케이션 팩터 변경을 위한 json 파일 작성
## file-name : jordy-meal-menu-rf-detail.json
{"version": 1,
"partitions" : [
        {"topic":"jordy-meal-menu", "partitions":0,"replicas":[1,2]},
        {"topic":"jordy-meal-menu", "partitions":1,"replicas":[2,3]}
]}

## 명령어 실행
../kafka/bin/kafka-reassign-partitions.sh \
--zookeeper **<zk-host1:zk-port1,...,zk-hostn:zk-portn/<gnode-name>\**
--reassignment-json-file jordy-meal-menu-rf-detail.json --execute

## 토픽 상세보기로 결과 확인!

# 컨슈머 그룹 리스트 확인
../kafka/bin/kafka-consumer-groups.sh \
--bootstrap-server **<kafka-host1:kafka-port1,...,kafka-hostn:kafka-portn\**
--list

# 컨슈머 그룹 상세보기
## 파티션 번호, 현재 오프셋, LAG, 컨슈머ID, 호스트, 클라이언트ID 등을 알 수 있습니다.
## LAG: 현재 토픽의 저장된 메시지와 컨슈머가 가져간 메시지의 차이
../kafka/bin/kafka-consumer-groups.sh \
--bootstrap-server **<kafka-host1:kafka-port1,...,kafka-hostn:kafka-portn\**
--group **<group-name>** --describe

주키퍼 스케일 아웃

주키퍼 myid 설정

주키퍼 앙상블에 추가할 개별 서버에 접속해서 myid를 설정해줍니다.

echo **<myid>** > /data/myid // 4, 5

주키퍼 zoo.cfg 파일 수정

# zoo.cfg 예시.
# 아래 server.**<n>=...** 부분이 중요

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data
clientPort=2181
server.1=peter-zk001:2888:3888
server.2=peter-zk002:2888:3888
server.3=peter-zk003:2888:3888
server.4=peter-zk004:2888:3888
server.5=peter-zk005:2888:3888

설정 적용을 위한 주키퍼 서버 재기동

설정 정보 적용을 위해 적용을 재기동을 해줘야 합니다.

다만, 주의해야할 점은 리더가 변경되며 문제가 발생되는 것을 막기 위해 앙상블의 리더를 가장 마지막에 작업하는 것을 권장합니다.

리더를 찾는 방법은 아래와 같습니다.

# 주키퍼 서버 상태 확인 명령어
../zookeeper/bin/zkServer.sh status

# 해당 주키퍼 서버가 팔로워 일 때
... 생략
Mode: follower

# 해당 주키퍼 서버가 리더 일 때
... 생략
Mode: leader

재기동 후 통신 점검

리눅스 명령어인 nc 와 앙상블 모니터링을 위해 제공하는 명령어인 mntr로 모니터링으로 확인이 가능합니다.

아래 명령어를 주키퍼 리더에서 실행 합니다.

echo mntr | nc localhost 2181 | grep zk_synced_followers

카프카 스케일 아웃

주키퍼 앙상블보다 훠얼씬 쉽습니다!

카프카 설정 파일에서 broker.id를 다른 카프카 서버와 겹치지 않게 추가한 후 실행하면 간단하게 카프카 클러스터에 추가됩니다.

주키퍼의 zkCli.sh로 간단하게 확인이 가능합니다.

다만 주의해야할 점은 카프카 클러스터에 추가되더라도, 자동으로 파티션이 분산되지는 않습니다.

그렇기 때문에 위에서 다룬 json을 사용한 파티션 분산 작업을 별도로 수행해주어야 합니다.

카프카 모니터링

카프카 JMX 설정 방법

# 설정 방법 1
vi ../kafka-server-start.sh 

---
# limitation under the license

# 아래는 카프카 JMX 설정을 위해 추가한 명령어
**export JMX_PORT=9999**

---

# 설정 방법 2
echo "JMX_PORT=9999" > ../kafka/config/jmx

vi /etc/systemd/system/kafka-server.service

---
...생략
ExecStop=../kafka/bin/kafka-server-stop.sh
EnvironmentFile=../kafka/config/jmx

---
systemctl daemon-reload

systemctl restart kafka-server.service

카프카 JMX 모니터링 지표

출처: Confluent.io (https://docs.confluent.io/platform/current/kafka/monitoring.html#server-metrics)

카프카 매니저 활용

웹 GUI로 카프카를 관리 해보자!

미국 기업인 Yahoo에서 오픈 소스로 공개한 카프카 매니저를 사용하면 가능하다!

설치 프로세스(실제 설치 후 작성)

# 최신 릴리즈 확인
https://github.com/yahoo/CMAK/releases

# 최신 릴리즈 다운로드 (글 작성 때 기준 최선버전)
wget https://github.com/yahoo/CMAK/releases/download/3.0.0.5/cmak-3.0.0.5.zip

# 압축 풀기
unzip cmak-3.0.0.5.zip

# 폴더 이동
cd cmak-3.0.0.5

카프카 운영에 대한 QnA

  • Q. 카프카 운영시 옵션을 변경하는 방법은?
  • A. 카프카가 실행될 때 옵션 정보를 읽어오며, 운영 중인 상태에서 옵션을 변경해야 한다면, 옵션 설정을 변경한 후 클러스터내 브로커를 1대씩 재시작해야 변경된 옵션이 적용됨.
  •  
  • Q. 토픽이 삭제되지 않습니다.
  • A. 설정 옵션 중 delete.topic.enable=true로 설정되어 있어야 함.
  •  
  • Q. 디스크 사용량을 줄이는 방법은?
  • A. topic의 retention.ms 와 카프카 서버 설정인 log.retention.ms을 조정해서 카프카 메시지 보관 주기 설정 조정!
  •  
  • Q. 디스크 추가 방법은?
  • A. 카프카 설정 옵션 중 log.dir을 설정하면 됩니다.
    ex) log.dir=/disk1,/disk2,/disk3
  •  
  • Q. OS 점검 방법
  • A. 점검하고 싶은 브로커를 클러스터에서 제외한 후 점검을 진행하면 됩니다.
    다만, 리더가 변경되면서 일부 커넥션 에러등이 발생할 수 있습니다.
  •  
  • Q. LAG 상태를 관리 하는 방법은?
  • A. 위에 설명드린 컨슈머 그룹 상세 확인 부분을 참고하시거나, 링크드인에서 오픈소스로 공개한 Burrow를 활용하면 됩니다. GO 언어로 개발된 오픈소스로서, HTTP 요청을 통해 컨슈머의 상태, 컨슈머의 LAG 상태를 전달 받을 수 있습니다.
  •  
  • Q. 앙상블 전체의 상태 정보를 보는 방법
  • A. zktop 이라는 CLI 툴 사용.
  •  
  • Q. 롤링 업데이트 방법
  • A. 카프카 환경설정 파일(server.properties)에 아래 코드 두 줄 추가 후 재시작
inter.broker.protocol.version=<target-kafka-version>
log.message.format.version=<target-kafka-version>

# 세부 내용은 https://kafka.apache.org/documentation/#upgrade 참조!
반응형