Pengerasan dan pembaruan menurunkan peluang sebuah insiden, tetapi tidak sampai nol, dan cadangan (backup) adalah penjaga terakhir yang menentukan besarnya kerugian ketika insiden tetap terjadi. Topik ini membahas aturan 3-2-1 sebagai kerangka penyimpanan cadangan, kemudian membangun snapshot inkremental dengan rsync, yaitu potret folder pada titik-titik waktu berurutan yang hanya menyimpan perubahannya. Seluruh demonstrasi dieksekusi secara nyata pada sandbox, mulai dari pembuatan snapshot, pembuktian mekanismenya, pemeriksaan integritas, sampai pemulihan.
Aturan 3-2-1#
Aturan 3-2-1 menetapkan tiga ketentuan penyimpanan: data disimpan dalam tiga salinan, pada dua jenis media yang berbeda, dengan satu salinan berada di luar lokasi. Tiga salinan berarti data utama ditambah dua cadangan yang tidak saling menumpang, sehingga satu kegagalan tidak memusnahkan semuanya. Dua jenis media memisahkan risiko teknis antar perangkat, misalnya disk internal dan disk eksternal, yang jarang rusak pada saat yang sama. Salinan ketiga ditempatkan di luar lokasi fisik server (offsite), sehingga tetap aman ketika bencana menimpa satu gedung sekaligus, misalnya kebakaran atau pencurian perangkat.
Diagram berikut merangkum alur itu untuk sebuah server: data utama disalin menjadi snapshot rsync harian, lalu salinan tersebut dikirim ke disk eksternal dan penyimpanan offsite.
Penerapan pada server latihan difokuskan pada salinan pertama, yaitu snapshot yang berada di disk terpisah dari data sumber. Pengiriman salinan ke disk eksternal dan offsite memakai rsync yang sama, dan rutenya melalui SSH sebagaimana dibahas pada topik transfer berkas di modul SSH.
Snapshot inkremental dengan rsync#
Snapshot adalah potret isi folder pada satu titik waktu, dan deretan snapshot harian memungkinkan kembali ke versi kemarin, kemarin lusa, dan seterusnya. Cara paling sederhana, yaitu menyalin seluruh folder setiap hari, menghabiskan disk karena kebanyakan berkas tidak berubah dari hari ke hari. rsync menyelesaikannya dengan opsi --link-dest. Setiap berkas yang tidak berubah dibandingkan dengan snapshot sebelumnya, lalu dibuat sebagai hard link ke berkas pada snapshot tersebut. Hard link adalah tautan tambahan yang menunjuk ke data berkas yang sama, sehingga data hanya tersimpan satu kali di disk.
Demonstrasi dimulai dari folder kerja berisi dua berkas contoh, yaitu catatan rapat dan log sensor suhu.
# menyiapkan folder kerja beserta data contoh
rm -rf /tmp/kerja-strategi-cadangan
mkdir -p /tmp/kerja-strategi-cadangan/sumber /tmp/kerja-strategi-cadangan/cadangan
printf 'catatan rapat tim infrastruktur\nagenda: rotasi kunci ssh\n' > /tmp/kerja-strategi-cadangan/sumber/catatan.txt
printf '2026-11-02 08:00 suhu 24.1\n2026-11-02 09:00 suhu 24.3\n' > /tmp/kerja-strategi-cadangan/sumber/suhu.logSnapshot pertama adalah salinan penuh. Opsi -a menyalin rekursif sekaligus mempertahankan waktu dan izin berkas.
# snapshot pertama: salinan penuh dari folder sumber
rsync -a /tmp/kerja-strategi-cadangan/sumber/ /tmp/kerja-strategi-cadangan/cadangan/snap-1/Setelah satu baris ditambahkan pada catatan, snapshot kedua dibuat dengan --link-dest yang menunjuk ke snapshot pertama.
# satu baris baru ditambahkan pada catatan
printf 'catatan rapat tim infrastruktur\nagenda: rotasi kunci ssh\nkeputusan: pasang fail2ban\n' > /tmp/kerja-strategi-cadangan/sumber/catatan.txt
# snapshot kedua; --link-dest membuat hard link untuk berkas yang tidak berubah
rsync -a --delete --link-dest=/tmp/kerja-strategi-cadangan/cadangan/snap-1 /tmp/kerja-strategi-cadangan/sumber/ /tmp/kerja-strategi-cadangan/cadangan/snap-2/Opsi --delete membuat snapshot baru selalu cerminan persis dari sumber, termasuk menghapus berkas yang sudah tidak ada, sedangkan snapshot lama tidak tersentuh dan tetap menyimpan versi sebelumnya. Hasilnya berupa dua direktori yang masing-masing tampak utuh, tetapi berkas yang tidak berubah di antara keduanya hanya tersimpan satu kali di disk.
Membuktikan hard link#
Hard link dikenali dari dua sifatnya, yaitu jumlah tautan pada inode dan kesamaan nomor inode antar jalur. Inode adalah identitas berkas di dalam sistem berkas, sedangkan nama berkas hanyalah salah satu tautan ke inode itu. Jumlah tautan pada stat menyatakan berapa banyak nama yang menunjuk ke berkas yang sama.
# jumlah hard link pada setiap salinan berkas di kedua snapshot
stat -c "%h %n" /tmp/kerja-strategi-cadangan/cadangan/snap-1/catatan.txt /tmp/kerja-strategi-cadangan/cadangan/snap-2/catatan.txt /tmp/kerja-strategi-cadangan/cadangan/snap-1/suhu.log /tmp/kerja-strategi-cadangan/cadangan/snap-2/suhu.log1 /tmp/kerja-strategi-cadangan/cadangan/snap-1/catatan.txt
1 /tmp/kerja-strategi-cadangan/cadangan/snap-2/catatan.txt
2 /tmp/kerja-strategi-cadangan/cadangan/snap-1/suhu.log
2 /tmp/kerja-strategi-cadangan/cadangan/snap-2/suhu.logcatatan.txt yang berubah mendapat nilai 1 pada kedua snapshot karena kedua salinannya adalah berkas fisik yang terpisah. suhu.log yang tidak berubah justru bernilai 2 di kedua tempat karena kedua jalur menunjuk ke satu berkas yang sama. Kesamaan inode itu dapat dibandingkan langsung dengan ls -i, yang menampilkan nomor inode pada kolom pertama, dan perbandingannya tetap sah meskipun angka pastinya berbeda antar sistem. Menghapus salah satu jalur dengan rm pun hanya melepas satu nama, karena berkas fisik baru benar-benar hilang setelah tautan terakhirnya dilepas. Sifat inilah yang membuat snapshot lama tetap utuh saat sumber berubah.
# membandingkan inode kedua salinan suhu.log sebagaimana tampil pada ls -i
i1=$(ls -i /tmp/kerja-strategi-cadangan/cadangan/snap-1/suhu.log | awk '{print $1}')
i2=$(ls -i /tmp/kerja-strategi-cadangan/cadangan/snap-2/suhu.log | awk '{print $1}')
test "$i1" = "$i2" && echo "inode sama: kedua jalur berbagi satu berkas fisik"inode sama: kedua jalur berbagi satu berkas fisikPencarian yang lebih praktis menyasar jumlah tautannya secara langsung: setiap berkas dengan tautan lebih dari satu di dalam folder cadangan adalah berkas yang berbagi antar snapshot.
# mencari berkas dengan jumlah tautan lebih dari satu di folder cadangan
find /tmp/kerja-strategi-cadangan/cadangan -type f -links +1 | sort/tmp/kerja-strategi-cadangan/cadangan/snap-1/suhu.log
/tmp/kerja-strategi-cadangan/cadangan/snap-2/suhu.logRantai snapshot dan integritas#
Snapshot ketiga memperlihatkan rantai yang terbentuk ketika --link-dest menunjuk ke snapshot sebelumnya, bukan ke snapshot pertama.
# data berubah lagi, lalu snapshot ketiga dibuat dengan --link-dest ke snap-2
printf 'catatan rapat tim infrastruktur\nagenda: rotasi kunci ssh\nkeputusan: pasang fail2ban\ntindak lanjut: uji pemulihan\n' > /tmp/kerja-strategi-cadangan/sumber/catatan.txt
rsync -a --delete --link-dest=/tmp/kerja-strategi-cadangan/cadangan/snap-2 /tmp/kerja-strategi-cadangan/sumber/ /tmp/kerja-strategi-cadangan/cadangan/snap-3/# suhu.log kini memiliki tiga tautan, sedangkan catatan.txt terbaru berdiri sendiri
stat -c "%h %n" /tmp/kerja-strategi-cadangan/cadangan/snap-1/suhu.log /tmp/kerja-strategi-cadangan/cadangan/snap-3/suhu.log /tmp/kerja-strategi-cadangan/cadangan/snap-3/catatan.txt3 /tmp/kerja-strategi-cadangan/cadangan/snap-1/suhu.log
3 /tmp/kerja-strategi-cadangan/cadangan/snap-3/suhu.log
1 /tmp/kerja-strategi-cadangan/cadangan/snap-3/catatan.txtsuhu.log kini memiliki tiga tautan karena tiga snapshot menyimpannya tanpa menyalin ulang, sedangkan setiap versi catatan berdiri sendiri karena isinya berubah setiap hari. Rantai dibangun antar snapshot berurutan, bukan selalu ke snapshot pertama, karena perbandingan dengan snapshot terbaru menghasilkan hard link dalam jumlah paling banyak. Cadangan tanpa jaminan integritas dapat memberi rasa aman yang keliru, misalnya ketika disk perlahan merusak data tanpa pesan error. Checksum sha256 menutup celah tersebut: isi berkas diringkas menjadi 256 bit, dan satu bit pun yang berubah akan menghasilkan ringkasan yang berbeda. Manifest berupa berkas daftar checksum dibuat sekali, lalu diverifikasi kapan saja.
# membuat manifest checksum untuk snapshot ketiga
sha256sum /tmp/kerja-strategi-cadangan/cadangan/snap-3/catatan.txt /tmp/kerja-strategi-cadangan/cadangan/snap-3/suhu.log > /tmp/kerja-strategi-cadangan/SHA256SUMS
# memverifikasi isi snapshot terhadap manifest
sha256sum -c /tmp/kerja-strategi-cadangan/SHA256SUMS/tmp/kerja-strategi-cadangan/cadangan/snap-3/catatan.txt: OK
/tmp/kerja-strategi-cadangan/cadangan/snap-3/suhu.log: OKBaris OK menyatakan isi berkas saat pemeriksaan sama persis dengan isi saat manifest dibuat. Pemakaian ruang menjadi bukti terakhir bahwa hard link benar-benar bekerja.
# pemakaian ruang tiap snapshot; du menghitung inode yang berbagi tautan hanya satu kali
du -sh /tmp/kerja-strategi-cadangan/cadangan/snap-1 /tmp/kerja-strategi-cadangan/cadangan/snap-2 /tmp/kerja-strategi-cadangan/cadangan/snap-3 | tr '\t' ' '12K /tmp/kerja-strategi-cadangan/cadangan/snap-1
8.0K /tmp/kerja-strategi-cadangan/cadangan/snap-2
8.0K /tmp/kerja-strategi-cadangan/cadangan/snap-3Snapshot pertama menanggung seluruh berkas yang dibagikan, sedangkan dua snapshot berikutnya hanya menambah berkas yang benar-benar berubah. Angka persisnya bergantung pada ukuran blok sistem berkas, tetapi polanya selalu sama: ruang yang bertambah setiap hari jauh lebih kecil daripada ukuran data penuh.
Pemulihan#
Cadangan ada demi pemulihan (restore), dan pemulihan dengan rsync hanyalah arah kebalikannya: snapshot disalin kembali ke lokasi asalnya.
# memulihkan catatan versi snap-2 kembali ke folder sumber
rsync -a /tmp/kerja-strategi-cadangan/cadangan/snap-2/catatan.txt /tmp/kerja-strategi-cadangan/sumber/catatan.txt
# jumlah baris catatan hasil pemulihan
wc -l < /tmp/kerja-strategi-cadangan/sumber/catatan.txt3Folder sumber kembali memuat catatan versi snapshot kedua yang berisi tiga baris. Pemulihan selektif dan pemulihan penuh dibedakan sejak awal. Satu berkas yang terhapus keliru dipulihkan dengan menyalin ulang satu jalur, persis seperti contoh di atas. Kegagalan disk menuntut seluruh snapshot terakhir dikembalikan ke disk pengganti.
Folder pada demonstrasi ini sengaja dibuat kecil, tetapi pola perintahnya identik ketika sumbernya adalah seluruh direktori data server. Keduanya memakai rsync yang sama, dan keduanya dilatih pada lingkungan latihan terlebih dahulu sebelum benar-benar dibutuhkan. Langkah kecil ini sekaligus menjadi uji pemulihan, dan uji semacam itulah yang membedakan cadangan yang benar-benar ada dari cadangan yang hanya diasumsikan ada.
Kesalahan umum#
Kesalahan berikut paling sering muncul saat menyusun snapshot rsync.
- Hasil rsync berupa folder bersarang, misalnya
cadangan/sumber/.... Sumber ditulis tanpa garis miring di akhir, sehingga rsync menyalin folder itu sebagai satu entri, dan kebiasaan yang benar adalah menulissumber/apabila yang dimaksud adalah isi folder tersebut. - Snapshot baru ternyata berisi salinan penuh tanpa hard link sama sekali. Jalur
--link-destsalah, misalnya relatif terhadap direktori tujuan alih-alih jalur absolut, danfind -links +1yang kosong menandainya. Ulangi dengan jalur absolut, lalursync -nmemperlihatkan apa yang akan disalin ulang sebelum snapshot sungguhan dibuat. - Snapshot ditempatkan pada disk yang sama dengan data sumber. Kondisi ini melanggar aturan 3-2-1 karena kegagalan disk memusnakkan keduanya, sehingga snapshot lokal hanya dianggap tahap perantara sebelum dikirim ke media lain.
- Manifest checksum disimpan di dalam folder cadangan itu sendiri. Kerusakan atau pihak yang cukup berkuasa dapat mengubah keduanya sekaligus, sehingga manifest disimpan terpisah, misalnya pada folder kerja atau dikirim bersama salinan offsite.
Ringkasan#
- Aturan 3-2-1 menuntut tiga salinan data pada dua jenis media dengan satu salinan di luar lokasi fisik server.
- rsync dengan
-a --link-destmembangun snapshot harian yang berbagi hard link untuk berkas yang tidak berubah, sehingga ruang disk bertambah hanya sebesar perubahannya. - Jumlah tautan pada
statdan kesamaan inode padals -imembuktikan berbagi berkas, sedangkan manifestsha256summenjaga integritasnya. - Pemulihan memakai rsync pada arah sebaliknya, dan keberhasilannya baru sah disebut cadangan setelah diuji.
Referensi#
- rsync(1) — Debian Manpages
— opsi
-a,--delete, dan--link-destpada manual rsync. - The 3-2-1 backup rule — Backblaze — penjelasan aturan 3-2-1 beserta alasan tiap ketentuannya.