Amazon MSK #4 모니터링

이번 글은 Amazon 공식 사이트에서 MSK 개발자 가이드 문서를 번역/편집하여 작성 하였습니다.
참고자료 : Welcome to the Amazon MSK Developer Guide – Amazon Managed Streaming for Apache Kafka



4부 에서는 MSK 안정 적인 서비스를 위한 모니터링 방법에 대해 알아 보겠습니다.



MSK 모니터링

Amazon MSK 는 기본적으로 Apache Kafka 지표를 수집하고 이를 CloudWatch 로 보내주어 모니터링 할 수 있습니다. 그리고 오픈 소스인 Prometheus를 이용하여 MSK Cluster를 모니터링 할 수도 있습니다.



MSK 지표 (With CloudWatch)

DEFAULT 모니터링 수준에서 사용 가능한 지표

이름지표 확인 시점수집 대상설명
ActiveControllerCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name클러스터당 하나의 컨트롤러만 활성화
BurstBalance클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID클러스터의 EBS 볼륨에 대한 입-출력 버스트 크레딧의 나머지 잔액(참조 I/O 크레딧 및 버스트 성능)
BytesInPerSec주제를 생성한 후Cluster Name, Broker ID, Topic클라이언트로부터 받은 초당 byte 수
BytesOutPerSec주제를 생성한 후Cluster Name, Broker ID, Topic클라이언트에 전송된 초당 byte 수
ConnectionCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID활성 아파치 카프카 연결 수
CPUCreditBalance클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker의 CPU 크레딧 잔액을 모니터링
CpuIdle클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDCPU 유휴 시간의 백분율
CpuSystem클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID커널 공간에 있는 CPU의 백분율
CpuUser클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID사용자 공간에 있는 CPU의 백분율
GlobalPartitionCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name복제본을 제외한 클러스터의 모든 Topic에 걸쳐 있는 파티션 수
GlobalTopicCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name클러스터의 모든 Broker에 있는 총 Topic 수
EstimatedMaxTimeLag소비자 그룹이 주제에서 소비한 후Consumer group, Topic드레인 예상 시간 (초)MaxOffsetLag.
KafkaAppLogsDiskUsed클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID애플리케이션 로그에 사용된 디스크 공간의 백분율
KafkaDataLogsDiskUsed(Cluster Name, Broker ID차원)클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID데이터 로그에 사용된 디스크 공간의 백분율
KafkaDataLogsDiskUsed(Cluster Name차원)클러스터가 ACTIVE 상태에 도달한 후Cluster Name데이터 로그에 사용된 디스크 공간의 백분율
LeaderCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID복제본을 포함하지 않는 Broker당 파티션의 총 리더 수
MaxOffsetLag소비자 그룹이 주제에서 소비한 후Consumer group, Topic주제의 모든 파티션에 걸친 최대 오프셋 지연
MemoryBuffered클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에 대한 버퍼링된 메모리의 크기(byte)
MemoryCached클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에 대한 캐시 메모리의 크기(byte)
MemoryFree클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에 사용할 수 있는 메모리의 크기(byte)
HeapMemoryAfterGC클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID가비지 수집 후 사용 가능한 총 힙 메모리의 백분율
MemoryUsed클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에서 사용 중인 메모리의 크기(byte)
MessagesInPerSec클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker의 초당 수신 메시지 수
NetworkRxDropped클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID삭제된 수신 패키지의 수
NetworkRxErrors클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에 대한 네트워크 수신 오류 수
NetworkRxPackets클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에서 수신된 패킷 수
NetworkTxDropped클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID삭제된 전송 패키지의 수
NetworkTxErrors클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker의 네트워크 전송 오류 수
NetworkTxPackets클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker가 전송한 패킷 수
OfflinePartitionsCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name클러스터에서 오프라인 상태인 총 파티션 수
PartitionCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID복제본을 포함하여 Broker당 총 주제 파티션 수
ProduceTotalTimeMsMean클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID밀리초 단위의 평균 생산 시간.
RequestBytesMean클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에 대한 요청 byte의 평균 수
RequestTime요청 조절이 적용된 후Cluster Name, Broker IDBroker 네트워크 및 I/O 스레드가 요청을 처리하는 데 소비한 평균 시간(ms)
RootDiskUsed클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker가 사용하는 루트 디스크의 백분율
SumOffsetLag소비자 그룹이 주제에서 소비한 후Consumer group, Topic주제의 모든 파티션에 대한 집계된 오프셋 지연
SwapFree클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에서 사용할 수 있는 스왑 메모리의 크기(byte)
SwapUsed클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에서 사용 중인 스왑 메모리의 크기(byte)
TrafficShaping클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker ID네트워크 할당을 초과하여 삭제된 패킷 수
UnderMinIsrPartitionCount클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker의 minIsr 파티션 수
UnderReplicatedPartitions클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker에 대해 복제가 덜 진행된 파티션 수
ZooKeeperRequestLatencyMsMean클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDApache 평균 지연 시간 ZooKeeper Broker의 요청.
ZooKeeperSessionState클러스터가 ACTIVE 상태에 도달한 후Cluster Name, Broker IDBroker의 ZooKeeper 세션 연결 상태 값NOT_연결됨: ‘0.0’연관 작업: ‘0.1’연결: ‘0.5’연결된 읽기 전용: ‘0.8’연결됨: ‘1.0’닫힘: ‘5.0’인증_실패: ‘10.0’


