Perancangan Database untuk Penyimpanan Data SNMP - Perwira Learning Center

Latar Belakang

Pada artikel ini, saya mempelajari perancangan database untuk penyimpanan data SNMP. Setelah memahami bagaimana data dikumpulkan menggunakan SNMP Collector, langkah selanjutnya adalah menentukan bagaimana data tersebut disimpan secara terstruktur agar dapat digunakan untuk kebutuhan monitoring dan analisis.

Artikel ini dibuat dengan tujuan untuk mendokumentasikan hasil pembelajaran saya mengenai perancangan database dalam sistem monitoring berbasis Simple Network Management Protocol. Dengan memahami proses ini, saya dapat menyusun struktur penyimpanan data yang efisien, terorganisir, dan mampu menangani data monitoring dalam jumlah besar.

Mengapa Data Monitoring Perlu Disimpan?

Data monitoring yang disimpan memiliki banyak manfaat:

  • Analisis Tren
    Melihat pola penggunaan resource dari waktu ke waktu
  • Forecasting
    Memprediksi kebutuhan kapasitas di masa depan
  • Root Cause Analysis
    Melacak kejadian sebelum insiden terjadi
  • Pelaporan
    Membuat laporan SLA, uptime, dan performa
  • Alerting Cerdas
    Membedakan lonjakan normal vs anomali

Tanpa histori data, sistem monitoring hanya menjadi "dashboard kosong" yang tidak memberikan nilai lebih.

Konsep Time-Series Data

Data monitoring adalah contoh sempurna dari time-series data, yaitu data yang:

  • Memiliki timestamp (waktu pengambilan)
  • Ditambahkan (append) terus-menerus, bukan diperbarui (update)
  • Jarang diubah atau dihapus

Schema Database yang Digunakan

Berikut adalah struktur tabel utama yang digunakan dalam project monitoring SNMP:

-- Tabel utama untuk menyimpan informasi perangkat
CREATE TABLE devices (
device_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
hostname VARCHAR(128) NOT NULL,
sysName VARCHAR(128),
ip BLOB,
community VARCHAR(255),
snmpver VARCHAR(4) DEFAULT 'v2c',
port SMALLINT UNSIGNED DEFAULT 161,
os VARCHAR(32),
status TINYINT(1) DEFAULT 0,
last_polled TIMESTAMP NULL,
created_at TIMESTAMP NULL,
updated_at TIMESTAMP NULL
);

-- Tabel untuk data CPU (processors)
CREATE TABLE processors (
processor_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
device_id BIGINT UNSIGNED NOT NULL,
processor_usage INT NOT NULL,
processor_descr VARCHAR(64),
created_at TIMESTAMP NULL,
updated_at TIMESTAMP NULL,
FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);

-- Tabel untuk data Memory/Storage (RAM, Disk)
CREATE TABLE storage (
storage_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
device_id BIGINT UNSIGNED NOT NULL,
type VARCHAR(16) NOT NULL, -- 'ram', 'disk', dll
storage_descr TEXT,
storage_size BIGINT,
storage_used BIGINT DEFAULT 0,
storage_free BIGINT DEFAULT 0,
storage_perc INT DEFAULT 0, -- persentase penggunaan
created_at TIMESTAMP NULL,
updated_at TIMESTAMP NULL,
FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);

-- Tabel untuk data Port/Interface jaringan
CREATE TABLE ports (
port_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
device_id BIGINT UNSIGNED NOT NULL,
ifIndex INT NOT NULL,
ifName VARCHAR(100),
ifDescr VARCHAR(255),
ifSpeed BIGINT,
ifAdminStatus VARCHAR(10),
ifOperStatus VARCHAR(10),
FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);

-- Tabel time-series untuk trafik port (append-only)
CREATE TABLE port_traffic (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
port_id BIGINT UNSIGNED NOT NULL,
timestamp DATETIME NOT NULL,
in_octets BIGINT UNSIGNED NOT NULL, -- byte masuk
out_octets BIGINT UNSIGNED NOT NULL, -- byte keluar
in_rate BIGINT UNSIGNED, -- bit/detik masuk (dihitung)
out_rate BIGINT UNSIGNED, -- bit/detik keluar (dihitung)
FOREIGN KEY (port_id) REFERENCES ports(port_id) ON DELETE CASCADE
);

-- Tabel untuk log alert
CREATE TABLE alerts_log (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
rule_id BIGINT UNSIGNED NOT NULL,
device_id BIGINT UNSIGNED NOT NULL,
state INT NOT NULL,
details BLOB,
time_logged TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);

