High availability dan monitoring di Linux: konsep redundancy & failover, Keepalived untuk virtual IP, Prometheus + node_exporter + Grafana untuk observability, Alertmanager, serta praktik dan kesalahan umumnya.

Setelah di episode 28 sebelumnya kita membangun autentikasi terpusat dengan LDAP dan SSSD — satu direktori identitas yang melayani puluhan server — kalian kini punya kendali akses yang terpusat. Tapi ada pertanyaan yang sama pentingnya dengan "siapa yang boleh masuk": bagaimana kita tahu semua server ini masih hidup dan sehat? Server bisa mati tanpa mengirimkan pemberitahuan apa pun — power supply rusak, kernel panic, atau disk penuh — dan kalian baru menyadarinya saat user melapor "situs tidak bisa diakses".
Di episode 29 ini kita masuk ke dua pilar operasional yang membuat infrastruktur benar-benar profesional: High Availability (HA) dan Monitoring. Kita akan belajar bagaimana membuat layanan tetap hidup meskipun satu server mati (Keepalived + virtual IP), bagaimana mengukur kesehatan semua server secara terpusat (Prometheus + node_exporter + Grafana), serta bagaimana menerima peringatan otomatis sebelum masalah menjadi bencana (Alertmanager). Di akhir episode, kalian akan membangun monitoring stack nyata di dua VM — fondasi dari operasional yang bisa diandalkan.
Prinsip pertama yang harus dipahami: high availability bukan berarti "tidak pernah down" — berarti "dampak downtime diminimalkan dengan otomatisasi". Tidak ada sistem yang bebas kegagalan; yang ada adalah sistem yang merancang kegagalan dan menyediakan pengganti otomatis.
Bayangkan pesawat penumpang. Pesawat tidak dirancang agar mesinnya tidak pernah mati — dirancang agar satu mesin bisa mati tanpa menjatuhkan pesawat. Ada dua mesin (redundancy), dan jika satu mati, yang lain tetap membawa pesawat terbang (failover). Pilot tidak perlu panik; sistem mengkompensasi secara otomatis.
Dalam dunia server, redundansi berarti menjalankan dua atau lebih node yang menyediakan layanan yang sama. Failover berarti mekanisme otomatis yang memindahkan "kepemimpinan" dari node yang mati ke node yang sehat. Komponen yang paling penting dalam failover adalah deteksi: node pengganti harus tahu dengan cepat bahwa node utama sudah tidak sehat.
| Komponen HA | Peran | Analogi Pesawat |
|---|---|---|
| Redundancy | Lebih dari satu node menyediakan layanan | Dua mesin di sayap |
| Deteksi | Memantau kesehatan node utama (heartbeat) | Alarm & sensor di kokpit |
| Failover | Perpindahan otomatis ke node pengganti | Autopilot mengambil alih |
| Virtual IP | Satu alamat IP yang "mengikuti" node aktif | Satu slot parkir, dua pesawat yang bisa mendarat |
Tool yang paling populer untuk skenario two-node active/standby di Linux adalah Keepalived. Ia memakai protokol VRRP (Virtual Router Redundancy Protocol) untuk membuat sebuah Virtual IP (VIP) yang secara otomatis dipakai oleh node yang sehat. Dari luar, client hanya melihat satu IP — tidak pernah tahu bahwa di baliknya ada dua server. Ketika node utama mati, node standby mengambil alih VIP dalam hitungan detik tanpa intervensi manusia.
Untuk cluster yang lebih kompleks (multi-node, resource yang bisa berpindah seperti service, filesystem, dan IP), ada Pacemaker + Corosync — cluster resource manager yang jauh lebih kuat tapi juga jauh lebih kompleks. Keepalived cukup untuk kebanyakan kebutuhan active/standby; Pacemaker untuk cluster skala enterprise.
Note
Ingat selalu: VIP hanyalah lapisan "pintu masuk". Jika kedua node sama-sama mati (misalnya pemadaman listrik di seluruh DC), VIP pun tidak membantu. HA melindungi dari kegagalan satu node, bukan dari kegagalan seluruh lokasi — untuk itu kita butuh multi-DC dan strategi disaster recovery yang sudah kita bahas di episode 26.
Kita akan membuat dua node — web-01 (IP 192.168.1.11) dan web-02 (IP 192.168.1.12) — yang berbagi satu VIP 192.168.1.10. Kedua node menjalankan nginx. Saat web-01 sehat, ia yang memegang VIP; jika mati, web-02 mengambil alih.
apt install -y keepalivedKonfigurasi di node utama web-01:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 200
advert_int 1
virtual_ipaddress {
192.168.1.10/24 dev eth0
}
track_script {
chk_nginx
}
}Dan di node standby web-02, hampir identik kecuali state BACKUP dan priority 150:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 150
advert_int 1
virtual_ipaddress {
192.168.1.10/24 dev eth0
}
track_script {
chk_nginx
}
}Agar failover benar-benar terjadi hanya jika layanan (bukan sekadar OS) bermasalah, kita definisikan track_script yang memeriksa nginx. Ini pola yang sangat penting: jika nginx mati tapi server tetap hidup, VIP seharusnya tetap berpindah ke node lain — karena user tetap tidak bisa mengakses layanan.
#!/usr/bin/env bash
if ! pidof nginx > /dev/null; then
exit 1
fi
exit 0systemctl restart keepalived
ip addr show eth0 | grep 192.168.1.10 # di web-01: VIP tampilImportant
Uji failover secara nyata: matikan nginx di web-01 (systemctl stop nginx) lalu periksa dengan ip addr show eth0 di web-02 — dalam hitungan detik VIP harus muncul di web-02, dan curl http://192.168.1.10 tetap berhasil. Jika kalian tidak pernah menguji failover, kalian hanya punya optimisme, bukan high availability. Keepalived yang belum diuji nilainya sama dengan jaring pengaman yang belum pernah direntangkan.
HA menjawab "bagaimana layanan tetap hidup"; monitoring menjawab "bagaimana kita tahu ia sehat". Stack yang paling populer di ekosistem Linux/DevOps modern adalah Prometheus + node_exporter + Grafana, dan arsitekturnya berbeda dari monitoring tradisional: pull model.
9100.+-----------+ scrape /metrics +---------------+ query +----------+
| Server 1 | <-----------------> | Prometheus | <--------> | Grafana |
| node_exp | | (time-series)| | (visual) |
+-----------+ +-------+-------+ +----------+
+-----------+ scrape /metrics | |
| Server 2 | <-----------------> | Alertmanager | --> email/Slack
| node_exp | +----------------+
+-----------+Tip
Kenapa pull dan bukan push? Karena pull membuat server monitoring menjadi konsumen aktif: ia yang mengatur jadwal, tahu persis kapan terakhir kali data diterima, dan langsung tahu jika satu node berhenti melapor (target down). Pada model push, node yang mati tidak bisa "mengirimkan" kabar bahwa ia mati — anda hanya tahu kalau berhenti mendengar. Pull juga membuat autentikasi dan kontrol lebih mudah: Prometheus cukup boleh mengakses port 9100/9090, bukan sebaliknya.
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
install -m 755 node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
useradd -rs /bin/false node_exporter
install -m 644 /dev/stdin /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now node_exporterVerifikasi metrik dengan curl http://localhost:9100/metrics | head — kalian akan melihat ribuan baris metrik seperti node_cpu_seconds_total, node_memory_MemAvailable_bytes, dan seterusnya.
Prometheus dikonfigurasi lewat prometheus.yml. Bagian paling penting adalah scrape_configs — daftar target yang harus ditarik metriknya:
scrape_configs:
- job_name: nodes
static_configs:
- targets:
- web-01:9100
- web-02:9100
scrape_interval: 15sBeri nama pada baris job_name sesuai peran node (misalnya web, db, monitoring) agar metrik mudah dikelompokkan di Grafana. Target down akan tampil di halaman Targets Prometheus dengan status merah.
Grafana terhubung ke Prometheus sebagai data source, lalu dashboard bisa dibuat secara manual atau di-import dari komunitas. Dashboard node-exporter paling populer adalah ID 1860 di grafana.com:
# Buka http://<grafana-host>:3000 (login default admin/admin)
# Add data source → Prometheus → URL: http://<prometheus-host>:9090
# Dashboard → Import → ID 1860 → pilih data source PrometheusWarning
Ganti password default admin/admin Grafana segera setelah login pertama. Grafana yang dibiarkan dengan credential default adalah pintu masuk yang paling sering dimanfaatkan penyerang — dan karena Grafana punya akses baca ke seluruh data monitoring, dampaknya jauh lebih besar dari sekadar dashboard yang "dirusak".
Dashboard hanya berguna jika seseorang sedang melihatnya. Untuk operasional yang sehat, kalian butuh alert otomatis. Di Prometheus, alert didefinisikan dengan rule PromQL. Contoh: alert ketika CPU idle hampir habis atau disk penuh:
groups:
- name: node-alerts
rules:
- alert: HighCPU
expr: 100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) > 90
for: 5m
labels:
severity: critical
annotations:
summary: "CPU tinggi pada {{ $labels.instance }}"
- alert: DiskSpaceLow
expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "Disk / tinggal 10% di {{ $labels.instance }}"Alertmanager menerima alert dari Prometheus dan mengelompokkannya sebelum dikirim ke channel. Konfigurasi penerima email/Slack ada di alertmanager.yml:
route:
group_by: [alertname, instance]
receiver: ops-team
receivers:
- name: ops-team
email_configs:
- to: ops@example.com
from: alerts@example.com
smarthost: smtp.example.com:587Note
Aturan emas monitoring: jangan pernah menambahkan alert yang tidak akan kalian tindaklanjuti. Setiap alert yang berulang tanpa aksi akan membiasakan tim mengabaikannya (alert fatigue), dan ketika alert yang serius muncul, tidak ada yang peduli. Mulailah dengan beberapa alert yang benar-benar penting (CPU, disk, target down, layanan mati), dan jaga agar tiap alert selalu punya langkah respons yang jelas.
Selain stack Prometheus, ada beberapa lapisan health check yang melengkapi pengawasan:
Restart=on-failure membuat service restart otomatis saat crash, dan WatchdogSec memberitahu jika service berhenti merespons. Ini adalah lini pertahanan pertama yang gratis.Pola yang sehat menggabungkan ketiganya: systemd untuk pemulihan otomatis (restart), Prometheus untuk metrik historis & alerting, dan check eksternal (seperti UptimeRobot atau monit) untuk memastikan layanan bisa dijangkau dari luar — karena Prometheus yang mati tidak bisa memberi tahu bahwa dirinya mati.
[Service]
ExecStart=/usr/local/bin/myapp
Restart=on-failure
RestartSec=5
WatchdogSec=30
StartLimitIntervalSec=60
StartLimitBurst=5Saatnya menggabungkan semuanya. Skenario: dua VM web-01 dan web-02 (sekaligus node HA dari bagian sebelumnya), plus satu VM mon-01 yang menjalankan Prometheus, Grafana, dan Alertmanager.
web-01 (nginx + node_exporter) ----+----> mon-01 (Prometheus + Grafana + Alertmanager)
web-02 (nginx + node_exporter) ----+----> scrapes port 9100 tiap 15s
web-01 & web-02 = Keepalived VIP 192.168.1.10 (failover)Alur kerjanya:
node_exporter di web-01 dan web-02 (lihat Langkah 1 di atas).mon-01 dengan scrape_configs menunjuk ke kedua node.mon-01, tambahkan Prometheus sebagai data source, import dashboard 1860.alert.rules.yml ke Prometheus.curl http://mon-01:9090/api/v1/targets | head -20{
"status": "success",
"data": {
"activeTargets": [
{"labels": {"instance": "web-01:9100"}, "health": "up"},
{"labels": {"instance": "web-02:9100"}, "health": "up"}
]
}
}Caution
Saat satu node mati, perhatikan perilaku failover Keepalived dan monitoring secara bersamaan: jika Keepalived bekerja, user tidak akan merasakan apa pun (VIP pindah ke node sehat) — tetapi Prometheus tetap harus memberi tahu bahwa web-01 down karena ia adalah infrastruktur yang perlu perhatian. HA dan monitoring bukan pengganti satu sama lain; HA mengurangi dampak kegagalan, monitoring memastikan kegagalan itu tidak luput dari perhatian.
Berikut pola kegagalan yang paling sering ditemukan saat membangun HA & monitoring:
| Pitfall | Gejala | Solusi |
|---|---|---|
| Target unreachable karena firewall | Prometheus menampilkan target down padahal node sehat | Buka port 9100 (dan 9090/3000) di firewall node |
| Exporter tidak enable di systemd | Metrik kosong atau target down setelah reboot | systemctl enable --now node_exporter |
| Retention tidak diatur | Disk monitoring penuh dalam beberapa minggu | Set --storage.tsdb.retention.time sesuai kapasitas |
| Prometheus tidak scrape dirinya sendiri | Tidak ada metrik tentang kesehatannya | Tambahkan target localhost:9090 |
| VIP tidak berpindah karena priority sama | Failover tidak pernah terjadi | Set priority MASTER > BACKUP (misal 200 vs 150) |
| Firewall memblokir VRRP | Kedua node mengklaim VIP → konflik | Buka protokol VRRP (112) antar node |
| Credential default Grafana dibiarkan | Monitoring stack diakses pihak ketiga | Ganti password admin di login pertama |
| Alert tanpa tindak lanjut | Alert fatigue, tim mati rasa | Hanya buat alert yang punya runbook respons |
Kasus firewall pantas dijadikan contoh. Ini adalah penyebab paling umum target Prometheus down — bukan karena node mati, tapi karena port 9100 tidak diizinkan masuk dari server Prometheus:
# target down terus, padahal curl localhost:9100 jalan
ufw allow from 192.168.1.20 to any port 9100 proto tcp
systemctl reload ufwDi episode ini kita telah membangun dua pilar operasional yang membuat infrastruktur benar-benar siap produksi: High Availability dengan Keepalived dan virtual IP — layanan tetap hidup saat satu node mati; dan monitoring stack dengan node_exporter, Prometheus, Grafana, serta Alertmanager — semua server terukur dan masalah terdeteksi sebelum menjadi bencana. Kalian juga memahami pola health check berlapis (systemd untuk pemulihan otomatis, Prometheus untuk observability, check eksternal untuk ketersediaan) dan kesalahan-kesalahan umum yang harus dihindari.
Hampir selesai. Kalian sudah memiliki: server yang terhardening, backup yang teruji, container dan virtualisasi yang berjalan, autentikasi terpusat, serta HA dan monitoring. Semua komponen itu kini siap dirakit menjadi satu sistem utuh. Di episode 30 — episode pamungkas dari seri Belajar Linux — kita akan membangun complete production-grade Linux server setup: merangkai seluruh pelajaran dari episode 0 hingga 29 menjadi satu case study menyeluruh, dilengkapi production readiness checklist dan rangkuman perjalanan panjang ini. Sampai jumpa di episode terakhir!