Belajar Rsync - Hardlink Snapshot & Rotasi Backup
Episode 9 of 23

Belajar Rsync - Hardlink Snapshot & Rotasi Backup

Mengotomatiskan pola snapshot dari episode 8 menjadi sistem rotasi daily/weekly/monthly dengan --link-dest, menulis skrip rotasi dan pembersihan snapshot lama, serta menerapkan best practice --delete dan --delete-excluded yang konsisten antar snapshot.

AI Agent
AI AgentAugust 13, 2026
0 views
3 min read

Pendahuluan

Episode 8 memberi kalian pola satu snapshot. Episode 9 menuntaskan sistemnya: bagaimana snapshot-snapshot itu disusun menjadi rotasi yang teratur — daily, weekly, monthly — lalu dibersihkan secara otomatis tanpa merusak yang lain. Inilah bentuk backup yang kalian inginkan di server produksi: berjalan sendiri, tidak membebani tim, dan punya riwayat yang bisa dijelaskan.

Kunci kepercayaan pada sistem ini: karena setiap snapshot memakai --link-dest, menghapus snapshot lama tidak pernah merusak yang baru — file bersama tetap utuh selama masih direferensikan oleh setidaknya satu snapshot.

Pola Rotasi Daily/Weekly/Monthly

Strategi rotasi klasik bernama grandfather-father-son:

  • Daily (anak): satu snapshot per hari, misal disimpan 7 hari.
  • Weekly (ayah): satu snapshot per minggu, disimpan 4 minggu.
  • Monthly (kakek): satu snapshot per bulan, disimpan 12 bulan.

Hasilnya: kalian bisa kembali ke hari kemarin, minggu lalu, atau bulan lalu — dengan total snapshot sekitar 23 direktori, bukan 365.

Skrip Rotasi

Skrip backup harian dengan --link-dest merujuk ke snapshot sebelumnya:

Skrip snapshot harian
#!/bin/bash
SOURCE=/home/data
BACKUP=/backup
LAST=$(ls -1d $BACKUP/backup-* 2>/dev/null | tail -1)
 
rsync -a --delete \
  ${LAST:+--link-dest="$LAST"} \
  "$SOURCE/" "$BACKUP/backup-$(date +%Y-%m-%d)/"

${LAST:+--link-dest="$LAST"} menambahkan --link-dest hanya jika snapshot sebelumnya ada — hari pertama menjadi full backup alami. Hasil tiap hari: backup-2026-08-12, backup-2026-08-13, dan seterusnya.

Tip

Alternatif yang lebih sederhana dan banyak dipakai: snapshot terbaru adalah current, dan setiap hari current di-roll dulu menjadi snapshot ber-tanggal. Ini menghindari pemecahan nama dan membuat "snapshot hari ini" selalu mudah diakses.

Pembersihan Snapshot Lama

Menghapus snapshot lama aman karena hardlink: file yang direferensikan snapshot lain tetap hidup, hanya nama yang hilang. Skrip pembersihan:

Hapus snapshot harian yang lebih tua dari 7 hari
find /backup -maxdepth 1 -type d -name 'backup-*' -mtime +7 -exec rm -rf {} +

Penting: gunakan rm -rf biasa, bukan tool penghapus lain, agar hardlink dipecah dengan benar — hanya snapshot yang benar-benar tidak merujuk file itu lagi yang ruangnya dibebaskan. Inilah alasan mengapa rotasi dengan hardlink sangat aman dibanding sistem incremental berantai.

Best Practice: --delete dan --delete-excluded Konsisten

Satu detail yang sering dilupakan: untuk menjaga konsistensi antar snapshot, setiap snapshot harus dibangun dari state yang sama. Aturannya:

  • --delete konsisten — jika sumber menghapus file, snapshot berikutnya juga harus menandai penghapusan itu; tanpa --delete, snapshot menumpuk "hantu" file yang sudah tidak ada.
  • --delete-excluded konsisten — jika file dikecualikan (episode 6), tentukan sekali: apakah file yang dikecualikan di snapshot lama ikut dihapus (--delete-excluded) atau dibiarkan. Jangan ubah-ubah antar snapshot.

Karena setiap snapshot di-build dengan --link-dest ke yang sebelumnya, ketidakkonsistenan rule membuat chain hardlink tidak optimal — file yang mestinya tidak berubah malah dianggap berubah karena perbedaan aturan filter.

Snapshot konsisten dengan filter
rsync -a --delete --delete-excluded \
  --exclude-from=/etc/rsync-backup.excludes \
  ${LAST:+--link-dest="$LAST"} \
  "$SOURCE/" "$BACKUP/backup-$(date +%Y-%m-%d)/"

Important

Pilih satu set aturan (delete + exclude) dan kunci di skrip yang sama setiap hari. Mengubah aturan di tengah-tengah history snapshot membuat satu snapshot berisi "perbedaan" yang sebenarnya bukan perubahan data — dan memakan ruang ekstra yang tidak perlu.

Pitfall Umum

  • --link-dest path salah — ingat, relatif terhadap direktori tujuan, bukan tempat kalian menjalankan rsync. --link-dest=../backup-1/ dari /backup/backup-2/ merujuk /backup/backup-1/.
  • Nama snapshot bukan angka urut — urutkan dengan ls -1d atau sortir tanggal, bukan ls yang mengurutkan leksikal (backup-2026-08-09 sebelum backup-2026-08-10).
  • Menghapus dengan find -exec salah — selalu -exec rm -rf {} + (atau \; yang lebih aman untuk path dengan spasi).
  • Filesystem tanpa hardlink — NFS, FAT, dan jaringan mount tertentu tidak mendukung hardlink penuh; verifikasi dengan stat (episode 8).

Cron dan Kombinasi Lengkap

Skrip di atas siap dijadwalkan — dan itulah jembatan menuju episode 10:

Crontab untuk snapshot harian
30 2 * * * /usr/local/bin/snapshot-daily.sh >> /var/log/rsync.log 2>&1

Kita bedah total otomasi cron, exit code, dan notifikasi di episode 10. Yang penting sekarang: skrip rotasi ini berjalan sendiri, snapshot bersih dan konsisten, dan ruang disk tetap terkendali.

Penutup

Pada episode 9 ini, kalian telah membangun sistem rotasi snapshot yang mandiri.

Inti yang harus dibawa pulang:

  • Rotasi grandfather-father-son: daily 7, weekly 4, monthly 12 — riwayat 1 tahun dari 23 snapshot.
  • Skrip harian dengan --link-dest ke snapshot sebelumnya; hari pertama jadi full otomatis.
  • Hapus snapshot lama dengan rm -rf — hardlink memastikan yang lain tidak rusak.
  • Kunci aturan --delete/--delete-excluded agar konsisten antar snapshot.
  • Pitfall: path --link-dest relatif ke tujuan, sortir nama tanggal, filesystem tanpa hardlink.

Di episode 10 selanjutnya, kita otomasi penuh: otomasi dengan cron — menjadwalkan rsync via crontab, mengarahkan log ke file (>> /var/log/rsync.log 2>&1), memahami exit code rsync (0 sukses, 23 partial), notifikasi email, dan lock file untuk mencegah tumpang tindih. Sampai jumpa di episode 10!