PER_BROKER 레벨 모니터링

모니터링 레벨을 PER_BROKER로 설정하면 모든 DEFAULT 레벨 지표 외에 다음 표에 설명된 지표를 추가로 수집 합니다. 아래 표의 지표에 대해 비용을 지불 합니다. (단, Default 레벨의 지표는 무료)

PER_BROKER 모니터링 수준부터 사용할 수 있는 추가 지표

이름지표 확인 시점설명
BwInAllowanceExceeded클러스터가 ACTIVE 상태에 도달한 후인바운드 집계 대역폭이 Broker의 최대값을 초과하여 형성된 패킷 수
BwOutAllowanceExceeded클러스터가 ACTIVE 상태에 도달한 후아웃바운드 집계 대역폭이 Broker의 최대값을 초과하여 형성된 패킷 수
ConnTrackAllowanceExceeded클러스터가 ACTIVE 상태에 도달한 후연결 추적이 Broker의 최대값을 초과하여 형성된 패킷 수
ConnectionCloseRate클러스터가 ACTIVE 상태에 도달한 후리스너당 초당 닫힌 연결 수
ConnectionCreationRate클러스터가 ACTIVE 상태에 도달한 후리스너당 초당 설정된 새 연결 수
CpuCreditUsage클러스터가 ACTIVE 상태에 도달한 후이 지표는 인스턴스의 CPU 크레딧 사용량을 모니터링
FetchConsumerLocalTimeMsMean생산자/소비자가 만들어진 이후소비자 요청이 리더에서 처리되는 평균 시간(ms)
FetchConsumerRequestQueueTimeMsMean생산자/소비자가 만들어진 이후소비자 요청이 요청 대기열에서 대기하는 평균 시간(ms)
FetchConsumerResponseQueueTimeMsMean생산자/소비자가 만들어진 이후소비자 요청이 응답 대기열에서 대기하는 평균 시간(ms)
FetchConsumerResponseSendTimeMsMean생산자/소비자가 만들어진 이후소비자가 응답을 보내는 평균 시간(ms)
FetchConsumerTotalTimeMsMean생산자/소비자가 만들어진 이후소비자가 Broker에서 데이터를 가져오는 데 소요하는 평균 총 시간(ms)
FetchFollowerLocalTimeMsMean생산자/소비자가 만들어진 이후팔로어 요청이 리더에서 처리되는 평균 시간(ms)
FetchFollowerRequestQueueTimeMsMean생산자/소비자가 만들어진 이후팔로어 요청이 요청 대기열에서 대기하는 평균 시간(ms)
FetchFollowerResponseQueueTimeMsMean생산자/소비자가 만들어진 이후팔로어 요청이 응답 대기열에서 대기하는 평균 시간(ms)
FetchFollowerResponseSendTimeMsMean생산자/소비자가 만들어진 이후팔로어가 응답을 보내는 평균 시간(ms)
FetchFollowerTotalTimeMsMean생산자/소비자가 만들어진 이후팔로어가 Broker에서 데이터를 가져오는 데 소비하는 평균 총 시간(ms)
FetchMessageConversionsPerSec주제를 생성한 후Broker의 초당 가져오기 메시지 변환 횟수
FetchThrottleByteRate대역폭 조절이 적용된 후초당 병목 현상 바이트 수
FetchThrottleQueueSize대역폭 조절이 적용된 후조절 대기열에 있는 메시지 수
FetchThrottleTime대역폭 조절이 적용된 후평균 가져오기 조절 시간(ms)
NetworkProcessorAvgIdlePercent클러스터가 ACTIVE 상태에 도달한 후네트워크 프로세서가 유휴 상태인 시간의 평균 백분율
PpsAllowanceExceeded클러스터가 ACTIVE 상태에 도달한 후양방향 PPS가 Broker의 최대값을 초과하여 형성된 패킷 수
ProduceLocalTimeMsMean클러스터가 ACTIVE 상태에 도달한 후팔로어가 응답을 보내는 평균 시간(ms)
ProduceMessageConversionsPerSec주제를 생성한 후Broker의 초당 생산 메시지 변환 수
ProduceMessageConversionsTimeMsMean클러스터가 ACTIVE 상태에 도달한 후메시지 형식 변환에 소요된 평균 시간(ms)
ProduceRequestQueueTimeMsMean클러스터가 ACTIVE 상태에 도달한 후요청 메시지가 대기열에 소비하는 평균 시간(ms)
ProduceResponseQueueTimeMsMean클러스터가 ACTIVE 상태에 도달한 후응답 메시지가 대기열에서 소비하는 평균 시간(ms)
ProduceResponseSendTimeMsMean클러스터가 ACTIVE 상태에 도달한 후응답 메시지를 보내는 데 소비한 평균 시간(ms)
ProduceThrottleByteRate대역폭 조절이 적용된 후초당 병목 현상 바이트 수
ProduceThrottleQueueSize대역폭 조절이 적용된 후조절 대기열에 있는 메시지 수
ProduceThrottleTime대역폭 조절이 적용된 후평균 생산 조절 시간(ms)
ProduceTotalTimeMsMean클러스터가 ACTIVE 상태에 도달한 후밀리초 단위의 평균 생산 시간.
ReplicationBytesInPerSec주제를 생성한 후다른 Broker로부터 받은 초당 바이트 수
ReplicationBytesOutPerSec주제를 생성한 후다른 Broker에 전송된 초당 바이트 수
RequestExemptFromThrottleTime요청 조절이 적용된 후Broker 네트워크 및 I/O 스레드가 조절에서 제외된 요청을 처리하는 데 소비한 평균 시간(ms)
RequestHandlerAvgIdlePercent클러스터가 ACTIVE 상태에 도달한 후요청 핸들러 스레드가 유휴 상태인 시간의 평균 백분율
RequestThrottleQueueSize요청 조절이 적용된 후조절 대기열에 있는 메시지 수
RequestThrottleTime요청 조절이 적용된 후평균 요청 조절 시간(ms)
TcpConnections클러스터가 ACTIVE 상태에 도달한 후SYN 플래그가 설정된 수신 및 나가는 TCP 세그먼트 수를 표시
TrafficBytes클러스터가 ACTIVE 상태에 도달한 후클라이언트 (생산자 및 소비자) 와 Broker 간의 네트워크 트래픽을 전체 바이트로 표시
VolumeQueueLength클러스터가 ACTIVE 상태에 도달한 후지정된 기간 동안 완료 대기 중인 읽기 및 쓰기 작업 요청 수
VolumeReadBytes클러스터가 ACTIVE 상태에 도달한 후지정된 시간 동안 읽은 바이트 수
VolumeReadOps클러스터가 ACTIVE 상태에 도달한 후지정된 기간의 읽기 작업 수
VolumeTotalReadTime클러스터가 ACTIVE 상태에 도달한 후지정된 기간 동안 완료된 모든 읽기 작업에서 사용한 총 시간(s) 
VolumeTotalWriteTime클러스터가 ACTIVE 상태에 도달한 후지정된 기간 동안 완료된 모든 쓰기 작업에서 사용한 총 시간(s) 
VolumeWriteBytes클러스터가 ACTIVE 상태에 도달한 후지정된 기간에 기록된 바이트 수
VolumeWriteOps클러스터가 ACTIVE 상태에 도달한 후지정된 기간의 쓰기 작업 수