Penjelasan Tiap Tabel

1. Tabel devices

  • Fungsi
    Menyimpan informasi identitas dan konfigurasi setiap perangkat yang dimonitor.
    Tabel ini menjadi titik awal dalam proses pengelolaan data monitoring.
  • Kolom Utama
    device_id (primary key), hostname (nama perangkat), ip (alamat IP), community (SNMP community string), snmpver (versi SNMP), port (port SNMP).
    Kolom-kolom ini digunakan untuk mengidentifikasi perangkat sekaligus sebagai parameter komunikasi SNMP.
  • Peran
    Sebagai "master data" yang direferensikan oleh seluruh tabel monitoring lainnya melalui relasi device_id.
  • Catatan
    Tabel ini menggunakan pola UPDATE karena informasi perangkat relatif jarang berubah dibandingkan data monitoring.

2. Tabel processors

  • Fungsi
    Menyimpan data penggunaan CPU terbaru dari setiap perangkat.
    Data yang disimpan merepresentasikan kondisi terkini pada saat proses polling dilakukan.
  • Kolom Utama
    processor_id, device_id (foreign key), processor_usage (persentase CPU), processor_descr (deskripsi CPU).
    Nilai processor_usage umumnya diperoleh dari hasil pengambilan data SNMP (OID) dan proses parsing.
  • Peran
    Menyimpan nilai terakhir penggunaan CPU yang akan diperbarui secara berkala setiap proses polling.
  • Catatan
    Untuk kebutuhan analisis historis, diperlukan tabel time-series terpisah yang menyimpan data CPU secara periodik.

3. Tabel storage

  • Fungsi
    Menyimpan data penggunaan memory (RAM) dan disk terbaru pada setiap perangkat.
    Tabel ini mencakup resource utama yang berkaitan dengan kapasitas penyimpanan dan memori.
  • Kolom Utama
    storage_id, device_id, type (ram/disk), storage_used, storage_free, storage_perc (persentase).
    Kolom type memungkinkan penyimpanan berbagai jenis storage dalam satu tabel secara fleksibel.
  • Peran
    Menyimpan snapshot terakhir kondisi storage sebagai representasi keadaan terkini perangkat.
  • Catatan
    storage_perc dihitung dari storage_used / storage_size * 100 dan umumnya diproses di sisi backend untuk efisiensi query.

4. Tabel ports

  • Fungsi
    Menyimpan informasi setiap interface jaringan yang dimiliki oleh perangkat.
    Data ini mencakup identitas dan status operasional dari masing-masing interface.
  • Kolom Utama
    port_id, device_id, ifName (nama interface seperti eth0), ifSpeed (kecepatan maksimum), ifOperStatus (status up/down).
    Kolom ifOperStatus berperan penting dalam mendeteksi kondisi aktif atau tidaknya suatu interface.
  • Peran
    Berfungsi sebagai master data untuk setiap port/interface yang akan digunakan dalam proses monitoring trafik jaringan.

5. Tabel port_traffic (Time-Series Table)

  • Fungsi
    Menyimpan data trafik jaringan dalam bentuk time-series (append-only).
    Data akan terus bertambah seiring dengan proses polling yang dilakukan secara berkala.
  • Kolom Utama
    id, port_id, timestamp, in_octets (byte masuk), out_octets (byte keluar).
    Data ini menjadi dasar dalam perhitungan kecepatan transfer (rate) jaringan.
  • Peran
    Tabel ini merupakan implementasi utama dari konsep time-series data, di mana setiap polling menghasilkan satu baris data baru.
  • Catatan
    Nilai in_rate dan out_rate dihitung berdasarkan selisih nilai octets antar interval waktu polling, sehingga dapat menggambarkan throughput jaringan.

6. Tabel alerts_log

  • Fungsi
    Menyimpan riwayat alert atau notifikasi yang dihasilkan oleh sistem monitoring.
    Data ini penting untuk keperluan audit dan analisis kejadian.
  • Kolom Utama
    id, device_id, rule_id, state, time_logged.
    Kolom rule_id mengacu pada aturan monitoring tertentu yang memicu alert.
  • Peran
    Berfungsi sebagai log historis yang mencatat setiap kejadian penting dalam sistem, sehingga dapat digunakan untuk evaluasi dan troubleshooting.

Relasi Antar Tabel

