Panduan Instalasi dan Konfigurasi Grafana & Prometheus untuk Memantau MySQL di EC2 (Ubuntu 24)

Panduan praktis menyiapkan mysqld_exporter dan node_exporter pada EC2 (MySQL), lalu menjalankan Prometheus dan Grafana pada server monitoring terpisah. Termasuk skrip siap salin-tempel, contoh konfigurasi Prometheus, serta langkah impor dashboard di Grafana.

Tujuan panduan ini: dari nol hingga Anda memiliki pemantauan MySQL yang solid. Di sisi EC2, kita memasang exporter (Node & MySQL). Di sisi server monitoring, kita menjalankan Prometheus + Grafana (Docker). Setelah itu, Grafana menampilkan metrik penting seperti koneksi, QPS, penggunaan buffer, sampai kesehatan host.

Opini singkat: Observabilitas bukan kemewahan—ini sabuk pengaman ops. Sekali pasang, Anda akan bertanya: “mengapa tidak dari dulu?”

Prasyarat

  • EC2 (Ubuntu 24) yang menjalankan MySQL (local/tidak RDS).
  • Server monitoring (VM/host terpisah) dengan akses internet (jalankan Prometheus & Grafana di sini).
  • Akses SSH root/sudo ke kedua host.
  • Firewall/SG: izinkan 9100 dan 9104 di EC2 dari hanya IP server monitoring.

Arsitektur & Port

  • EC2 (MySQL) → node_exporter di 9100; mysqld_exporter di 9104.
  • Server Monitoring → Prometheus (port 9090) dan Grafana (port 3000).
  • Prometheus scrape: http://IP_EC2:9100 & http://IP_EC2:9104.

Bagian A — EC2 (MySQL): Pasang Exporter

Kita gunakan Docker agar lintas-arsitektur (ARM/AMD) lebih sederhana.

1) Instal Docker & Compose Plugin

sudo -i
apt-get update -y
apt-get install -y docker.io docker-compose-plugin
systemctl enable --now docker

2) Buat User MySQL untuk Exporter

Masuk ke MySQL dan jalankan GRANT berikut (password contoh silakan diganti kuat):

mysql -uroot -p -e "
CREATE USER 'exporter'@'127.0.0.1' IDENTIFIED BY 'GantiPasswordKuat!';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'127.0.0.1';
FLUSH PRIVILEGES;"

3) Docker Compose untuk Exporter

File di /opt/exporters/docker-compose.yml — Node Exporter & MySQLd Exporter berjalan dengan host network agar mudah di-scrape Prometheus.

mkdir -p /opt/exporters
cat > /opt/exporters/.env <<'ENV'
MYSQL_EXPORTER_PASS=GantiPasswordKuat!
ENV

cat > /opt/exporters/docker-compose.yml <<'YAML'
version: "3.8"
services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    network_mode: host
    pid: host
    volumes:
      - type: bind
        source: /
        target: /host
        read_only: true
        bind:
          propagation: rslave
    command: ["--path.rootfs=/host"]
    restart: unless-stopped

  mysqld_exporter:
    image: prom/mysqld-exporter:latest
    network_mode: host
    environment:
      - DATA_SOURCE_NAME=exporter:${MYSQL_EXPORTER_PASS}@(127.0.0.1:3306)/
    restart: unless-stopped
YAML

docker compose --env-file /opt/exporters/.env -f /opt/exporters/docker-compose.yml up -d
Security Group/Firewall: izinkan port 9100 dan 9104 dari hanya IP publik server monitoring. Hindari “0.0.0.0/0”.

Bagian B — Server Monitoring: Prometheus + Grafana

Kita jalankan keduanya via Docker Compose, dengan file konfigurasi Prometheus yang menarget EC2.

1) Instal Docker & Compose Plugin

sudo -i
apt-get update -y
apt-get install -y docker.io docker-compose-plugin
systemctl enable --now docker

2) Siapkan Berkas Prometheus & Grafana

Ganti IP_EC2 dengan IP publik atau private EC2 (sesuai rute jaringan). Password admin Grafana juga silakan diganti.

