Open hubtwork opened 1 month ago
카프카의 모든 지표값은 자바 관리 확장(JMX) 인터페이스를 통해 사용할 수 있다. 외부 모니터링 입장에서 이를 사용하는 가장 쉬운 방법은 해당 모니터링 시스템에서 제공하는 메트릭 수집 에이전트를 가져다 카프카 프로세스에 붙이는 것.
어느 지표가 중요하느냐의 문제? 케이스 바이 케이스다.
브로커 내부를 개발하는 사람이 필요로 하는 지표는 카프카를 설치하고 운영하는 사이트 신뢰성 엔지니어가 필요로 하는 지표와는 크게 다를 것.
카프카로부터 어떠한 지표를 수집하던 간에 상태 검사를 통해 애플리케이션 프로세스가 살아있는지의 여부를 모니터링 할 수 있어야 한다.
방법
방법중 마지막에 있는 방법이 잘 작동하더라도 브로커 장애인지 모니터링 시스템 그 자체에 장애인지 구분하기 어렵다.
모니터링에서 다뤄야할 중요한 부분 중 하나는 서비스 수준 목표(SLO)이다.
- 클라이언트와 제공되어야 할 인프라스트럭처 서비스의 수준에 대해 이야기하는 수단
카프카에 있어서의 SLO를 논하기 전 사용되는 용어를 먼저 짚고 가자.
서비스 수준 지표(Service-Level Indicator)
서비스 수준 목표 or 서비스 수준 한계 (Service-Level Threshold)
서비스 수준 협약 (Service-Level agreement)
SLO를 SLA라 부르는 것은 매우 흔한 일
SLO를 정해 놓으면 클라이언트 입장에서는 카프카가 어떻게 작동할 것인지에 대해 덜 가정할 수 있어 SLO가 항상 안 정해지는 것은 아님.
일반적으로 SLI에 연관된 지표는 카프카 브로커 외부에 있는 어디간에서 수집되어야 한다.
SLO는 사용자의 만족 여부를 가리켜야 하고, 주관적인 것인 만큼 측정할 수 없기 때문이다. 따라서 SLI를 기준으로 볼 때 인프라스트럭처 지표는 사용해도 괜찮고, 특수 클라이언트 지표는 좋은 수준이며, 일반 클라이언트 지표는 아마도 가장 좋은 지표일 것이다.
요청 / 응답 혹은 데이터 저장 시스템에 흔히 쓰이곤 하는 SLI 종류
중요 : SLI가 SLO의 문턱값 아래 실제 측정값을 근거로 정하는 게 좋다는 점을 명심
중요 : 각 이벤트는 SLO 문턱값 아래에 있는지 개별적으로 확인할 수 있어야 함
위 중요를 기준으로 변위치(quantile) 지푯값은 좋은 SLI가 못 된다.
SLO는 주된 경보로 설정되어 있어야 한다.
SLO는 사용자의 관점에서 문제를 기술하는 것이고, 운영하는 사람 입장에서는 가장 먼저 고려해야 하기 때문에 그렇다.
대부분 카프카의 개발자들이 특정한 이슈, 나중에 디버깅에 사용할 목적으로 만든 저수준 지표.
브로커의 거의 모든 작동에 관한 정보를 제공하는 지표도 있지만, 가장 일반적으로 사용되는 것들은 평소 카프카를 싱핼하는데 필요한 정보를 제공.
카프카 클러스터에 문제가 있을 경우, 크게 3가지 종류가 있다.
- 단일 브로커에서 발생하는 문제
- 과적재된 클러스터에서 발생하는 문제
- 컨트롤러 문제
카프카 모니터링에 있어서 가장 자주 쓰이는 지표 중 하나는 불완전 복제 파티션이다.
해당 측정값은 클러스터에 속한 브로커 단위로 집계, 해당 브로커가 리더 레플리카를 잡고 있는 파티션 중 팔로워 레플리카가 따라오지 못하고 있는 파티션의 수를 나타낸다.
이 지표는 브로커 정지에서부터 자원 고갈에 이르기까지, 카프카 클러스터에서 발생하는 많은 문제에 대한 통찰력을 준다.
지표와 관련된 불완전 복제 파티션
다수의 브로커가 일정한 수의 불완전 복제 파티션을 가지고 있다는 것은 보통 클러스터의 브로커 중 하나가 내려가 있다는 것을 의미
불완전 복제 파티션의 수가 오르락 내리락 하거나, 수는 일정한데 내려간 브로커가 없다면 클러스터의 서능 문제가 원인이다.
부하 불균형 : 가장 찾기 쉽지만 해결하는 것은 상당히 복잡하다.
자원 고갈
클러스터에서 흔히 볼 수 있는 또 다른 문제
많은 경우 위 자원 중 어느 하나라도 고갈되면 불완전 복제 파티션이 발생
카프카 브로커 지표에 신경 쓰는 한, 전 토픽 바이트 인입률은 클러스터 사용량을 보여주는 좋은 가이드라인이다.
활성 컨트롤러 수
컨트롤러 큐 크기
요청 핸들러 유휴 비율
요청 핸들러 유휴 비율 지표는 요청 핸들러가 작동 중이지 않은 시간 비율을 가린킨다.
이 값이 낮을수록 브로커에 부하가 많이 걸려 있다는 의미.
- 요청 핸드럴 스레드의 수는 시스템의 프로세서 수와 같게 설정해야 한다.
- 카프카 0.10 이전까지 요청 핸들러는 모든 입력 메시지 배치를 재압축하는 일까지 전부 다 수행했는데 버전 0.10부터 메시지 배체이 상대적인 오프셋을 할당할 수 있도록 하는 새로운 메시지 형식이 도입, 이에 따라 새로운 프로듀서가 메시지 배치를 전송하기 전 상대적인 오프셋을 할당하게 됨으로써 브로커는 메시지 배치를 재압축 단계를 생략 가능하다.
전 토픽 바이트 인입
초당 바이트로 나타내어지는 전 토픽 바이트 인입 속도는 브로커가 프로듀서 클라이언트로부터 얼마나 많은 메시지 트래픽을 받는지에 대한 측정값으로 유용
언제 확장해야 하는지, 트래픽이 어떻게 증가함에 따라 필요한 다른 작업을 언제 해야하는지를 결정할때 유용, 클러스터의 어느 브로커가 다른 브로커보다 더 많은 트래픽을 받고 있는지 측정할 때도 유용
7개의 지표 속석 중 첫 두개는 측정값은 아니다.
전 토픽 바이트 유출
전 토픽 바이트 유출 속도는 트래픽의 전체적인 성장세를 보여주는 또 다른 지표.
전 토픽 메시지 인입
메시지 인입 속도는 메시지 크기와 무관하게 초당 들어오는 메시지 수를 보여준다.
파티션 수
브로커에 할당된 파티션의 전체 개수, 브로커에 저장된 모든 레플리카를 포함한다.
리더 수
리더 수 지표는 브로커가 현재 리더를 맡고 있는 파티션의 개수를 보여준다.
오프라인 파티션
불완전 복제 파티션 수와 마찬가지로 오프라인 파티션 수는 모니터링에 있어서 매우 중요한 지표.
이 측정 값은 클러스터 컨트롤러 역할을 맡고 있는 브로커에서만 제공되는데, 현재 리더가 없는 파티션의 개수를 보여준다.
요청 지표
카프카 프로토콜에는 많은 요청이 있는데 각 요청이 어떻게 수행되고 있는지에 대한 지표 역시 제공된다. 책 : 401페이지 확인
토픽별 지표
모든 토픽별 지표의 측정값은 앞에서 설명한 브로커 지표와 매우 비슷
유일한 차이점은 토픽 이름을 지정해야 한다는 점..
파티션별 지표
지속적 사용 기준으로 보면 파티션별 지표는 토픽별 지표에 비해 덜 유용하다.
몇몇 제한된 상황에서는 유용하다.
- 해당 파티션에 대해 현재 디스크에 저장된 데이터의 양을 바이트 단위로 보여주는데 이를 합산하면 하나의 토픽에 저장된 데이터의 양을 알 수 있다.
JVM을 포함한 모든 서버의 표준적인 측정값도 모니터링 해야한다.
브로커의 성능을 발목잡을 수 있는 가비지 수집 증가와 같은 상황에 대해 경고해 줄 수 있다는 점에서 유용할 것
가비지 수집
자바 운영체제 모니터링
JVM은 java.lang:type=OperationgSystem 빈을 통해서 운영체제에 대한 일부 정보를 제공할 수 있다.
이 정보는 제한적이기 때문에 브로커를 돌리고 있는 시스템에 대해 알아야 하는 모든 정보를 제공해주지는 않는다.
여기서 수집되는 속성 중 운영체제에서는 수집하기 어련운 두개가 있는데
- MaxFileDescriptorCount, OpenFileDescriptorCount 이다.
모든 로그 세그먼트와 네트워크 연결별로 FD가 열리기 때문에 OpenFileDescriptorCount 값을 빠르게 늘어 날 수 있다.
운영체제 정보중 CPU 사용, 메모리 사용, 디스크 사용, 디스크 I/O, 네트워크 사용을 눈여겨 봐야한다.
kafka.controller : 컨트롤러에 대한 메세지를 제공하기 위해 사용 : Level = INFO
kafka.server.ClientQuotaManager : 프로듀서 혹은 컨슈머 쿼터 작업에 관련된 메세지를 보여주기 위해 사용, 주 브로커 로그 파일에는 포함되지 않도록 하는 것이 좋음 : Level = INFO
kafka.log.LogCleaner, kafka.log.Cleaner, kafka.log.CleanerManager : 스레드에 대한 상태 정보가 찍히게 할 수 있음, 압착되는 각 파티션 크기나 메시지 수 등에 대한 정보를 포함 : Level = DEBUG
kafka.request.logger : 브로커로 들어오는 모든 요청에 대한 정보를 기록, 디버깅 할 때 가장 유용 : Level = DEBUG, TRACE
모든 프로듀서 지표는 빈 이름에 프로듀서 클라이언트의 클라이언트 ID를 갖는다.
이름 : JMX MBean
프로듀선 전반 : kafka.producer:type=producer-metrics, client-id=CLIENTID
브로커별 : kafka.producer:type=producer-node-metrics, client-id=CLIENTID, nodeid=node-BROKERID
토픽별 : kafka.producer:type=producer-topic-metrics, client-id=CLIENTID, topic=TOPICNAME
프로듀서 종합 지표
메시지 배치 크기에서부터 메모리 버퍼 활용에 이르기까지 모든 것들을 나타내는 속성을 제공
브로커별, 토픽별 지표
지속적으로 살펴볼 만한 것은 아니다..
단순히 메시지를 브로커로 쏘아 보내는 것보다 좀 더 복잡한 만큼 다뤄야 할 지표도 조금 더 많다.
읽기 매니저 지표
브로커별 토픽별 지표
컨슈머 코디네이터 지표
그룹 멤버 합류, 그룹 멤버십을 유지하기 위해 브로커로 하트비트 메시지를 보내는 것이 여기로 들어간다.
몇개의 지표만 장기적으로 보면된다.
하나의 클라이언트가 전체 클러스터를 독차지하는 것을 방지하기 위해 클라이언트 요청을 스로틀링 하는 기능을 가지고 있다.
이는 프로듀셔, 컨슈머 양쪽 다 설정 가능한데, 각 클라이언트 ID에서부터 각 브로커까지 허용된 트래픽 형태로 표시된다.
컨슈머에 있어서 가장 중요하게 모니터링 되어야 하는 것은 컨슈머 랙이다.
컨슈머 랙은 메시지의 수로 측정되는데, 정확한 정의는 프로듀서가 특정 파티션에 마지막으로 쓴 메시지와 컨슈머가 마지막으로 읽고 처리한 메시지 사이의 차이다.
컨슈머 랙 지표는 외부 모니터링을 사용하는 것이 클라이너트 자체적으로 제공하는 것보다 훨씬 나은 경우 중 하나이다.
가장 지연이 심한 하나의 파티션만 나타내기 때문에 컨슈머가 얼마만큼 뒤처져 있는지 정확하게 보여주지 않는다.
읽기 요청이 나갈 때마다 지푯값이 계산되기 때문에 컨슈머가 정상 작동하고 있어야 한다는 전제도 필요하다.
컨슈머에 문제가 생기거나 오프라인 상태가 되면 이 지표는 부정확하거나, 아예 사용 불능이 될 수도 있다.
랙 모니터링 선호 방법
카프카 클러스터의 작동 상태에 대한 클라이언트의 관점을 제공
컨슈머와 프로듀서 클라이언트는 카프카 클러스터에 뭔가 문제가 있음을 나타낼 수 있는 지표를 가지고 있지만, 이것은 지연의 증가 원인이 무엇인지, 즉 클라이언트 탓인지, 네트워크 탓인지, 아니면 카프카 자체의 문제 때문인지를 알려 주지는 않는다. 뿐만 아니라 이 지표를 사용해서 클러스터가 제대로 작동하는지의 여부를 판단한다면 카프카 클러스터를 운영하는 책임을 지고 있는 경우에도 모든 클라이언트 역시 모니터링해야 한다.
정말로 확인해야 할 것들
카프카 클러스터에 메시지를 쓸 수 있는가?
카프카 클러스터에서 메시지를 읽어 올 수 있는가?
확인 하려면 트래픽을 밀어 넣어봐야 하는데 이것은 합리적이지 않아 수행하는 툴이 있다.
툴 이름 : Xinfra Monitor
- 링크드인의 카프카 팀에서 오픈소스로 공개한 이 툴은 클러스터의 모든 브로커에 걸쳐 있는 토픽에 계속해서 데이터를 쓰고 읽음으로써 브로커별 모니터링을 수행한다.
- 이것은 쓰기 읽기 뿐만 아니라 지연까지도 측정가능하다.
컨슈머 랙 모니터링과 마찬가지로 카프카 브로커는 클라이언트가 클러스터를 문제없이 사용할 수 있는지의 여부를 알려줄 수 없어 외부 모니터링 사용을 적극 권장한다.
해당 장표 정리하면서 링크드인은 정말 카프카로 이것저것 다 하는 미친 사람들 이라는 걸 알았고, 다양한 지표들도 확인하면서 중요도가 높은 순, 중요도가 낮은 순, 알림을 보낼지 말지에 대한 여부도 확실히 판단 할 수 있었다.
결론 : 링크드인 킹갓...
저는 오늘 14장 스트림 장을 읽었어요. 저는 바보에요.
카프카를 사용하며 시스템이 확장되는만큼 시스템에 맞춰 모니터링 또한 확장시킬 수 있어야겠다는 생각을 했다. 언제, 어느 상황에, 어느 지점을, 어떻게, 어떤 지표로 모니터링 할 것인지 판단할 수 있어야 할 것 같다.
카프카 SRE 를 위해서는 진짜 SLA 고려를 잘 해야겠다는 건 알겠는데, 각각 개별 하는 방법은 사실 잘 몰랐었다. 그런 면에서 새로운 지식들이 좀 많았고, 그냥 이런게 있구나 하고 넘어가기 좋은 챕터였다.
지금 설계하고 있는 프로젝트에서 카프카를 적극적으로 활용할 예정인데, 꽤나 세부적으로 모니터링을 제공하는 것을 보고 든든했다. 필요하면 개발자 단에서 모니터링도 구현해야할텐데, 참고가 많이 되었다. SLA, SLO, SLT 등 새로운 개념도 좋았다.
Chapter Ownership : @kimsunhak