┌─────────────┐
│ devices │ (Master Data - UPDATE)
│ device_id │──────────────────────┐
└─────────────┘ │
│ │
├───────────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ processors │ │ storage │ │ ports │
│ (Latest Value) │ │ (Latest Value) │ │ (Master Data) │
│ UPDATE │ │ UPDATE │ │ UPDATE │
└─────────────────┘ └─────────────────┘ └────────┬────────┘

│ 1 : N

┌─────────────────────┐
│ port_traffic │
│ (Time-Series) │
│ APPEND │
└─────────────────────┘

Hubungan:

  • Satu device memiliki banyak processors (1:N) - untuk perangkat multi-core
  • Satu device memiliki banyak storage (1:N) - RAM, disk C:, disk D:, dll
  • Satu device memiliki banyak ports (1:N) - eth0, eth1, wlan0, dll
  • Satu port memiliki banyak port_traffic (1:N) - data trafik setiap 5 menit

Alasan Desain

1. Kenapa Tabel Dipisah?

Memisahkan tabel berdasarkan jenis data memberikan beberapa keuntungan:

  • Kejelasan struktur: Setiap tabel punya tanggung jawab spesifik
  • Performa query lebih baik: Tidak perlu scan seluruh data untuk mencari satu metrik
  • Fleksibilitas: Bisa menambah jenis monitoring baru tanpa mengubah tabel lain

2. Efisiensi Penyimpanan Data

  • Tabel devices terpisah
    Data perangkat disimpan sekali, tidak diulang di setiap record monitoring
  • Tipe data spesifik
    BIGINT untuk counter octets, INT untuk persentase
  • Foreign key dengan index
    Mempercepat JOIN antar tabel

3. Kemudahan Pengembangan (Scalable)

  • Menambah perangkat baru: cukup INSERT ke tabel devices
  • Menambah metrik baru: buat tabel baru tanpa mengganggu tabel existing
  • Partisi tabel time-series: bisa dipartisi per bulan/tahun untuk performa

4. Kemudahan Query

  • Query berdasarkan perangkat
    Data dapat difilter langsung menggunakan device_id sebagai acuan utama
  • Query per metrik
    Setiap jenis data (CPU, storage, trafik) berada di tabel terpisah sehingga query menjadi lebih sederhana dan terfokus
  • Query time-series
    Data pada tabel port_traffic dapat dengan mudah difilter berdasarkan rentang waktu (timestamp) untuk analisis tren
  • JOIN antar tabel
    Relasi foreign key memungkinkan penggabungan data antar tabel secara efisien untuk kebutuhan reporting 

Alasan Penggunaan Timestamp

Timestamp adalah elemen paling kritis dalam sistem monitoring time-series.

  • Tracking Waktu
    Mengetahui kapan tepatnya data diambil, sehingga setiap data memiliki konteks waktu yang jelas dan dapat dipertanggungjawabkan
  • Analisis Tren
    Melihat perubahan nilai dari waktu ke waktu, sehingga pola kenaikan, penurunan, atau anomali dapat dianalisis dengan lebih akurat
  • Pembuatan Grafik
    Sumbu X pada grafik selalu waktu, sehingga data dapat divisualisasikan secara kronologis dan mudah dipahami
  • Efisiensi Query
    Index timestamp mempercepat query range waktu, terutama saat mengambil data dalam rentang tertentu seperti per jam, hari, atau bulan

Hasil Pembelajaran

Melalui pembelajaran ini, saya memahami bahwa perancangan database untuk data SNMP harus mempertimbangkan jenis data yang dikumpulkan, seperti data performa, status, dan traffic. Struktur tabel perlu dirancang agar mampu menyimpan data secara berkala (time-series), sehingga setiap data memiliki informasi waktu (timestamp) yang jelas.

Saya juga mempelajari pentingnya pemisahan tabel berdasarkan fungsi, seperti tabel perangkat, tabel prosesor, dan tabel port. Dengan struktur ini, data menjadi lebih mudah dikelola dan diolah untuk kebutuhan analisis maupun visualisasi. Selain itu, penggunaan indexing pada kolom tertentu, seperti timestamp dan device_id, membantu meningkatkan performa query saat mengambil data.

Kesimpulan

Perancangan database merupakan tahap penting dalam membangun sistem monitoring berbasis Simple Network Management Protocol. Struktur database yang baik akan mempermudah proses penyimpanan, pengambilan, dan analisis data secara efisien.

Dengan memahami konsep perancangan database ini, saya memiliki dasar yang kuat untuk mengembangkan sistem monitoring yang mampu menangani data dalam jumlah besar serta mendukung kebutuhan analisis secara lebih optimal.