AOF (Append Only File, berkas tambah-saja) adalah mekanisme persistensi Redis yang mencatat setiap perintah tulis ke berkas log, lalu memainkan ulang seluruh catatan saat server dimulai kembali. Topik ini membahas cara AOF mencatat perintah, struktur berkas multi-part pada Redis 8, kebijakan fsync, proses rewrite untuk memadatkan berkas, serta pemulihan data. Setelah membacanya, siklus AOF dapat diikuti dari perintah tulis pertama sampai data kembali utuh setelah restart.
Mencatat perintah, bukan data#
AOF berlawanan arah dengan RDB. Alih-alih menulis snapshot data, AOF mencatat perintah tulis persis sebagaimana diterima server, dalam format RESP yang sama dengan protokol komunikasi Redis. SET, INCR, DEL, dan seluruh perintah tulis lain masuk ke catatan, sehingga memainkan ulang berkasnya menghasilkan dataset yang sama dengan kondisi sebelum server mati. Server menampung setiap perintah dalam buffer yang disebut aof_buf, kemudian menuliskannya ke berkas AOF dan menjalankan fsync (pemaksaan penulisan ke disk) sesuai kebijakan yang dikonfigurasi.
Lab pada topik ini menjalankan server khusus di port 6386 dengan AOF aktif, kebijakan fsync setiap detik, dan save point dimatikan agar percobaan hanya melibatkan AOF.
# kosongkan direktori lab dan siapkan kembali di /tmp
rm -rf /tmp/lab-aof
mkdir -p /tmp/lab-aof
# hentikan sisa server dari sesi sebelumnya, bila ada
redis-cli -p 6386 shutdown nosave 2>/dev/null || true
# nyalakan server khusus topik ini dengan AOF aktif dan fsync setiap detik
redis-server --port 6386 --bind 127.0.0.1 --daemonize yes --dir /tmp/lab-aof --appendonly yes --appendfsync everysec --save "" --protected-mode no --logfile /tmp/lab-aof-server.log# simpan key contoh
redis-cli -p 6386 set aof:nama Budi
# naikkan counter sebanyak tiga kali, setiap perintah dicatat ke AOF
redis-cli -p 6386 incr aof:kunjungan
redis-cli -p 6386 incr aof:kunjungan
redis-cli -p 6386 incr aof:kunjunganOK
1
2
3# tampilkan isi direktori data, berkas AOF berada di dalam subdirektori khusus
ls /tmp/lab-aof
# tampilkan berkas multi-part AOF
ls /tmp/lab-aof/appendonlydirappendonlydir
appendonly.aof.1.base.rdb
appendonly.aof.1.incr.aof
appendonly.aof.manifestNama berkas AOF menjadi dasar penamaan seluruh bagian multi-part. Konfigurasi appendfilename berisi nama dasarnya, sedangkan appenddirname berisi nama subdirektori tempat ketiga bagian itu berada.
# tampilkan nama dasar berkas AOF
redis-cli -p 6386 config get appendfilename
# tampilkan nama subdirektori AOF
redis-cli -p 6386 config get appenddirnameappendfilename
appendonly.aof
appenddirname
appendonlydirBerkas multi-part pada Redis 8#
Redis 7 dan 8 menyimpan AOF sebagai tiga bagian yang bekerja bersama, dengan peran sebagai berikut.
appendonly.aof.manifestberupa daftar isi yang memuat urutan berkas dan perannya.appendonly.aof.1.base.rdbberupa basis dataset yang ditulis dalam format RDB.appendonly.aof.1.incr.aofberupa tambahan perintah tulis sejak basis dibuat.
Angka 1 pada nama berkas adalah nomor urut generasi. Setiap kali rewrite selesai, generasi baru dibuat, berkas lama dihapus, dan manifest diperbarui. Karena basisnya menggunakan format RDB, pola ini sekaligus merupakan bentuk pendekatan hibrida antara snapshot dan pencatatan perintah.
Isi berkas incr#
Isi berkas incr dapat dilihat langsung karena perintahnya ditulis dalam teks RESP. Perintah od menampilkan setiap byte beserta teksnya pada kolom kanan.
# tampilkan isi berkas incr dalam bentuk byte beserta teksnya
od -A d -t x1z /tmp/lab-aof/appendonlydir/appendonly.aof.1.incr.aof0000000 2a 32 0d 0a 24 36 0d 0a 53 45 4c 45 43 54 0d 0a >*2..$6..SELECT..<
0000016 24 31 0d 0a 30 0d 0a 2a 33 0d 0a 24 33 0d 0a 73 >$1..0..*3..$3..s<
0000032 65 74 0d 0a 24 38 0d 0a 61 6f 66 3a 6e 61 6d 61 >et..$8..aof:nama<
0000048 0d 0a 24 34 0d 0a 42 75 64 69 0d 0a 2a 32 0d 0a >..$4..Budi..*2..<
0000064 24 34 0d 0a 69 6e 63 72 0d 0a 24 31 33 0d 0a 61 >$4..incr..$13..a<
0000080 6f 66 3a 6b 75 6e 6a 75 6e 67 61 6e 0d 0a 2a 32 >of:kunjungan..*2<
0000096 0d 0a 24 34 0d 0a 69 6e 63 72 0d 0a 24 31 33 0d >..$4..incr..$13.<
0000112 0a 61 6f 66 3a 6b 75 6e 6a 75 6e 67 61 6e 0d 0a >.aof:kunjungan..<
0000128 2a 32 0d 0a 24 34 0d 0a 69 6e 63 72 0d 0a 24 31 >*2..$4..incr..$1<
0000144 33 0d 0a 61 6f 66 3a 6b 75 6e 6a 75 6e 67 61 6e >3..aof:kunjungan<
0000160 0d 0a >..<
0000162Berkas diawali perintah SELECT 0, yaitu penanda basis data yang menyimpan key berikutnya, lalu diikuti perintah set aof:nama Budi dan tiga perintah incr. Dua titik berurutan pada kolom kanan menyembunyikan pasangan \r\n yang memisahkan bagian protokol RESP. Inilah bukti bahwa AOF menyimpan perintah, bukan nilai akhirnya, karena nilai counter tidak tertulis di berkas dan yang tertulis hanya tiga perintah penaikannya.
Kebijakan fsync#
Kebijakan fsync menentukan seberapa sering isi aof_buf dipaksa turun ke disk, dan nilainya diatur melalui konfigurasi appendfsync. Tabel berikut merangkum tiga nilainya.
| Nilai | Frekuensi fsync | Konsekuensi |
|---|---|---|
| always | setiap perintah tulis | jaminan paling kuat, tetapi setiap tulisan menunggu disk sehingga paling lambat |
| everysec | sekali per detik | kompromi bawaan, kehilangan terjadi paling banyak sekitar satu detik tulisan |
| no | diserahkan kepada sistem operasi | tercepat, tetapi jendela kehilangan data bergantung pada perilaku sistem operasi |
# tampilkan kebijakan fsync yang sedang aktif
redis-cli -p 6386 config get appendfsyncappendfsync
everysecKonfigurasi ini dapat diubah saat server berjalan tanpa restart, dan perubahan itu langsung berlaku untuk tulisan berikutnya.
# naikkan kebijakan fsync ke setiap tulisan
redis-cli -p 6386 config set appendfsync always
# kembalikan ke kebijakan sekali per detik
redis-cli -p 6386 config set appendfsync everysecOK
OKRewrite: memadatkan berkas AOF#
Karena mencatat perintah, berkas incr tumbuh terus meskipun datasetnya kecil. Tiga perintah incr berturut-turut memiliki efek yang sama dengan satu perintah set pada nilai akhirnya. Proses rewrite (penulisan ulang) mengganti isi AOF dengan rangkaian perintah minimum yang menghasilkan dataset saat ini. Redis menjalankannya di proses anak melalui BGREWRITEAOF, dengan pola fork yang mirip BGSAVE, dan juga memicunya otomatis ketika ukuran berkas melewati ambang yang dikonfigurasi.
# padatkan berkas AOF dengan rewrite di background
redis-cli -p 6386 bgrewriteaofBackground append only file rewriting started# beri waktu proses rewrite menyelesaikan tugasnya
sleep 2
# tampilkan berkas AOF setelah rewrite selesai
ls /tmp/lab-aof/appendonlydirappendonly.aof.2.base.rdb
appendonly.aof.2.incr.aof
appendonly.aof.manifestUrutan generasi naik dari 1 menjadi 2, sedangkan nama manifest tetap. Basis baru berisi dataset dalam format RDB, sedangkan berkas incr generasi baru hanya berisi perubahan setelah basis itu dibuat. Ambang rewrite otomatis dapat dilihat pada dua konfigurasi berikut.
# tampilkan persentase kenaikan yang memicu rewrite otomatis
redis-cli -p 6386 config get auto-aof-rewrite-percentage
# tampilkan ukuran minimum sebelum rewrite otomatis berlaku
redis-cli -p 6386 config get auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage
100
auto-aof-rewrite-min-size
67108864Konfigurasi auto-aof-rewrite-percentage berisi 100, yang berarti rewrite otomatis dipicu ketika ukuran berkas tumbuh dua kali lipat dibandingkan dengan ukuran setelah rewrite terakhir, dengan syarat ukurannya sudah melewati auto-aof-rewrite-min-size senilai 67108864 byte, yaitu 64 MB.
Pemulihan dari AOF#
Saat server dimulai dengan AOF aktif, Redis memainkan ulang isi berkas multi-part dari basis hingga incr sebelum menerima koneksi. Uji berikut mematikan server, menyalakannya kembali, lalu membaca kedua key contoh.
# matikan server tanpa menulis ulang berkas
redis-cli -p 6386 shutdown nosave
# nyalakan ulang server, isi AOF dimainkan ulang dari awal
redis-server --port 6386 --bind 127.0.0.1 --daemonize yes --dir /tmp/lab-aof --appendonly yes --appendfsync everysec --save "" --protected-mode no --logfile /tmp/lab-aof-server.log
# tunggu server siap, lalu baca kembali data hasil pemulihan
sleep 1
redis-cli -p 6386 get aof:nama
redis-cli -p 6386 get aof:kunjunganBudi
3Kedua nilai kembali utuh karena seluruh perintah dimainkan ulang sesuai urutannya. Pemulihan AOF juga mengikuti penghapusan, sehingga key yang dihapus sebelum server mati tetap hilang setelah menyala kembali.
# hapus satu key, perintah DEL juga dicatat ke AOF
redis-cli -p 6386 del aof:kunjungan
# matikan dan nyalakan ulang server sekali lagi
redis-cli -p 6386 shutdown nosave
redis-server --port 6386 --bind 127.0.0.1 --daemonize yes --dir /tmp/lab-aof --appendonly yes --appendfsync everysec --save "" --protected-mode no --logfile /tmp/lab-aof-server.log
# tunggu server siap, lalu periksa kedua key
sleep 1
redis-cli -p 6386 exists aof:kunjungan
redis-cli -p 6386 get aof:nama1
0
BudiKeluaran 0 pada EXISTS menunjukkan key yang dihapus tetap tidak ada setelah pemulihan, sedangkan key lain tetap utuh. Apabila berkas AOF terpotong akibat kegagalan disk, alat redis-check-aof dapat memeriksa serta memperbaiki bagian akhirnya, dan konfigurasi aof-load-truncated menentukan apakah server tetap menyala dengan memuat bagian yang masih sah.
Seluruh percobaan AOF pada topik ini sudah selesai, sehingga server lab dimatikan di sini.
# matikan server khusus topik ini
redis-cli -p 6386 shutdown nosaveRingkasan#
- AOF mencatat setiap perintah tulis ke berkas incr dalam format RESP, sehingga pemulihan dilakukan dengan memainkan ulang perintah.
- Berkas multi-part Redis 8 terdiri atas manifest, basis dalam format RDB, dan berkas incr untuk perubahan terbaru.
- Kebijakan
appendfsyncmenentukan jendela kehilangan data, dengan everysec sebagai kompromi bawaan. - Rewrite menjaga berkas tetap kecil dengan menulis ulang dataset menjadi rangkaian perintah minimum, secara manual maupun otomatis.
Referensi#
- Redis persistence — Redis — Dokumentasi resmi AOF, termasuk kebijakan fsync, rewrite, dan multi-part AOF.
- BGREWRITEAOF — Redis — Halaman perintah rewrite AOF beserta perilakunya.
- CONFIG SET — Redis
— Mengubah konfigurasi seperti
appendfsyncsaat server berjalan.