PER_TOPIC_PER_BROKER 레벨 모니터링

모니터링 레벨을 PER_TOPIC_PER_BROKER 로 설정하면 모든 PER_BROKER 및 모든 DEFAULT 레벨 지표 외에 다음 표에 설명된 지표를 추가로 수집 합니다. 아래 표의 지표에 대해 비용을 지불 합니다. (단, Default 레벨의 지표는 무료)

중요

Apache Kafka 2.4.1 이상 버전을 사용하는 Amazon MSK Cluster의 경우 다음 표의 지표는 해당 값이 처음으로 0이 아닌 값이 된 후에만 나타납니다.

PER_TOPIC_PER_BROKER 모니터링 수준부터 사용할 수 있는 추가 지표

이름지표 확인 시점설명
FetchMessageConversionsPerSec주제를 생성한 후초당 가져와서 변환한 메시지 수
MessagesInPerSec주제를 생성한 후초당 수신된 메시지 수
ProduceMessageConversionsPerSec주제를 생성한 후생산된 메시지의 초당 변환 수


PER_TOPIC_PER_PARTITION 레벨 모니터링

모니터링 레벨을 PER_TOPIC_PER_PARTITION 설정한 경우 모든 PER_TOPIC_PER_BROKER 지표 외에 다음 표에 설명된 지표를 추가로 수집 합니다. 아래 표의 지표에 대해 비용을 지불 합니다. (단, Default 레벨의 지표는 무료)

