아파치 카프카 오픈소스 진영에서는 카프카의 코디네이터 역할을 하는 주키퍼의 의존성을 제거하려는 움직임이 있음
주키퍼는 파티션과 브로커의 메타데이터를 저장하고 컨트롤러 서버를 선출하는 동작을 수행
-> 주키퍼의 역할을 카프카 내부에서 처리함으로써 운영 효율성을 높이고, 더많은 파티션을 처리하고자 함
주키퍼 서버 수량
주키퍼는 기본적으로 쿼럼(quarum(과반수)) 구성을 기반으로 동작하므로 반드시 홀수로 구성
최소 주키퍼 서버 수는 3
운영 환경에서 카프카 사용량이 높지 않으며 카프카가 매우 중요한 클러스터가 아니라면 주키퍼는 3대로 구성하는 것이 적합하고, 핵심 중앙 데이터 파이프라인으로 카프카를 이용 중이고 카프카 사용량도 높은 경우라면 안정성 확보를 위해 5대 서버로 구성하는 것을 권장 (사용량은 낮아도 카프카가 매우 중요한 용도로 사용된다면 5대로 구성)
주키퍼 하드웨어
주키퍼는 높은 하드웨어 리소스를 요구하지 않기에 메모리 크기는 4~8GB, 디스크는 240G 또는 480G SSD 권장
주키퍼에서 필요로 하는 힙(heap) 메모리 크기는 일반적으로 1~2GB, 나머지는 OS 영역에서 사용
주키퍼는 트랜잭션이나 스냅샷 로그들을 로컬디스크에 저장하는데, 일반적인 SAS(Serial Attached SCSI) 디스크보다는 쓰기 성능이 좋은 SSD 디스크 사용 권장
주키퍼와 카프카 간에는 메타데이터 정도만을 주고받으므로 주키퍼의 네트워크 사용량이 높지 않기에 네트워크 카드는 1G 이더넷 카드 구성을 권장
카프카 구성
카프카 서버 수량
카프카는 주키퍼와 달리 quarum(과반수) 방식 구성이 필요 없기에 반드시 홀수일 필요는 없음
짝수도 가능하기에 최소 수량은 2대도 가능하지만, 안정적인 리플리케이션 팩터 수인 3으로 토픽을 구성하기 위해 최소 3대의 브로커가 필요
카프카의 장점 중 하나가 손쉬운 Scale-out 이므로 작은 수로 구성해서 늘리는게 좋다.
카프카 하드웨어
주키퍼와 달리 카프카의 CPU 사용률은 높은 편
프로듀서나 컨슈머의 처리량을 높이기 위해 배치와 압축 기능을 적용하기 때문에 리소스가 많이 소모되지만, 최신의 고성능 CPU만 고집하기보다는, 코어 수가 많은 CPU로 구성할 것을 권장
카프카에서 요구하는 JVM Heap size는 일반적으로 6GB이고, Heap Size를 제외한 나머지 물리 메모리는 모두 페이지 캐시로 사용해서 빠른 처리를 돕기에, 메모리 여유가 있어야 성능에 도움이 된다.
128GB, 256GB를 추천하지만, 타이트하게 운영한다면 32GB 이상으로 구성
디스크의 경우 저성능의 SATA 디스크를 사용해도 카프카가 높은 성능을 보장하는데, 그 이유는 로그 마지막에 순차적으로 쓰는 방식으로 로그를 기록하기 때문
다만 브로커 한 대에 여러개 디스크를 장착해 병렬 처리를 하는 것이 좋음
간혹 카프카의 물리 디스크 크기가 너무 작아 토픽 파티션의 로그가 가득 차는 경우가 있는데, 이때 토픽의 보관 주기를 충분하게 설정하려면 4TB 용량 이상의 디스크로 선정하는 것을 권장
NAS 디스크를 사용하게 되면 모든 브로커가 하나의 NAS만 보기에 비용과 안정성 측면을 고려해 NAS 사용은 비추천 (AWS 기준 EBS 사용을 권장)
카프카의 네트워크 카드는 10G 이더넷 카드로 구성하는 것을 추천
브로커 한 대당 네트워크 사용량 비율이 50%가 넘지 않도록 최대한 토픽을 분산 운영 필요
디스크의 장애 복구 또는 신규 브로커 추가로 인해 카프카 클러스터 사이에서 대량의 데이터 이동이 발생하는데, 이때 많은 트래픽을 사용하므로 네트워크 대역폭은 충분히 확보 필요
모니터링 시스템 구성
애플리케이션으로부터 카프카의 로그 관리와 분석
카프카는 카프카 애플리케이션에서 발생하는 모든 로그를 브로커의 로컬 디스크에 기록
카프카는 애플리케이션 로그 관리를 위해 자바 기반의 로깅 유틸리티인 Apache log4j를 사용
참고 log4j 로그 레벨
TRACE : DEBUG보다 상세한 로그 기록
DEBUG : 내부 애플리케이션 상황에 대한 로그 기록
INFO : 로그 레벨의 기본값, 일반적인 정보 수준의 로그 기록 -> 카프카 애플리케이션의 기본값
WARN : 경고 수준의 로그 기록
ERROR : 런타임 에러나 예상하지 못한 에러 로그 기록
FATAL : 심각한 오류로 인한 애플리케이션 중지 등의 로그 기록
log4j 프로퍼티 확인
user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@43.202.3.66
The authenticity of host '43.202.3.66 (43.202.3.66)' can't be established.
ED25519 key fingerprint is SHA256:GeHH0S43L+zsolQqCXM4tLiBem77YdLhyuV4X4il89U.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:127: 54.180.138.235
~/.ssh/known_hosts:146: 43.201.149.64
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '43.202.3.66' (ED25519) to the list of known hosts.
Last login: Tue Jul 11 23:56:41 2023 from 110.9.16.150
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
28 package(s) needed for security, out of 30 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-4-136 ~]$ cat /usr/local/kafka/config/log4j.properties
Change the two lines below to adjust the general broker logging level (output to server.log and stdout)
- 로그 레벨 변경
```cmd
# Change the two lines below to adjust the general broker logging level (output to server.log and stdout)
log4j.logger.kafka=DEBUG
log4j.logger.org.apache.kafka=DEBUG
[ec2-user@ip-172-31-4-136 ~]$ sudo vi /usr/local/kafka/config/log4j.properties
[ec2-user@ip-172-31-4-136 ~]$ sudo systemctl restart kafka-server # 카프카 서버 재시작
[ec2-user@ip-172-31-4-136 ~]$ cat /usr/local/kafka/logs/server.log # 서버 로그 확인
[2023-07-30 16:19:13,929] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2023-07-30 16:19:14,747] INFO Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation (org.apache.zookeeper.common.X509Util)
[2023-07-30 16:19:14,837] INFO Registered signal handlers for TERM, INT, HUP (org.apache.kafka.common.utils.LoggingSignalHandler)
[2023-07-30 16:19:14,843] INFO starting (kafka.server.KafkaServer)
[2023-07-30 16:19:14,845] INFO Connecting to zookeeper on peter-zk01.foo.bar:2181,peter-zk02.foo.bar:2181,peter-zk03.foo.bar:2181 (kafka.server.KafkaServer)
[2023-07-30 16:19:14,846] DEBUG Checking login config for Zookeeper JAAS context [java.security.auth.login.config=null, zookeeper.sasl.client=default:true, zookeeper.sasl.clientconfig=default:Client] (org.apache.kafka.common.security.JaasUtils) # DEBUG 레벨 로그 발견
[2023-07-30 16:19:14,883] INFO [ZooKeeperClient Kafka server] Initializing a new session to peter-zk01.foo.bar:2181,peter-zk02.foo.bar:2181,peter-zk03.foo.bar:2181. (kafka.zookeeper.ZooKeeperClient)
[2023-07-30 16:19:14,899] INFO Client environment:zookeeper.version=3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:53 GMT (org.apache.zookeeper.ZooKeeper)
[2023-07-30 16:19:14,900] INFO Client environment:host.name=peter-kafka01.foo.bar (org.apache.zookeeper.ZooKeeper)
[2023-07-30 16:19:14,901] INFO Client environment:java.version=1.8.0_372 (org.apache.zookeeper.ZooKeeper)
당연한 얘기지만 로그 레벨을 DEBUG or TRACE로 낮출 경우 예상보다 많은 로그가 발생하고, 로컬 디스크에 기록되므로 브로커의 여유 디스크 공간을 확인하고 로그 레벨 변경 필요
카프카 애플리케이션의 로그 파일 종류와 역할
server.log = 브로커 설정 정보와 정보성 로그 등을 기록, 브로커를 재시작하는 경우 브로커의 옵션 정보 기록
state-change.log = 컨트롤러부터 받은 정보를 기록
kafka-request.log = 클라이언트로부터 받은 정보를 기록
log-cleaner.log = 로그 컴패션 동작등을 기록
controller.log = 컨트롤러 관련 정보를 기록
kafka-authorizer.log = 인증과 관련된 정보를 기록
JMX를 이용한 카프카 메트릭 모니터링
카프카를 안정적으로 모니터링하기 위해 애플리케이션의 로그 내용 분석 뿐 아니라, 카프카 클러스터의 상태 및 이상 유무를 한눈에 빠르게 확인할 수 있는 JMX가 필요
JMX(Java Management eXtensions)는 자바로 맏는 애플리케이션의 모니터링을 위한 도구를 제공하는 자바 API로서, MBean(Managed Bean)이라는 객체로 표현
카프카 관리자는 JMX를 이용해 카프카의 주요 메트릭들을 그래프와 같은 형태로 확인 가능
카프카 JMX 설정 방법
JMX 포트 확인
[ec2-user@ip-172-31-4-136 ~]$ cat /usr/local/kafka/config/jmx # JMX 포트 확인
JMX_PORT=9999
[ec2-user@ip-172-31-4-136 ~]$ netstat -ntl | grep 9999 # JMX 포트 활성화 여부 확인
tcp6 0 0 :::9999 :::* LISTEN
프로메테우스 설치
프로메테우스 : 메트릭 기반 오픈소스 모니터링 시스템
특징 : 강력한 데이터 모델과 쿼리 언어를 이용해 관리자가 원하는 형태의 메트릭을 손쉽게 표현할 수 있는 도구
프로메테우스를 활용해 관리자는 애플리케이션의 성능과 상태, 그리고 인프라의 성능도 손쉽게 확인 가능
프로메테우스 설치 대상 서버는 peter-ansible01
✘ user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@15.165.76.254 # ansible public IP
The authenticity of host '15.165.76.254 (15.165.76.254)' can't be established.
ED25519 key fingerprint is SHA256:bbx9U3sAWi+oHCd89qi0hXWy8dWhSH7XKlYDQXKTu2M.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:124: 13.125.218.113
~/.ssh/known_hosts:145: 3.34.144.59
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '15.165.76.254' (ED25519) to the list of known hosts.
Last login: Tue Jul 11 14:56:28 2023 from 110.9.16.150
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
23 package(s) needed for security, out of 25 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-2-254 ~]$
[ec2-user@ip-172-31-2-254 ~]$ sudo docker version
Client:
Version: 20.10.23
API version: 1.41
Go version: go1.18.9
Git commit: 7155243
Built: Tue Apr 11 22:56:36 2023
OS/Arch: linux/amd64
Context: default
Experimental: true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
docker 시작 및 reboot
[ec2-user@ip-172-31-2-254 ~]$ sudo service docker start
Redirecting to /bin/systemctl start docker.service
[ec2-user@ip-172-31-2-254 ~]$ sudo usermod -a -G docker ec2-user
[ec2-user@ip-172-31-2-254 ~]$ sudo yum install -y git
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Package git-2.40.1-1.amzn2.0.1.x86_64 already installed and latest version
Nothing to do
[ec2-user@ip-172-31-2-254 ~]$ sudo chkconfig docker on
알림: 'systemctl enable docker.service'에 요청을 전송하고 있습니다.
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[ec2-user@ip-172-31-2-254 ~]$ sudo reboot
Connection to 15.165.76.254 closed by remote host.
Connection to 15.165.76.254 closed.
docker 상태 확인
user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@15.165.76.254
ssh: connect to host 15.165.76.254 port 22: Connection refused # 기다려야됨 1~3분정도
✘ user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@15.165.76.254
Last login: Sun Jul 30 07:29:24 2023 from 110.9.16.150
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
23 package(s) needed for security, out of 25 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-2-254 ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 일 2023-07-30 07:33:09 UTC; 25s ago
Docs: https://docs.docker.com
Process: 3206 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
Process: 3197 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
Main PID: 3208 (dockerd)
Tasks: 8
Memory: 87.0M
CGroup: /system.slice/docker.service
└─3208 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.827846593Z" level=info msg="[graphdriver] using prior storage driver: overlay2"
7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.834220415Z" level=warning msg="Your kernel does not support cgroup blkio weight"
7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.834246199Z" level=warning msg="Your kernel does not support cgroup blkio weight_device"
7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.835008593Z" level=info msg="Loading containers: start."
7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.327216413Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.393052150Z" level=info msg="Loading containers: done."
7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.540714522Z" level=info msg="Docker daemon" commit=6051f14 graphdriver(s)=overlay2 version=20.10.23
7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.541363078Z" level=info msg="Daemon has completed initialization"
7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal systemd[1]: Started Docker Application Container Engine.
7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.570043107Z" level=info msg="API listen on /run/docker.sock"
[ec2-user@ip-172-31-2-254 ~]$ sudo mkdir -p /etc/prometheus
[ec2-user@ip-172-31-2-254 ~]$
- prometheus 설치
```cmd
[ec2-user@ip-172-31-2-254 ~]$ sudo mkdir -p /etc/prometheus
[ec2-user@ip-172-31-2-254 ~]$ git clone https://github.com/onlybooks/kafka2 # 이미 우리는 clone 받았음
fatal: 대상 경로가('kafka2') 이미 있고 빈 디렉터리가 아닙니다.
[ec2-user@ip-172-31-2-254 ~]$ ls
kafka2 keypair.pem
[ec2-user@ip-172-31-2-254 ~]$ sudo cp kafka2/chapter7/prometheus.yml /etc/prometheus/
[ec2-user@ip-172-31-2-254 ~]$ sudo docker run -d --network host -p 9090:9090 -v /etc/prometheus/promethues.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus # 알파벳 삑사리 남 ㅠ
Unable to find image 'prom/prometheus:latest' locally
latest: Pulling from prom/prometheus
d5c4df21b127: Pull complete
2f5f7d8898a1: Pull complete
300c29bb5b04: Pull complete
be6ad5a51a35: Pull complete
ea6cf9f81dfe: Pull complete
b5ac85a4be54: Pull complete
d32980b63d51: Pull complete
502ed6d3bdc8: Pull complete
7bed70210741: Pull complete
3b19398e1689: Pull complete
d358eb0a0392: Pull complete
d6eaeaf54563: Pull complete
Digest: sha256:d6ead9daf2355b9923479e24d7e93f246253ee6a5eb18a61b0f607219f341a80
Status: Downloaded newer image for prom/prometheus:latest
WARNING: Published ports are discarded when using host network mode
be515d4e3016cd0833c07c65bf9a4448043d065999716fe42300a14712b1de75
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/etc/prometheus/promethues.yml" to rootfs at "/etc/prometheus/prometheus.yml": mount /etc/prometheus/promethues.yml:/etc/prometheus/prometheus.yml (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
[ec2-user@ip-172-31-2-254 ~]$ sudo docker run -d --network host -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus
docker: Error response from daemon: Conflict. The container name "/prometheus" is already in use by container "be515d4e3016cd0833c07c65bf9a4448043d065999716fe42300a14712b1de75". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
[ec2-user@ip-172-31-2-254 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[ec2-user@ip-172-31-2-254 ~]$ docker ps -al
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be515d4e3016 prom/prometheus "/bin/prometheus --c…" 57 seconds ago Created prometheus
[ec2-user@ip-172-31-2-254 ~]$ docker rm be515d4e3016 # 생긴 컨테이너 삭제
be515d4e3016
[ec2-user@ip-172-31-2-254 ~]$ sudo docker run -d --network host -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus # 다시 제대로 만들기
WARNING: Published ports are discarded when using host network mode
bfc54bd2e77174067f1a0d55cbb9cc735d08a76dab989e4357b3f35f3c855092
[ec2-user@ip-172-31-2-254 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfc54bd2e771 prom/Prometheus "/bin/prometheus --c…" 12 seconds ago Up 12 seconds prometheus
그라파나 설치
프로메테우스는 훌륭한 모니터링 도구이지만 성능이나 메트릭 등을 대시보드 형태로 보기에는 용이하지 않음
전체 시스템에 관한 대시보드를 보여주거나, 사용자가 손수비게 대시보드를 만들 수 있도록 도와주는 도구가 그라파나
docker로 그라파나 설치하기
[ec2-user@ip-172-31-2-254 ~]$ sudo docker run -d --network host -p 3000:3000 --name grafana grafana/grafana:7.3.7
Unable to find image 'grafana/grafana:7.3.7' locally
7.3.7: Pulling from grafana/grafana
801bfaa63ef2: Pull complete
efdb3434c59e: Pull complete
8cbdb3f56d34: Pull complete
34f82d4bd2ec: Pull complete
af445b3382af: Pull complete
4f4fb700ef54: Pull complete
8aab09bbec8e: Pull complete
9e81c23e3db5: Pull complete
Digest: sha256:5f19b6c385e8bfb8e5c9ecc7cdd123a453af3cf01e7c20d20059e770f656286d
Status: Downloaded newer image for grafana/grafana:7.3.7
WARNING: Published ports are discarded when using host network mode
86e96a2ab124588e213fd72420dab5eb23cc45a63488150f6070b4f5a0b82e54
[ec2-user@ip-172-31-2-254 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86e96a2ab124 grafana/grafana:7.3.7 "/run.sh" 14 seconds ago Up 11 seconds grafana
bfc54bd2e771 prom/prometheus "/bin/prometheus --c…" 4 minutes ago Up 4 minutes prometheus
익스포터 설치
프로메테우스의 모니터링 방식은 푸쉬가 아닌 풀 방식
모니터링하고자 하는 대상 서버에 자신의 메트릭 정보를 보여줄 수 있는 익스포터(Exporter) 설치 필요
익스포터(Exporter)란 다양한 애플리케이션에서 수집되는 메트릭들을 프로메테우스가 인식할 수 있는 형태로 나타내는 에이전트
`익스포터를 설치한 후 웹 브라우저를 열어 대상 서버 주소로 접근하면, 익스포터에서 보여주는 다양한 메트릭 정보 확인 가능
프로메테우스로 모니터링할 대상 서버와 포트 정보를 프로메테우스 환경 설정 파일에 등록하면, 프로메테우스는 주기적으로 대상 서버의 메트릭값을 가져와 자신의 데이터베이스에 저장한다.
http 클라이언트 요청에 응답하는 형태로 로컬 JVM의 메트릭을 보여주기 위해서 독립적인 HTTP 서버로 설정하거나 자바 에이전트로 섲렁할 수 있는데, 독립적인 HTTP 서버로 설정하는 방법을 이용
peter-kakfa01 서버 접속
JMX 익스포터를 저장할 디렉토리 생성
git 클론
user ~/Desktop/kafka-aws ssh -i keypair.pem ec2-user@43.202.3.66
Last login: Sun Jul 30 16:32:43 2023 from 110.9.16.150
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
28 package(s) needed for security, out of 30 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-4-136 ~]$ sudo mkdir -p /usr/local/jmx
[ec2-user@ip-172-31-4-136 ~]$ sudo yum -y install git
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
Package git-2.40.1-1.amzn2.0.1.x86_64 already installed and latest version
Nothing to do
[ec2-user@ip-172-31-4-136 ~]$ git clone https://github.com/onlybooks/kafka2
'kafka2'에 복제합니다...
remote: Enumerating objects: 302, done.
remote: Counting objects: 100% (40/40), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 302 (delta 26), reused 25 (delta 23), pack-reused 262
오브젝트를 받는 중: 100% (302/302), 27.58 MiB | 13.90 MiB/s, 완료.
델타를 알아내는 중: 100% (74/74), 완료.
- 익스포터 실행하기 위한 파일 복사 및 기타 삽질
```cmd
[ec2-user@ip-172-31-4-136 ~]$ vi jmx_prometheus_httpserver.yml
[ec2-user@ip-172-31-4-136 ~]$ cd usr/local/jmx
-bash: cd: usr/local/jmx: No such file or directory
[ec2-user@ip-172-31-4-136 ~]$ ls
kafka2
[ec2-user@ip-172-31-4-136 ~]$ ls
kafka2
[ec2-user@ip-172-31-4-136 ~]$ cd ./.
[ec2-user@ip-172-31-4-136 ~]$ cd ..
[ec2-user@ip-172-31-4-136 home]$ ls
ec2-user
[ec2-user@ip-172-31-4-136 home]$ cd ..
[ec2-user@ip-172-31-4-136 /]$ ls
bin boot data dev etc home lib lib64 local media mnt opt proc root run sbin srv sys tmp usr var
[ec2-user@ip-172-31-4-136 /]$ cd usr
[ec2-user@ip-172-31-4-136 usr]$ cd local
[ec2-user@ip-172-31-4-136 local]$ cd jmx
[ec2-user@ip-172-31-4-136 jmx]$ ls
jmx_prometheus_httpserver-0.13.1-SNAPSHOT-jar-with-dependencies.jar jmx_prometheus_httpserver.yml
[ec2-user@ip-172-31-4-136 jmx]$ cat jmx_promethues_httpserver.yml
cat: jmx_promethues_httpserver.yml: No such file or directory
[ec2-user@ip-172-31-4-136 jmx]$ cat jmx_prometheu_httpserver.yml
cat: jmx_prometheu_httpserver.yml: No such file or directory
[ec2-user@ip-172-31-4-136 jmx]$ cat jmx_prometheus_httpserver.yml
hostPort: 127.0.0.1:9999 # JMX가 실행되고 있는 IP와 포트 정보
ssl: false # SSL 사용여부
rules: # 순서대로 적용할 규칙 리스트
- pattern: ".*"
책의 jmx-exporter.service 찾아가기
[ec2-user@ip-172-31-4-136 jmx]$ cd ..
[ec2-user@ip-172-31-4-136 local]$ ls
bin etc games include jmx kafka kafka_2.12-2.6.0 lib lib64 libexec sbin share src
[ec2-user@ip-172-31-4-136 local]$ cd ..
[ec2-user@ip-172-31-4-136 usr]$ ls
bin etc games include lib lib64 libexec local sbin share src tmp
[ec2-user@ip-172-31-4-136 usr]$ cd ..
[ec2-user@ip-172-31-4-136 /]$ ls
bin boot data dev etc home lib lib64 local media mnt opt proc root run sbin srv sys tmp usr var
[ec2-user@ip-172-31-4-136 /]$ cd usr
[ec2-user@ip-172-31-4-136 usr]$ ls
bin etc games include lib lib64 libexec local sbin share src tmp
[ec2-user@ip-172-31-4-136 usr]$ cd ..
[ec2-user@ip-172-31-4-136 /]$ cd home
[ec2-user@ip-172-31-4-136 home]$ ls
ec2-user
[ec2-user@ip-172-31-4-136 home]$ cd ec2-user
[ec2-user@ip-172-31-4-136 ~]$ ls
kafka2
[ec2-user@ip-172-31-4-136 ~]$ cd kafka2
[ec2-user@ip-172-31-4-136 kafka2]$ ls
README.md appendix_B appendix_C chapter10 chapter11 chapter12 chapter2 chapter3 chapter4 chapter5 chapter6 chapter7 chapter8 chapter9
[ec2-user@ip-172-31-4-136 kafka2]$ cd chapter7
[ec2-user@ip-172-31-4-136 chapter7]$ ls
[Unit]
Description=JMX Exporter for Kafka
After=kafka-server.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/java -jar /usr/local/jmx/jmx_prometheus_httpserver-0.13.1-SNAPSHOT-jar-with-dependencies.jar 7071 /usr/local/jmx/jmx_prometheus_httpserver.yml # JMX 익스포터 실행하는 명령어 부분, 현재는 JMX 익스포터가 7071 포트 사용하도록 되어있지만, 다른 포트 번호로 변경 원하면 여기 변경하면됨 (책대로하자)
[Install]
WantedBy=multi-user.target
~
- 디렉토리 조심 및 리눅스 시스템에서 `systemd`의 변경이 생긴 후에는 반드시 `systemctl daemon-reload` 명령어 수행 필요
```cmd
[ec2-user@ip-172-31-4-136 kafka2]$ cd chapter7
[ec2-user@ip-172-31-4-136 chapter7]$ ls
7_commands.txt jmx-exporter.service jmx_prometheus_httpserver-0.13.1-SNAPSHOT-jar-with-dependencies.jar jmx_prometheus_httpserver.yml kafka_metrics.json node-exporter.service prometheus.yml 예제
[ec2-user@ip-172-31-4-136 chapter7]$ vi jmx-exporter.service
[ec2-user@ip-172-31-4-136 chapter7]$ sudo cp kafka2/chapter7/jmx-exporter.service /etc/systemd/system
cp: cannot stat `kafka2/chapter7/jmx-exporter.service': No such file or directory
[ec2-user@ip-172-31-4-136 chapter7]$ sudo cp jmx-exporter.service /etc/systemd/system
[ec2-user@ip-172-31-4-136 chapter7]$ sudo systemctl daemon-reload
[ec2-user@ip-172-31-4-136 chapter7]$ sudo systemctl start jmx-exporter
[ec2-user@ip-172-31-4-136 chapter7]$ sudo systemctl status jmx-exporter
● jmx-exporter.service - JMX Exporter for Kafka
Loaded: loaded (/etc/systemd/system/jmx-exporter.service; disabled; vendor preset: disabled)
Active: active (running) since 일 2023-07-30 16:53:39 KST; 6s ago
Main PID: 24287 (java)
CGroup: /system.slice/jmx-exporter.service
└─24287 /usr/bin/java -jar /usr/local/jmx/jmx_prometheus_httpserver-0.13.1-SNAPSHOT-jar-with-dependencies.jar 7071 /usr/local/jmx/jmx_prometheus_httpserver.yml
7월 30 16:53:39 ip-172-31-4-136.ap-northeast-2.compute.internal systemd[1]: Started JMX Exporter for Kafka.
[ec2-user@ip-172-31-4-136 chapter7]$ curl http://localhost:7071/metrics
# HELP jmx_config_reload_success_total Number of times configuration have successfully been reloaded.
# TYPE jmx_config_reload_success_total counter
jmx_config_reload_success_total 0.0
# HELP jmx_config_reload_failure_total Number of times configuration have failed to be reloaded.
# TYPE jmx_config_reload_failure_total counter
jmx_config_reload_failure_total 0.0
# HELP kafka_server_socket_server_metrics_connection_creation_total The total number of new connections established (kafka.server<type=socket-server-metrics, listener=PLAINTEXT, networkProcessor=1><>connection-creation-total)
# TYPE kafka_server_socket_server_metrics_connection_creation_total untyped
kafka_server_socket_server_metrics_connection_creation_total{listener="PLAINTEXT",networkProcessor="1",} 0.0
kafka_server_socket_server_metrics_connection_creation_total{listener="PLAINTEXT",networkProcessor="3",} 0.0
kafka_server_socket_server_metrics_connection_creation_total{listener="PLAINTEXT",networkProcessor="2",} 0.0
kafka_server_socket_server_metrics_connection_creation_total{listener="PLAINTEXT",networkProcessor="0",} 1.0
# HELP kafka_controller_ControllerChannelManager_MeanRate Attribute exposed for management (kafka.controller<type=ControllerChannelManager, name=RequestRateAndQueueTimeMs, broker-id=1><>MeanRate)
# TYPE kafka_controller_ControllerChannelManager_MeanRate untyped
kafka_controller_ControllerChannelManager_MeanRate{name="RequestRateAndQueueTimeMs",broker_id="1",} 0.0033385209862075963
# HELP kafka_controller_ControllerStats_99thPercentile Attribute exposed for management (kafka.controller<type=ControllerStats, name=ListPartitionReassignmentRateAndTimeMs><>99thPercentile)
# TYPE kafka_controller_ControllerStats_99thPercentile untyped
kafka_controller_ControllerStats_99thPercentile{name="ListPartitionReassignmentRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="ControlledShutdownRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="PartitionReassignmentRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="ManualLeaderBalanceRateAndTimeMs",} 3.143332
kafka_controller_ControllerStats_99thPercentile{name="UncleanLeaderElectionEnableRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="TopicChangeRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="ControllerChangeRateAndTimeMs",} 879.436079
kafka_controller_ControllerStats_99thPercentile{name="IsrChangeRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="TopicDeletionRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="LogDirChangeRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="TopicUncleanLeaderElectionEnableRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="LeaderElectionRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="ControllerShutdownRateAndTimeMs",} 0.0
kafka_controller_ControllerStats_99thPercentile{name="LeaderAndIsrResponseReceivedRateAndTimeMs",} 2.242129
kafka_controller_ControllerStats_99thPercentile{name="AutoLeaderBalanceRateAndTimeMs",} 15.382767
# HELP kafka_server_socket_server_metrics_io_wait_time_ns_avg The average length of time the I/O thread spent waiting for a socket ready for reads or writes in nanoseconds. (kafka.server<type=socket-server-metrics, listener=PLAINTEXT, networkProcessor=1><>io-wait-time-ns-avg)
# TYPE kafka_server_socket_server_metrics_io_wait_time_ns_avg untyped
kafka_server_socket_server_metrics_io_wait_time_ns_avg{listener="PLAINTEXT",networkProcessor="1",} 3.003696505642458E8
JMX 익스포터는 브로커 한대에만 설치하는게 아니라 카프카 클러스터 내 모든 브로커에 설치해야함
수행해야 하는 명령어 순서 정리
sudo amazon-linux-extras install -y docker # 도커 설치
http://15.165.76.254:3000/login -> ansbile의 public IP로 접속하면됨, 초기 암호 admin/admin
Add your first data source 선택
Prometheus 선택
위 그림에서 책과 달리 저는 peter-ansible.foo.bar로 호스트파일에 등록했습니다. host 파일에 등록한 도메인명으로 설정해주세요.
위 이미지의 + 버튼 클릭 후 import 버튼 클릭 -> Import via grafana.com에 1860 입력 -> Load 버튼 클릭 -> Promethus 선택 -> Import 버튼 클릭
28 package(s) needed for security, out of 30 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-4-136 ~]$ cat kafka2/chapter7/kafka_metrics.json
내용 너무 많아서 생략
JMX 모니터링 지표
TopicCount : 카프카 클러스터 전체의 토픽 개수
PartitionCount : 카프카 클러스터 전체 파티션 개수
ActiveControllerCount : 카프카 클러스터 내 컨트롤러 수, 클러스터 내에는 반드시 1개의 컨트롤러 존재해야함
UnderReplicatedPartitons : 카프카 클러스터 내에서 복제가 되지 않은 파티션 수를 나타냄
UnderMinIsrPartitionCount : 안정적인 메시지 전송을 위해 유지해야 하는 최소 ISR 수를 지정하는 경우, 유지해야 하는 최소 ISR 수보다 작은 수를 나타냄
MessagesInPerSec : 브로커로 전송되는 초당 메시지 수
BytesInPerSec : 브로커로 전송되는 초당 바이트 수
BytesOutPerSec : 브로커에서 나가는 초당 바이트 수, 일반적으로 브로커로 들어오는 바이트 수보다 나가는 바이트 수가 많다. (카프카 특성상 해당 토픽을 컨슘하는 컨슈머들은 다수가 존재할 수 있으므로)
RequestPerSec : 프로듀서, 컨슈머, 팔로워들의 요청 비율을 나타냄
LeaderCount : 브로커가 갖고 있는 리더 수를 나타냄. 카프카는 리더가 읽고 쓰기를 처리하므로, 클러스터 젗네에 고르게 분산시켜서 브로커들이 균등하게 처리해야 함
PartitionCount : 브로커가 갖고 있는 파티션 수, 파티션 수 역시 클러스터 전체에 고르게 분산시켜 브로커들이 균등하게 처리하게 해야함
IsrShrinksPerSec : 브로커가 다운되거나 리플리케이션 동작에 문제가 발생하면 ISR이 축소되는 현상 발생하는데, 파티션 리플리케이션 동작에 문제[가 있는지 유무 등을 확인할 때 사용하는 지표
RequestQueueSize : 요청 큐의 크기를 나타내며, 큐의 크기가 크다는 것은 처리되지 못하는 요청들이 많다는 의미
ResponseQueueSize : 응답 큐 크기를 나타내며, 큐의 크기가 크다는 것은 처리되지 못하는 응답이 많다는 의미
RequestHandlerAvgIdlePercent : 요청 핸들러 스레드가 유휴 상태인 평균 시간을 나타냄, 0이면 모든 리소스 사용, 1이면 모든 리소스 가용
NetworkProcessorAvIdlePercent : 네트워크 프로세서 스레드가 유휴 상태인 평균 시간 나타냄, 0이면 모든 리소스 사용, 1이면 모든 리소스 가용
RequestQueueTimeMs : 요청 큐에서의 대기시간
LocalTimeMs : 리더에서 요청을 처리하는 시간
RemoteTimeMs : 팔로워들을 기다리는 시간, 프로듀스 옵션 acks=all일때 길다.
ResponseQueueTimeMs : 응답 큐에서의 대기시간
ResponseSendTimeMs : 응답을 보내는 시간
카프카 익스포터
카프카 모니터링 위해서는 JMX Metric, 브로커 리스소 모니터링 도 중요하지만, 컨슈머 LAG을 모니터링하는 것도 중요
안정적인 운영을 위한 주키퍼와 카프카 구성
주키퍼 구성
주키퍼 서버 수량
쿼럼(quarum(과반수))
구성을 기반으로 동작하므로 반드시 홀수로 구성주키퍼 하드웨어
힙(heap) 메모리
크기는 일반적으로 1~2GB, 나머지는 OS 영역에서 사용SAS(Serial Attached SCSI)
디스크보다는 쓰기 성능이 좋은SSD 디스크
사용 권장카프카 구성
카프카 서버 수량
quarum(과반수)
방식 구성이 필요 없기에 반드시 홀수일 필요는 없음손쉬운 Scale-out
이므로 작은 수로 구성해서 늘리는게 좋다.카프카 하드웨어
JVM Heap size
는 일반적으로 6GB이고, Heap Size를 제외한 나머지 물리 메모리는 모두페이지 캐시
로 사용해서 빠른 처리를 돕기에, 메모리 여유가 있어야 성능에 도움이 된다.SATA
디스크를 사용해도 카프카가 높은 성능을 보장하는데, 그 이유는 로그 마지막에 순차적으로 쓰는 방식으로 로그를 기록하기 때문NAS 디스크
를 사용하게 되면 모든 브로커가 하나의NAS
만 보기에 비용과 안정성 측면을 고려해NAS
사용은 비추천 (AWS 기준 EBS 사용을 권장)모니터링 시스템 구성
애플리케이션으로부터 카프카의 로그 관리와 분석
Apache log4j
를 사용log4j 프로퍼티 확인
https://aws.amazon.com/amazon-linux-2/ 28 package(s) needed for security, out of 30 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-31-4-136 ~]$ cat /usr/local/kafka/config/log4j.properties
Change the two lines below to adjust the general broker logging level (output to server.log and stdout)
log4j.logger.kafka=INFO log4j.logger.org.apache.kafka=INFO
DEBUG
orTRACE
로 낮출 경우 예상보다 많은 로그가 발생하고, 로컬 디스크에 기록되므로 브로커의 여유 디스크 공간을 확인하고 로그 레벨 변경 필요JMX를 이용한 카프카 메트릭 모니터링
JMX(Java Management eXtensions)
는 자바로 맏는 애플리케이션의 모니터링을 위한 도구를 제공하는 자바 API로서,MBean(Managed Bean)
이라는 객체로 표현JMX
를 이용해 카프카의 주요 메트릭들을 그래프와 같은 형태로 확인 가능카프카 JMX 설정 방법
peter-ansible01
docker 버전 확인
docker 시작 및 reboot
docker 상태 확인
https://aws.amazon.com/amazon-linux-2/ 23 package(s) needed for security, out of 25 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-31-2-254 ~]$ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since 일 2023-07-30 07:33:09 UTC; 25s ago Docs: https://docs.docker.com Process: 3206 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS) Process: 3197 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS) Main PID: 3208 (dockerd) Tasks: 8 Memory: 87.0M CGroup: /system.slice/docker.service └─3208 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.827846593Z" level=info msg="[graphdriver] using prior storage driver: overlay2" 7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.834220415Z" level=warning msg="Your kernel does not support cgroup blkio weight" 7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.834246199Z" level=warning msg="Your kernel does not support cgroup blkio weight_device" 7월 30 07:33:08 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:08.835008593Z" level=info msg="Loading containers: start." 7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.327216413Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address" 7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.393052150Z" level=info msg="Loading containers: done." 7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.540714522Z" level=info msg="Docker daemon" commit=6051f14 graphdriver(s)=overlay2 version=20.10.23 7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.541363078Z" level=info msg="Daemon has completed initialization" 7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal systemd[1]: Started Docker Application Container Engine. 7월 30 07:33:09 ip-172-31-2-254.ap-northeast-2.compute.internal dockerd[3208]: time="2023-07-30T07:33:09.570043107Z" level=info msg="API listen on /run/docker.sock" [ec2-user@ip-172-31-2-254 ~]$ sudo mkdir -p /etc/prometheus [ec2-user@ip-172-31-2-254 ~]$
그라파나 설치
프로메테우스는 훌륭한 모니터링 도구이지만 성능이나 메트릭 등을 대시보드 형태로 보기에는 용이하지 않음
전체 시스템에 관한 대시보드를 보여주거나, 사용자가 손수비게 대시보드를 만들 수 있도록 도와주는 도구가 그라파나
docker로 그라파나 설치하기
익스포터 설치
프로메테우스의 모니터링 방식은
푸쉬
가 아닌풀
방식모니터링하고자 하는 대상 서버에 자신의 메트릭 정보를 보여줄 수 있는
익스포터(Exporter)
설치 필요익스포터(Exporter)
란 다양한 애플리케이션에서 수집되는 메트릭들을 프로메테우스가 인식할 수 있는 형태로 나타내는 에이전트`익스포터를 설치한 후 웹 브라우저를 열어 대상 서버 주소로 접근하면, 익스포터에서 보여주는 다양한 메트릭 정보 확인 가능
프로메테우스로 모니터링할 대상 서버와 포트 정보를 프로메테우스 환경 설정 파일에 등록하면, 프로메테우스는 주기적으로 대상 서버의 메트릭값을 가져와 자신의 데이터베이스에 저장한다.
http
클라이언트 요청에 응답하는 형태로 로컬JVM
의 메트릭을 보여주기 위해서 독립적인HTTP
서버로 설정하거나 자바 에이전트로 섲렁할 수 있는데, 독립적인HTTP
서버로 설정하는 방법을 이용peter-kakfa01
서버 접속JMX 익스포터
를 저장할 디렉토리 생성git 클론
https://aws.amazon.com/amazon-linux-2/ 28 package(s) needed for security, out of 30 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-31-4-136 ~]$ sudo mkdir -p /usr/local/jmx [ec2-user@ip-172-31-4-136 ~]$ sudo yum -y install git Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 Package git-2.40.1-1.amzn2.0.1.x86_64 already installed and latest version Nothing to do [ec2-user@ip-172-31-4-136 ~]$ git clone https://github.com/onlybooks/kafka2 'kafka2'에 복제합니다... remote: Enumerating objects: 302, done. remote: Counting objects: 100% (40/40), done. remote: Compressing objects: 100% (17/17), done. remote: Total 302 (delta 26), reused 25 (delta 23), pack-reused 262 오브젝트를 받는 중: 100% (302/302), 27.58 MiB | 13.90 MiB/s, 완료. 델타를 알아내는 중: 100% (74/74), 완료.
jmx-exporter.service
찾아가기[Service] Type=simple Restart=always ExecStart=/usr/bin/java -jar /usr/local/jmx/jmx_prometheus_httpserver-0.13.1-SNAPSHOT-jar-with-dependencies.jar 7071 /usr/local/jmx/jmx_prometheus_httpserver.yml # JMX 익스포터 실행하는 명령어 부분, 현재는 JMX 익스포터가 7071 포트 사용하도록 되어있지만, 다른 포트 번호로 변경 원하면 여기 변경하면됨 (책대로하자)
[Install] WantedBy=multi-user.target ~
sudo amazon-linux-extras install -y docker
# 도커 설치sudo docker version
# 도커 잘 설치되었는지 확인sudo service docker start
# 도커 시작sudo usermod -a -G docker ec2-user
# 권한 부여sudo mkdir -p /etc/prometheus
# 프로메테우스용 디렉토리 생성git clone https://github.com/onlybooks/kafka2
# git 클론sudo cp kafka2/chapter7/prometheus.yml /etc/prometheus/
# 프로메테우스 설정 파일 복사sudo docker run -d --network host -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus
# 프로메테우스 실행sudo docker ps
# 프로메테우스 컨테이너 실행 확인sudo docker run -d --network host -p 3000:3000 --name grafana grafana/grafana:7.3.7
# 그라파나 설치sudo docker ps
# 그라파나 설치 확인sudo mkdir -p /usr/local/jmx
# JMX 디렉토리 생성sudo cp kafka2/chapter7/jmx_prometheus_httpserver-0.13.1-SNAPSHOT-jar-with-dependencies.jar /usr/local/jmx
# JMX 프로퍼티 복사sudo cp kafka2/chapter7/jmx_prometheus_httpserver.yml /usr/local/jmx
# JMX 프로퍼티 복사sudo cp kafka2/chapter7/jmx-exporter.service /etc/systemd/system
# JMX 프로퍼티 복사sudo systemctl daemon-reload
# 데몬 재시작sudo systemctl start jmx-exporter
# jmx-exporter 시작sudo systemctl status jmx-exporter
# 상태 확인node-exporter
설치프로메테우스 설정파일 분석
프로메테우스 설정 정상 반영 확인
그라파나 접속
http://15.165.76.254:3000/login
-> ansbile의 public IP로 접속하면됨, 초기 암호 admin/adminAdd your first data source
선택Prometheus
선택peter-ansible.foo.bar
로 호스트파일에 등록했습니다. host 파일에 등록한 도메인명으로 설정해주세요.Import via grafana.com
에 1860 입력 -> Load 버튼 클릭 -> Promethus 선택 -> Import 버튼 클릭JMX 모니터링 지표
카프카 익스포터
JMX Metric
,브로커 리스소 모니터링
도 중요하지만,컨슈머 LAG
을 모니터링하는 것도 중요