ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 왔노라, 보았노라, 모니터링 했노라 : 제로부터 시작하는 모니터링 시스템 구축
    개발/그 외 2025. 3. 20. 13:48

    내가 생각하는 모니터링

    이전 글 "달리는 자동차의 타이어를 교체하기 : Stored Procedure 기반 데이터 접근 방식에서 ORM 기반으로 전환 (1)" (https://na2ru2.tistory.com/46)에서 내가 근무하고 있는 회사의 환경이 어떠한지 간단하게 언급한적이 있다. 우리 회사는 테크 회사가 아니다. 그렇다 보니 체계적으로 애플리케이션들의 상태를 실시간으로 모니터링할 수 있는 시스템이 없는 상태였다. (테크 회사가 아니라고 전산화 수준이 높지 않다는 것은 아니다.)

     

    사실 우리 회사의 서비스는 재난급 트래픽이 몰리는 상황이나, 하드웨어 자원이 턱없이 부족한 상태에서 애플리케이션을 극한으로 최적화해야 하는 극단적인 환경에 놓여있지는 않다. 따라서, 모니터링 시스템을 구축하게 된 특별한 계기나 긴박한 필요성이 있었다고 보기는 어렵다. 다만, AWS EC2 인스턴스의 효율적인 모니터링과 사이즈 조정을 통해 클라우드 비용을 절감하려는 작은 목표가 있었다. 이를 시작으로, 보다 체계적이고 강력한 모니터링 시스템을 구축하기로 했다.

    본격적으로  함께 모니터링 시스템을 구축해보자

    먼저 필요한 도구를 선정하기 위해 시스템을 분석해보도록 하자. 우리 회사의 애플리케이션들은 컨테이너 기반 환경에서 운영되며, 각 애플리케이션은 독립적인 Docker 컨테이너로 배포되고 있다. 이러한 환경에서는 개별 컨테이너의 리소스 사용량을 모니터링하고, 전체 시스템의 성능을 최적화할 수 있는 체계적인 접근 방식이 필수적이다. 또한, 데이터베이스는 AWS EC2 인스턴스에서 운영되고 있으며, Windows 서버도 포함되어 있어 다양한 운영 체제 환경에서의 모니터링이 요구된다. 따라서 cAdvisor, Prometheus, Windows Exporter, Grafana와 같은 도구들을 활용한 모니터링 시스템을 구축하고자 한다.

     

    cAdvisor
    cAdvisor는 Google에서 개발한 오픈소스 도구로, 실행 중인 Docker 컨테이너의 리소스 사용량과 성능 정보를 수집하고 분석한다. 이를 통해 CPU, 메모리, 디스크 I/O, 네트워크 사용량 등의 메트릭을 실시간으로 모니터링할 수 있다. 

    Prometheus

    Prometheus는 시계열 데이터베이스 기능을 갖춘 오픈소스 모니터링 시스템으로, 다양한 메트릭 수집 도구로부터 데이터를 수집하고, 이를 기반으로 강력한 쿼리 기능과 알림 기능을 제공한다.

    Windows Exporter

    Windows Exporter는 Windows 기반 시스템의 하드웨어 및 운영체제 메트릭을 수집하여 Prometheus와 같은 모니터링 시스템에 제공하는 도구이다.

    Grafana

    Grafana는 오픈소스 데이터 시각화 도구로, 다양한 데이터 소스로부터 데이터를 가져와 대시보드 형태로 시각화한다. 사용자는 Grafana를 통해 실시간 모니터링, 알림 설정, 데이터 분석 등을 수행할 수 있다. 또한 Grafana는 다양한 플러그인과 템플릿을 제공하여 사용자 맞춤형 대시보드를 구성할 수 있다.

    먼저 아키텍처를 구상해보자

    On-Premise 환경에서는 Docker를 활용하여 cAdvisor, Prometheus, Grafana를 포함한 모니터링 애플리케이션을 구동할 계획이다. cAdvisor는 컨테이너 리소스 사용량을 실시간으로 수집하고, Prometheus는 메트릭을 저장하는 기능을 제공할 것이다. Grafana는 수집된 데이터를 시각화하여 대시보드를 제공하게 된다. 

     

    클라우드 환경에서는 Amazon EC2에 배포된 SQL Server 인스턴스를 모니터링하기 위해 Windows Exporter를 설치할 예정이다. Windows Exporter는 SQL Server의 성능 지표를 수집하여 Prometheus로 전송하는 역할을 수행하게 된다. EC2에서 실행 중인 SQL Server의 성능 메트릭을 실시간으로 수집하여 On-Premise 환경과 클라우드 환경을 하나의 모니터링 플랫폼에서 통합적으로 관리할 수 있도록 할 계획이다.

     

    전체적인 데이터 흐름은 다음과 같이 예상된다. 먼저 cAdvisor가 On-Premise 서버 내 컨테이너의 CPU, 메모리, 네트워크 등의 성능 데이터를 수집하고, Windows Exporter가 EC2에서 실행 중인 SQL Server의 성능 메트릭을 수집할 것이다. 수집된 데이터는 Prometheus로 전달되어 저장되며, Grafana가 Prometheus 데이터를 시각화하여 대시보드로 제공할 예정이다. 또한 Prometheus의 Alert Manager를 활용하여 이상 징후 발생 시 알람을 전송하여 즉각적인 대응이 가능하도록 할 계획이다.

     

    이러한 시스템을 통해 On-Premise 및 클라우드 환경을 아우르는 통합 모니터링이 가능해질 것이다. 컨테이너 및 서버 자원의 실시간 상태 점검 및 분석이 가능하며, 장애 발생 시 신속한 감지와 대응이 가능할 것으로 예상된다. 또한 데이터 시각화를 통해 보다 효율적인 운영과 관리가 가능해질 것이다. 본 아키텍처는 On-Premise 및 클라우드 환경에서 동작하는 모니터링 시스템을 구축하여 인프라의 가시성을 극대화하는 것을 목표로 한다.

     

    모니터링 시스템 아키텍처

     

    도구 설치 및 배포

    먼저 Docker가 설치된 On-Premise 서버에서 애플리케이션 컨테이너를 실행하는 작업을 진행한다. Docker Compose를 활용하면 .yml 파일을 통해 컨테이너들을 효율적으로 관리할 수 있다.

    vi 편집기를 사용하여 docker-compose.yml 파일을 생성하고 다음 내용을 입력한다.

    services:  # 컨테이너 서비스 목록 정의
    
      cadvisor:  # cAdvisor 서비스 설정 (Docker 컨테이너 모니터링 도구)
        image: gcr.io/cadvisor/cadvisor:v0.47.2  # 사용할 cAdvisor Docker 이미지와 버전 지정
        container_name: cadvisor  # 컨테이너 이름 설정
        ports:
          - "8080:8080"  # [호스트포트:컨테이너포트] 외부에서 접근할 때 8080을 통해 컨테이너 내부의 8080으로 접근
        privileged: true  # 특수 권한 부여 (호스트의 하드웨어 및 cgroup 자원 접근 권한)
        command:  # cAdvisor 실행 시 메트릭 수집 옵션 명시
          - "--enable_metrics=cpu,memory,disk,network"  # CPU, 메모리, 디스크, 네트워크 메트릭 활성화
          - "--disable_metrics=udp,tcp"  # 불필요한 메트릭(UDP, TCP) 비활성화 (성능 최적화)
        volumes:  # 호스트와 컨테이너 간 디렉터리 연결 (볼륨 마운트)
          - /:/rootfs:ro  # 호스트의 루트 디렉터리를 컨테이너 내 /rootfs로 읽기 전용으로 마운트
          - /sys:/sys:ro  # 시스템 관련 정보 수집을 위해 /sys 마운트
          - /var/run:/var/run:ro  # Docker 상태 확인을 위해 /var/run 마운트
          - /var/lib/docker/:/var/lib/docker:ro  # Docker의 메타정보 접근을 위한 디렉터리 마운트
          - /sys/fs/cgroup:/cgroup:ro  # cgroup 관련 데이터 접근을 위한 마운트
          - /dev/disk/:/dev/disk:ro  # 디스크 정보 접근을 위한 디렉터리 마운트
        restart: always  # 컨테이너가 죽으면 항상 자동 재시작
    
      prometheus:  # Prometheus 서비스 (메트릭 데이터 수집 및 저장 도구)
        image: quay.io/prometheus/prometheus:latest  # 사용할 Prometheus 이미지와 버전
        container_name: prometheus  # 컨테이너 이름 설정
        volumes:
          - ./prometheus.yml:/etc/prometheus/prometheus.yml  # Prometheus 설정파일을 컨테이너 내부로 마운트
        ports:
          - "9090:9090"  # 호스트의 9090 포트를 컨테이너의 9090 포트로 연결
        restart: always  # 컨테이너 자동 재시작
    
      grafana:  # Grafana 서비스 (데이터 시각화 대시보드)
        image: grafana/grafana:latest  # Grafana 최신 버전 Docker 이미지
        container_name: grafana  # 컨테이너 이름 설정
        ports:
          - "3000:3000"  # Grafana 웹 대시보드를 외부에서 접근할 포트
        volumes:
          - grafana_data:/var/lib/grafana  # Grafana 데이터를 영구적으로 저장하기 위한 볼륨 연결
        restart: always  # 컨테이너 자동 재시작
    
    volumes:  # 도커 볼륨 목록
      grafana_data:  # Grafana 데이터를 저장할 볼륨 정의

    Prometheus의 설정 파일을 작성하기 위해 vi 편집기를 사용하여 prometheus.yml 파일을 생성하고, 아래 내용을 입력한다. 해당 파일은 docker-compose.yml과 같은 폴더에 위치해야 한다.

    global:
      scrape_interval: 15s  # Prometheus가 메트릭 데이터를 수집하는 주기 (여기서는 15초마다 수집)
    
    scrape_configs:  # 데이터를 수집할 대상(타겟)을 설정하는 섹션
      - job_name: "cadvisor"  # 메트릭 수집 작업의 이름 (Grafana 등에서 이 이름으로 데이터 식별 가능)
        static_configs:  # 고정적으로 관리할 데이터 수집 타겟을 정의
          - targets: ["cadvisor:8080"]  # cAdvisor 컨테이너의 내부 주소와 포트 (Docker 네트워크에서 접근 가능한 이름과 포트)
    
      - job_name: "windows-ec2"
        static_configs:
          - targets: ["IP:PORT"] # Windows Exporter가 메트릭을 보내고 있는 주소와 포트를 입력해주면 된다.

    아래 명령어를 통해 Docker Compose를 실행하여 컨테이너를 배포한다.

     

    # 도커 컴포즈 실행 명령어 -f를 통해 스크립트 지정
    sudo docker compose -f docker-compose.yml up -d
    # 위 명령어가 되지 않는다면 docker-compose -f docker-compose.yml up -d로도 시도해보자

    이제 cAdvisor, Prometheus, Grafana가 정상적으로 실행될 것이며, 이를 통해 컨테이너 모니터링 환경이 구축될 예정이다.

     

    이제 정상적으로 세팅되었으니 cAdvisor, Prometheus, Grafana에 차례로 접속해보자

    서비스명 접속 주소
    cAdvisor http://서버_주소:8080
    Prometheus http://서버_주소:9090
    Grafana http://서버_주소:3000

    접속이 잘 되는 것이 확인되었다면, 이제 EC2 내 윈도우 서버의 메트릭을 전송해 줄 Windows Exporter를 설치할 차례이다.

    먼저, RDP(Remote Desktop Protocol)를 사용하여 EC2 인스턴스에 접속한 후, 웹 브라우저에서 Windows Exporter의 최신 버전을 다운로드한다. 다운로드한 설치 파일을 실행하여 Windows Exporter를 설치한 후, 정상적으로 실행되는지 확인한다. 이를 위해 웹 브라우저의 주소창에 인스턴스의 퍼블릭 IP와 설치 시 지정한 Windows Exporter의 포트 번호를 입력하면, 메트릭 정보가 정상적으로 출력되는 것을 확인할 수 있다.

     

    그러면 이제 Grafana 접속하여 Dashboard를 세팅할 일만 남았다.

    http://서버_주소:3000로 들어가 로그인 해준다 (초기 계정 ID: admin PW: admin)

    Data Source 연결

    Windows Exporter가 정상적으로 작동하는 것이 확인되었다면, 이제 Grafana에 접속하여 대시보드를 설정한다. 먼저, 웹 브라우저에서 서버 주소와 포트 3000을 입력하여 Grafana 로그인 페이지에 접속한 후, 기본 계정 정보인 ID admin과 비밀번호 admin을 입력하여 로그인한다. 로그인 후, 우측 상단의 Grafana 로고를 클릭하여 메뉴를 연 뒤, Connections를 선택하고 Add new connection 페이지에서 Prometheus를 선택한다. 그런 다음, 우측 상단의 Add new data source 버튼을 클릭한 후, Connection 항목에서 http://prometheus:9090을 입력하고, Save & Test 버튼을 눌러 Data Source가 정상적으로 연결되었는지 확인한다.

    Dashboard 설정

    Data Source가 정상적으로 연결되었다면, 이제 대시보드를 설정해야 한다. 우측 상단의 Grafana 로고를 다시 클릭하여 Dashboards 메뉴로 이동한 후, New 버튼을 클릭하고 Import를 선택한다. 이후, Grafana.com dashboard URL or ID 입력란에 193을 입력한 뒤 Load 버튼을 누른다. 다음 페이지에서 prometheus 드롭다운 메뉴를 클릭하여 Prometheus를 선택한 후, Import 버튼을 눌러 Docker 모니터링 대시보드를 추가한다. 만약 대시보드가 정상적으로 표시되고 데이터가 제대로 조회된다면, 모니터링 시스템이 정상적으로 작동하고 있는 것이다. Windows 서버의 모니터링 대시보드를 추가하려면 동일한 방식으로 Import를 진행하되, Dashboard ID로 20763을 입력하면 된다. 이 과정을 완료하면 Docker 컨테이너와 Windows 서버의 성능 메트릭을 Grafana에서 실시간으로 모니터링할 수 있다.


    마무리

    이번 글에서는 On-Premise와 클라우드 환경을 아우르는 통합 모니터링 시스템을 구축하기 위한 전체적인 과정을 살펴보았다. 컨테이너 기반 환경에서 리소스를 적절히 모니터링하고, Windows 서버 및 데이터베이스까지 통합적으로 관제할 수 있는 체계를 마련하는 것이 핵심 목표였다. 모니터링 시스템은 단순히 서비스 상태를 감시하는 데 그치지 않고, 운영 효율성을 높이고 장애를 조기에 인지하여 신속 대응하는 데 중요한 역할을 한다. 구축 과정을 마쳤다고 끝이 아니라, 계속해서 모니터링 범위를 확장하고 대시보드를 최적화하며 유지보수를 진행해야 한다. 이를 통해 향후 발생할 수 있는 문제를 빠르게 포착하고, 더 나아가 인프라 효율화를 위한 근거 데이터를 확보하는 선순환을 만들어 갈 수 있을 것이다.

    댓글

Designed by Tistory.