Effective/Effective Debugging

[ED] 27. 독립적인 프로세스로 구성된 시스템에서 모니터링 도구 사용하기

seeyoun 2024. 11. 19. 01:26

요즘 소프트웨어 시스템 중에서 단 하나의 프로그램으로만 구성된 것은 거의 없다.

  • 대부분의 시스템을 여러 서비스와 컴포넌트, 라이브러리로 구성되어 있다.
  • 따라서 어느 부분에서 오류가 발생했는지 신속하고 효율적으로 알아내는 것이 중요하다.

 


서버 시스템에서는 인프라스트럭처 모니터링 시스템을 구축하면 문제의 발생 지점을 쉽게 찾을 수 있다.

  • 모니터링 환경을 구축하여 개발하고자 하는 서비스에 관련된 모든 부분의 상태를 지속적으로 확인한다.
  • 책에서는 Nagios를 소개하지만, 좀더 대규모 서버를 모니터링하기에 적합한 현대적인 모니터링 시스템들이 되게 많다.
    • Zabbix
    • Prometheus + Grafana

 


암튼 모니터링 방법은!

  • 발생한 문제를 정확히 집어내려면 애플리케이션을 구성하는 스택 전체를 모니터링해야 한다.
    • 가장 먼저 시스템을 구성하는 호스트에서 가장 낮은 레벨에 해당하는 자원의 상태부터 모니터링한다.
      • CPU 부하량, 메모리 사용량, 네트워크 도달 가능성, 실행 중인 프로세스 및 로그인한 사용자 수, 가용한 소프트웨어 업데이트, 디스크 여유 공간, 사용 중인 네트워크 및 디스크 대역폭, 시스템 로그, 보안, 원격 접속 ...
    • 이후 애플리케이션 구동에 필요한 서비스들을 모니터링한다.
      • 데이터베이스, 이메일 서버, 애플리케이션 서버, 캐시, 네트워크 연결, 백업, 큐, 메시징, 소프트웨어 라이선스, 웹 서버, 디렉토리 서비스 ...
    • 마지막으로 애플리케이션의 상태를 상세히 모니터링 한다.
      • 어플리케이션의 엔드 투 엔드(end-to-end) 가용성
        • ex) 웹 폼을 완성하면 전체 트랜잭션을 완성하는지 여부
      • 웹 서비스, 데이터베이스 테이블, 정적 웹 페이지, 인터랙티브 웹 폼, 리포팅 서비스 등과 같이 어플리케이션을 구성하는 요소들
      • 응답 지연 시간, 큐에 저장되거나 완료된 명령, 활동 중인 사용자의 수, 실패한 트랜잭션, 발생한 에러, 리포팅 된 충돌 사항 등과 같이 핵심적인 측정 지표

 


장애가 발생하는 즉시 알림을 보내도록 설정하면 에러가 나타난 상태에서 디버깅 작업을 수행할 수 있다.

  • 원하는 알림 기능을 현재 사용하는 모니터링 시스템에서 제공하지 않는다면, 알림을 제공하는 코드를 작성하면 된다.

 


오류 발생 내역을 분석하면 문제의 원인을 정확히 찾아내는 데 도움되는 패턴을 도출할 수 있다.

  • 장애가 어디서 발생했는지 면밀히 분석하다 보면 장애를 유발한 다양한 요인들을 밝혀낼 수 있다.
  • 전체 스택을 모니터링하다 보면 스택의 아랫단에서 발생한 장애가 위로 전파되면서 다른 형태의 문제를 일으키는 경우도 볼 수 있다.
    • 이럴 때는 문제가 발생한 요소 중 가장 로우 레벨에 있는 것부터 분석하는 것이 좋다.