7. Monitoring 1(Prometheus, PostgreSQL Exporter, Node Exporter)
7.1 Architecture
- 현재 사용하는 Database의 사용 관련한 지표를 수집하고 시각화해줄 수 있는 형태가 필요함
PostgreSQL
→Prometheus
→Grafana
- 형태로 진행되는것을 많이 사용함 여기서 Promethenus 를 InfluxDB를 사용하기도 한다고함.
- 여기서 PostgreSQL에서 Grafana로 바로 접근할 수 있지만 바로 접근한다면 이것 또한 DB 과부하의 영향을 줄 수 있는 형태로 Prometheus를 중간 매개체 역할을 수행한다.
참조 : https://badcandy.github.io/2018/12/25/prometheus-architecture/
7.2 PULL Metrics
7.2.1 Pull MEtrics
Prometheus는 Pull 방식을 통해 데이터를 수집 즉, 해당 데이터를 요청을 직접하여 데이터를 수집해서 감.
이 때 HTTP ENDPOINT를 통해 접근을 하는데, 예를 들어 /api/testservice/metric
과 같이 해당 포인트를 열어 놓는다면, Prometheus가 HTTP 요청을 통해 데이터를 수집할 수 있다.
7.2.2 Exporter
HTTP Endpoint를 각 시스템에 맞게 수집할 수 있게 만들어 놓은 것이 Exporter
공식 문서에는 다양한 Exporter가 존재하고 이번 실습에서 사용한 Exporter는 총 2개
Node Exporter
- 현재 사용하는 서버의 정보(Metrics)를 수집하여 서버의 사용량으 모니터링에 사용.
Postgresql Exporter
- PostgreSQL의 사용량을 관리하는 모니터링에 사용.
참조 : https://velog.io/@anrnyeondo/모니터링-환경-구축-prometheus
7.3 Node Exporter 설치
7.3.1 다운로드 및 폴더 이동
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz tar -xvzf node_exporter-1.0.1.linux-amd64.tar.gz sudo mv node_exporter-1.0.1.linux-amd64/node_exporter /usr/sbin/
7.3.2 node_exporter 서비스 등록
sudo vi /etc/systemd/system/node_exporter.service [Unit] Description=Node Exporter [Service] User=ubuntu EnvironmentFile=/etc/sysconfig/node_exporter ExecStart=/usr/sbin/node_exporter $OPTIONS [Install] WantedBy=multi-user.target
7.3.3 Config 파일 생성
sudo mkdir -p /etc/sysconfig sudo touch /etc/sysconfig/node_exporter # OPTIONS="--collector.textfile.directory /var/lib/node_exporter/textfile_collector"
7.3.4 Daemon Reload & Service Start
sudo systemctl daemon-reload sudo systemctl enable node_exporter.service sudo systemctl start node_exporter.service sudo systemctl status node_exporter.service
7.3.5 테스트
curl http://localhost:9100/metrics curl http://localhost:9100/target
7.4 Postgres Exporter 설치
7.4.1 설치
wget https://github.com/wrouesnel/postgres_exporter/releases/download/v0.8.0/postgres_exporter_v0.8.0_linux-amd64.tar.gz sudo tar -xvzf postgres_exporter_v0.8.0_linux-amd64.tar.gz sudo mv postgres_exporter_v0.8.0_linux-amd64/postgres_exporter /usr/local/bin/ sudo chown -R postgres:postgres /usr/local/bin/postgres_exporter
7.4.2 Postgres_exporter 서비스 등록
sudo vi /etc/systemd/system/postgres_exporter.service [Unit] Description=Prometheus PostgreSQL Exporter After=network.target [Service] Type=simple Restart=always User=postgres Group=postgres #Environment=DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" Environment=DATA_SOURCE_NAME=postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable ExecStart=/usr/local/bin/postgres_exporter [Install] WantedBy=multi-user.target
7.4.3 Daemon 실행
sudo systemctl daemon-reload sudo systemctl enable postgres_exporter.service sudo systemctl start postgres_exporter.service sudo systemctl status postgres_exporter.service
7.4.4 테스트
curl http://localhost:9187/metrics # postgresql-exporter
7.4.5 PostgreSQL와 연결 필요 프로그램 설치
sudo apt-get update sudo apt-get -y upgrade sudo apt-get install golang-go go env -w GO111MODULE=auto # 이걸 안하면 에러가 발생한다. go get github.com/lib/pq ## configure 설정 sudo su postgres ## cd /usr/local/pgsql/data/. # 설치형으로 했을때 Path ## vi pg_hba.conf sudo vi /etc/postgresql/13/main/pg_hba.conf -맨 하단부 내용 수정- (아래 내용이 기존 내용과 수정해서 추가가 되어야함) local all all md5 host all all 127.0.0.1/32 trust ## host replication all ::1/128 trust host all all 0.0.0.0/0 md5
7.5 Prometheus 설치
참조 : https://prometheus.io/download/
7.5.1 폴더 생성 및 다운로드
sudo apt update ## create prometheus configuration folder sudo mkdir -p /etc/prometheus ## create prometheus data folder sudo mkdir -p /var/lib/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.37.5/prometheus-2.37.5.linux-amd64.tar.gz tar xzvf prometheus-2.37.5.linux-amd64.tar.gz cd prometheus-2.37.5.linux-amd64
7.5.2 파일 이동
## move the prometheus and promtool binary files to the /usr/local/bin/ sudo mv prometheus promtool /usr/local/bin/ ## related files mv to /etc/prometheus sudo mv consoles/ console_libraries/ /etc/prometheus/ ## prometheus.yml to /etc/prometheus sudo mv prometheus.yml /etc/prometheus/prometheus.yml
7.5.3 Version Check
ubuntu@ip-10-0-157-31:~/download/prometheus-2.37.5.linux-amd64$ prometheus --version prometheus, version 2.37.5 (branch: HEAD, revision: 8d25a0867918173e501b417e7acd85861df8fb0e) build user: root@fa6380105630 build date: 20221209-12:46:41 go version: go1.18.9 platform: linux/amd64
7.5.4 사용자 추가 후 권한 부여
sudo groupadd --system prometheus sudo useradd -s /sbin/nologin --system -g prometheus prometheus sudo chown -R prometheus:prometheus /etc/prometheus/ /var/lib/prometheus/ sudo chmod -R 775 /etc/prometheus/ /var/lib/prometheus/
7.5.5 서비스 등록
sudo nano /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Restart=always Type=simple ExecStart=/usr/local/bin/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/var/lib/prometheus/ \ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries \ --web.listen-address=0.0.0.0:9090 [Install] WantedBy=multi-user.target
7.5.6 Prometheus 에 exporter 연결
- yaml 파일 수정
sudo vi /etc/prometheus/prometheus.yml scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] - job_name: "postgresql" static_configs: - targets: ["localhost:9187"] labels: instance: postgres-bcheck - job_name: "node" static_config: - targets: ["localhost:9100"] labels: instance: db-server
7.5.7 서비스 시작
sudo systemctl start prometheus sudo systemctl enable prometheus # startup boot sudo systemctl status prometheus