PER_TOPIC_PER_PARTITION 모니터링 수준부터 사용할 수 있는 추가 지표

이름지표 확인 시점설명
EstimatedTimeLag소비자 그룹이 주제에서 소비한 후오프셋 Lag을 배출하는 시간(s)
OffsetLag소비자 그룹이 주제에서 소비한 후오프셋 수의 파티션 레벨 Consumer Lag 수


Prometheus 모니터링

  • Prometheus 를 사용하여 MSK Cluster를 모니터링 할 수 있습니다. Prometheus의 remote 쓰기 기능을 사용하여 이 데이터를 Prometheus용 Amazon Managed Service에 게시 할 수 있습니다.
  • Datadog, Lenses, New Relic 및 Sumo Logic 과 같이 Prometheus 형식의 지표와 호환되는 Tool 또는 Amazon MSK Open Monitoring과 통합되는 Tool을 사용할 수도 있습니다.
  • Open 모니터링은 무료로 사용할 수 있지만 A-Z영역 간에 데이터를 전송하는 경우 네트워크 비용이 부과됩니다.


Open Monitoring – Prometheus 구성


사전에 MSK cluster 가 구축 되어있어야 합니다.

(선택 사항) 1단계 – 기존 클러스터에서 개방형 모니터링 활성화

개방형 모니터링을 사용하기 위해 활성화가 필요합니다. 모든 Cluster는 기본적으로 비활성화 되어 있습니다.

  1. 모니터링하려는 Amazon MSK 클러스터가 있는 계정에 로그인합니다.
  2. Amazon MSK 클러스터 콘솔 열기
  3. 모니터링을 활성화하려는 Amazon MSK 클러스터를 클릭합니다.
  4. 모니터링 섹션 으로 스크롤
  5. Open Monitoring을 이미 활성화한 경우 다음과 유사한 화면이 표시 됩니다. (2단계를 진행합니다)
  6. Open Monitoring을 활성화하지 않은 경우 다음과 유사한 화면이 표시됩니다.
  7. 개방형 모니터링 활성화
    • 모니터링 헤더 오른쪽에 있는 ‘편집’ 버튼을 클릭합니다.
    • Enable open monitoring with Prometheus확인란 선택
    • JMX Exporter및 Node Exporter확인란 을 선택합니다 .
    • 딸깍 하는 소리Save Changes
  8. 이렇게 하면 클러스터에 대한 구성 업데이트가 트리거 되며 적용하는 데 몇 분 정도 걸립니다. 아래와 같이 녹색 바가 가득 채워 지면 완료 입니다.


