회사에서 운영중인 인프라는 IDC , AWS 클라우드가 복합적으로 구성되어 있습니다. 많은 서버와 인스턴스 그리고 서비스의 양 대비 인력이 부족하기에 장애나 신뢰성을 측정하고자 할때 빠르게 측정하기 어려움이 있었습니다.
때문에 신규 개발건이나 운영 대응에 대한 부담감을 줄이기 위해서라도 통합 모니터링 및 운영 자동화는 선택이 아니라 필수요소라고 생각했고, 오픈소스인 Prometheus + Grafana 구성을 선택하게 되었습니다.
모니터링 목표
모니터링 시스템 구축 시 논리적인 목표가 필요했고 이에 구글의 SRE를 참조 하여 목표를 설정할 수 있었습니다. 다음은 모니터링 구축 시 필수 요구사항입니다.
- 현재 운영중인 인프라 통합 모니터링
- 현재 운영중인 서비스 통합 모니터링
- 특정 운영 지표에 따른 실시간 알림
- 운영 복구에 따른 실시간 알림
위와 같이 운영 지표가 명확해 진다면 이에 따른 서비스 탄력성 및 가용성에 대한 추가적인 지식을 얻을 수 있습니다.
서비스 수준 목표(SLO) 에 따른 운영 지표
서비스 운영 시 “장애” 혹은 “위험도”를 판단할 운영 지표가 중요합니다. 여기서 이해관계자들끼리 동일한 용어 및 운영중 커뮤니케이션 미스를 줄이기 위해 아래와 같이 정리하였습니다.
경고 레벨
- LEVEL1 (
Error
) — 서비스에 치명적인 경고 레벨, 해당 레벨의 경고가 발생한다면 1순위로 해결해야 합니다. - LEVEL2 (
Warn
) — 치명적이진 않지만, 서비스에 문제가 생길 여지가 있는 경고 레벨 - LEVEL3 (
Info
) — 서비스에 영향은 주지 않지만, 이슈의 잔재가 남아 수동으로 처리해야 하는 경고 레벨
시스템 상태 목표 예시
- 시스템, 서비스 Down —
LEVEL1
- CPU ≥ X% —
LEVEL2
- Memory ≥ X% —
LEVEL2
- Disk ≥ X% —
LEVEL2
- Thread 개수 네트워크 커넥션 수 ≥ X —
LEVEL3
서비스 가용성 목표 예시
- API 응답 시간 90% < 200 ms —
LEVEL2
- API 응답 Status Code 99.9% < 5XX —
LEVEL2
SLO(Service Level Indicator)
는 서비스 수준 목표를 의미하며,SLI(Service Level Objectives)
에 의해 측정된 서비스 수준의 척도, 기준을 의미합니다.
SLO
는SLI
<= 목표치 또는 최솟값 <=SLI
<= 최댓값으로 표현될 수 있으며, 명확성을 극대화 하기 위해SLO
는 측정 방식과 유효한 기준이 반드시 명시되어야 합니다.
아키텍처 설계
위의 목표를 기반으로 전체적인 아키텍처를 설계했습니다.
기본적으로 오픈 소스 중심으로 수집은 Prometheus, GUI는 Grafana를 이용, 알림 같은 경우 카카오톡 혹은 문자를 지원할 수 있게 Custom이 필요해서 자체 서비스 구축을 통한 hook 처리를 고려했습니다.
Prometheus 설정
아래는 ubuntu 기반으로 설정 Prometheus 방법을 정리했습니다.
1. 설치
- 공식 사이트 — Download | Prometheus
- 설치방법 참고 — Install Prometheus in Ubuntu 20.04
$ sudo mkdir /etc/prometheus
$ sudo mkdir /opt/prometheus
# 설치
$ wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz
$ tar xvfz prometheus-2.34.0.linux-amd64.tar.gz
$ cd prometheus-2.34.0.linux-amd64
# 프로메테우스 파일 복사
$ sudo cp prometheus /usr/local/bin/
$ sudo cp promtool /usr/local/bin/
$ sudo cp -r prometheus.yml /etc/prometheus
$ sudo cp -r consoles /etc/prometheus
$ sudo cp -r console_libraries /etc/prometheus
2. Prometheus 서비스 데몬 등록
다운로드 받은 prometheus 서비스 데몬 등록 및 실행합니다.
$ vi /etc/systemd/system/prometheus.service
# prometheus.service 파일
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /opt/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
[Install]
WantedBy=multi-user.target
...
# 서비스 데몬 동록 및 실행
$ sudo systemctl daemon-reload
$ sudo systemctl start prometheus
$ sudo systemctl enable prometheus
$ sudo systemctl status prometheus
2. Prometheus Config 설정
- 설정 파일을 수정합니다
$ sudo vi /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s #기본 수집 주기
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
3. Node exporter 설치
시스템의 메트릭 정보를 얻기 위해 공식 사이트에서 제공하고 있는 Node exporter 를 설치합니다.
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
$ tar -xzvf node_exporter-1.1.2.linux-amd64.tar.gz
# 폴더명 변경 로그아웃
$ sudo cp node_exporter-1.1.2.linux-amd64/node_exporter /usr/local/bin/
Prometheus와 마찬가지로 서비스 데몬으로 등록합니다.
$ vi /etc/systemd/system/node_exporter.service
# node_exporter.service 파일
[Unit]
Description=Prometheus Node Exporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
Wants=network-online.target
After=network-online.target
[Service]
User=root
Group=root
Restart=on-failure
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
...
# 서비스 데몬 동록 및 실행
$ sudo systemctl daemon-reload
$ sudo systemctl start node_exporter
$ sudo systemctl enable node_exporter
$ sudo systemctl status node_exporter
Grafana 설정
그라파나를 통해 대시보드 구축 시 Hub 역할을 하는 Grafana Labs 에서 대시보드 템플릿이 많이 올라와 있기 때문에 직접 구축하지 않아도 원하는 형태를 찾을 수 있습니다.
1. 설치
- 공식 사이트 — Download Grafana | Grafana Labs
$ sudo apt-get install -y adduser libfontconfig1
$ wget https://dl.grafana.com/oss/release/grafana_8.4.6_amd64.deb
$ sudo dpkg -i grafana_8.4.6_amd64.deb
2. 실행 및 Config 변경
$ service grafana-server start
# 설정변경
$ vi /etc/grafana/grafana.ini