mkdir -p /opt/monitoring/{prometheus,grafana/provisioning/datasources}
cat > /opt/monitoring/prometheus/prometheus.yml <<'YAML'
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "self"
    static_configs:
      - targets: ["prometheus:9090"]

  - job_name: "ec2-node"
    static_configs:
      - targets: ["IP_EC2:9100"]
        labels:
          instance: "mysql-ec2"

  - job_name: "ec2-mysql"
    static_configs:
      - targets: ["IP_EC2:9104"]
        labels:
          instance: "mysql-ec2"
YAML

cat > /opt/monitoring/grafana/provisioning/datasources/prometheus.yml <<'YAML'
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    uid: prometheus-ds
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: true
YAML

cat > /opt/monitoring/docker-compose.yml <<'YAML'
version: "3.8"
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prom_data:/prometheus
    ports:
      - "9090:9090"
    restart: unless-stopped

  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=GantiPasswordGrafana!
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - graf_data:/var/lib/grafana
      - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro
    ports:
      - "3000:3000"
    depends_on:
      - prometheus
    restart: unless-stopped

volumes:
  prom_data:
  graf_data:
YAML

docker compose -f /opt/monitoring/docker-compose.yml up -d

Grafana Quick-Start (Datasource & Dashboard)

  1. Buka Grafana: http://IP_MONITORING:3000 → login admin / GantiPasswordGrafana!
  2. Datasource “Prometheus” sudah terprovisi (lihat Connections → Data sources).
  3. Impor dashboard:
    • Node Exporter Full (ID populer: 1860) → memantau host EC2.
    • MySQL (mysqld_exporter) (contoh ID umum: 7362 dari Percona) → metrik MySQL.

    Masuk menu Dashboards → New → Import, masukkan ID, pilih datasource Prometheus.

Alternatif: buat panel sendiri. Beberapa PromQL contoh:

# Threads connected
mysql_global_status_threads_connected{instance="mysql-ec2"}

# Queries per second (QPS)
rate(mysql_global_status_queries{instance="mysql-ec2"}[5m])

# InnoDB buffer pool hit ratio (perkiraan)
1 - (rate(mysql_global_status_innodb_buffer_pool_reads{instance="mysql-ec2"}[5m])
    / rate(mysql_global_status_innodb_buffer_pool_read_requests{instance="mysql-ec2"}[5m]))

# Memory host (persentase)
(1 - (node_memory_MemAvailable_bytes{instance="mysql-ec2"} 
      / node_memory_MemTotal_bytes{instance="mysql-ec2"})) * 100

Verifikasi & Uji Cepat

# Di EC2:
docker ps
curl -s http://127.0.0.1:9100/metrics | head
curl -s http://127.0.0.1:9104/metrics | head
# Di server monitoring:
docker ps
curl -s http://127.0.0.1:9090/targets | grep -E "ec2-(node|mysql)" -n

Troubleshooting Ringkas

  • Prometheus tidak melihat target → Cek Security Group/Firewall EC2: port 9100/9104 hanya dari IP monitoring, namun pastikan memang diizinkan dari IP tersebut.
  • mysqld_exporter 401/akses ditolak → Pastikan user/grant MySQL benar, host 127.0.0.1, dan DATA_SOURCE_NAME sesuai.
  • Grafana tidak ada data → Periksa datasource, pastikan menunjuk ke Prometheus internal (http://prometheus:9090) dan status target di Prometheus “UP”.
  • Arsitektur ARM (t4g.*) gagal tarik image → Gunakan image resmi multi-arch (sudah disediakan di contoh). Jika masih gagal, docker manifest inspect <image> dan pilih tag lain yang mendukung linux/arm64.

Catatan Keamanan & Produksi

  • Batasi akses port exporter (9100/9104) hanya dari Prometheus server.
  • Ganti semua password contoh. Simpan rahasia di file terproteksi (chmod 600) atau Secrets Manager.
  • Harden Grafana (nonaktifkan sign-up, ubah password admin, aktifkan HTTPS via reverse proxy bila publik).
  • Backup volume Prometheus/Grafana, dan rencanakan retensi metrik.

Kesimpulan

Dengan pola exporter → Prometheus → Grafana, Anda mendapat visibilitas real-time atas MySQL di EC2 dan kesehatan host. Mulai dari QPS, koneksi, hingga resource host, semuanya tersaji. Tinggal kembangkan alerting dan dashboard sesuai SLO Anda.

Sumber/Referensi


Share the Post:

Related Posts