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.
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_exporterdi 9100;mysqld_exporterdi 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 docker2) 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 -d9100 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 docker2) 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 -dGrafana Quick-Start (Datasource & Dashboard)
- Buka Grafana:
http://IP_MONITORING:3000→ loginadmin / GantiPasswordGrafana! - Datasource “Prometheus” sudah terprovisi (lihat Connections → Data sources).
- Impor dashboard:
- Node Exporter Full (ID populer:
1860) → memantau host EC2. - MySQL (mysqld_exporter) (contoh ID umum:
7362dari Percona) → metrik MySQL.
Masuk menu Dashboards → New → Import, masukkan ID, pilih datasource Prometheus.
- Node Exporter Full (ID populer:
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"})) * 100Verifikasi & 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)" -nTroubleshooting Ringkas
- Prometheus tidak melihat target → Cek Security Group/Firewall EC2: port
9100/9104hanya 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, danDATA_SOURCE_NAMEsesuai. - 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 mendukunglinux/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.