2단계 – 모니터링 액세스를 허용하는 보안 그룹 규칙 생성

  1. MSK_Monitoring규칙 없이 호출되는 새 SG 만들기
    • EC2 서비스를 연 다음 Security Groups왼쪽 탐색 창에서 선택
    • Create Security Group화면 상단에서 클릭
    • 이름을 입력하세요 (예: MSK_Monitoring)
    • 설명을 입력하세요. (예: Access to MSK monitoring from monitoring services)
    • Amazon MSK Cluster가 있는 VPC 선택
    • Create 클릭
    • 예시:
  2. SG(MSK Workshop Service) 에 2개의 새로운 규칙을 추가 합니다.
    • EC2 서비스를 연 다음 보안 그룹으로 이동합니다.
    • MSKWorkshop-KafkaService 아래에서 Edit 클릭 하고 다음 규칙을 추가 합니다.
      • Type: Custom TCP
      • Port range: 11001-11002
      • Source: MSK_Monitoring security group
      • Description: Prometheus monitoring
    • 예시:
  3. MSK_Monitoring SG를 KafkaClientInstance 인스턴스 및 Cloud9 인스턴스에 연결합니다.
    • EC2 콘솔을 열고 인스턴스로 이동합니다.
    • KafkaClientInstance 호스트 선택
    • 상단 바에서 Actions 선택
    • Security > Change Security Groups 클릭
    • MSK_Monitoring보안 그룹을 검색하여 선택 하고Add security group
    • 오른쪽 하단에 있는 Save 클릭
    • Cloud9 인스턴스에 대해 동일한 작업을 수행합니다.


3단계 – Run Prometheus using Docker

간단하게 구축해보기 위해 Docker를 이용합니다.

  1. Cloud9을 사용하여 셸 열기
    • 이 실습의 대부분은 Cloud9 Bash 창에서 작업하게 됩니다. 일반 bash 환경이지만 누락된 것을 사용하려면 도구를 수동으로 설치해야 할 수도 있습니다.
  2. prometheus 디렉토리를 생성 합니다.
  1. 서비스 구성 파일 생성
    프로메테우스 서버 구성 생성 : 

~/prometheus/prometheus.yml

  1. Json 파일을 생성 합니다 : ~/prometheus/targets.json (broker_dns_[1,2,N] 부분을 수정합니다)

예시

  1. Prometheus 를 실행 합니다.
    • 컨테이너를 풀다운하고 실행하여 위에서 만든 구성 파일을 컨테이너에 올리고 포트 9090를 사용합니다.
      sudo docker run -d -p 9090:9090 –name=prometheus -v /home/ec2-user/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /home/ec2-user/prometheus/targets.json:/etc/prometheus/targets.json prom/prometheus –config.file=/etc/prometheus/prometheus.yml
    • 완료 되면 컨테이너 ID를 반환합니다. (예시)
      db5fa73d5a197935cd7294b1db5b3a4d9057afe0ff2624514d28787fb3f778e6
  2. Cloud9 인스턴스의 SG를 업데이트 합니다.
    • Rule 1 – Prometheus
      • Type: Custom TCP
      • Port Range: 9090
      • Source: MyIP, Cloud9 SG id
      • Description: Prometheus
    • Rule 2 – Grafana
      • Type: Custom TCP
      • Port Range: 3000
      • Source: MyIP
      • Description: Grafana
    • 예시


4단계 – Prometheus 연결

  1. 콘솔에서 EC2 서비스로 전환하고 “aws-cloud9-msklab…” 인스턴스를 클릭한 다음 아래 창에서 IPv4 퍼블릭 IP 주소를 복사합니다.
    • 웹 브라우져에서 http://IP:9090 으로 접속 합니다.
  2. Prometheus WEB 에서 kafka 로 검색하면 지표를 확인 할 수 있습니다.

4부 에서는 Amazon MSK 모니터링을 위한 4가지 설정의 CloudWatch 지표와 Open Monitoring 을 이용해 Prometheus 를 연결 하여 보았습니다.

기본으로 제공하는 지표를 제외한 PER_BROKER, PER_TOPIC_PER_BROKER, PER_TOPIC_PER_PARTITION 설정에서는 비용이 추가 되니 꼭 필요한 상황에서만 설정해서 사용 하시길 바랍니다.



Amazon MSK 서비스를 알아보면서…

Amazon 에서 제공하는 Apache Kafka 서비스는 AWS 의 방향성에 맞는 애플리케이션 코드 개발에 더욱 힘을 쓸 수 있도록 인프라 유지보수, 서비스 확장성 등 관리적인 측면에서 많은 항목을 매니지먼트 해주는 서비스 였습니다. 데이터 메세지를 실시간으로 스트림 해야 하는 Kafka를 꼭 사용해야 하는 Architecture 에서 구축 담당자나 운영 담당자가 없는 경우 매우 쉽고 편리하게 사용하면 좋을 것 같습니다.



참고 사이트