MongoDB sama seperti database lainnya mungkin gagal saat menjalankan operasi tulis. Dalam hal ini kita memerlukan strategi yang akan menjaga operasi di suatu tempat sehingga database dapat melanjutkan ketika dipulihkan kembali ke operasi.
Di MongoDB kami menggunakan penjurnalan di mana ada penulisan ke depan logging ke file jurnal pada disk untuk menjaga data tetap tersedia jika terjadi kegagalan. Mesin penyimpanan WiredTiger dapat menggunakan pos pemeriksaan untuk memberikan tampilan data yang konsisten pada disk dan memungkinkan MongoDB pulih dari pos pemeriksaan terakhir tetapi hanya jika tidak keluar secara tidak terduga. Jika tidak, untuk informasi yang terjadi selama pos pemeriksaan terakhir, penjurnalan harus diaktifkan untuk memulihkan data tersebut.
Prosedur untuk proses pemulihan adalah:database akan melihat ke dalam file data untuk menemukan pengidentifikasi pos pemeriksaan terakhir, gunakan pengidentifikasi ini untuk mencari di file jurnal untuk catatan yang cocok dengannya dan kemudian terapkan operasi dalam file jurnal sejak pos pemeriksaan terakhir.
Cara Kerja Penjurnalan di Mesin Penyimpanan WiredTiger
Untuk setiap klien yang memulai operasi tulis, WiredTiger membuat catatan jurnal yang terdiri dari operasi tulis internal yang dipicu oleh penulisan awal. Pertimbangkan dokumen dalam koleksi yang akan diperbarui dan kami berharap indeksnya juga dimodifikasi. WiredTiger akan membuat catatan jurnal tunggal yang akan menggabungkan operasi pembaruan dan modifikasi indeks yang sesuai.
Catatan ini akan disimpan dalam buffer dalam memori dengan kapasitas maksimum 128kB. Mesin penyimpanan kemudian menyinkronkan catatan jurnal buffer ini ke disk ketika salah satu dari berikut ini terpenuhi:
- Operasi penulisan menyertakan/menyiratkan perhatian penulisan j:true.
- WiredTiger membuat file jurnal baru setelah setiap 100MB data.
- Setelah setiap 100 milidetik, bergantung pada storage.journal.commitIntervalMs.
- Dalam hal anggota kumpulan replika:
- Contoh operasi yang menunggu entri oplog yaitu operasi baca yang dilakukan sebagai bagian dari sesi yang konsisten secara kausal dan meneruskan kueri pemindaian terhadap oplog.
- Setelah setiap aplikasi batch entri oplog jika ada anggota sekunder.
Dalam kasus hard shutdown mongod, jika operasi tulis sedang berlangsung, pembaruan dapat hilang meskipun catatan jurnal tetap berada di buffer WiredTiger.
Kompresi Data Jurnal
Pengaturan default di MongoDB mengarahkan WiredTiger untuk menggunakan kompresi cepat untuk data jurnal. Ini dapat diubah tergantung pada algoritme kompresi mana yang Anda inginkan menggunakan pengaturan storage.wiredTiger.engineConfig.journalCompressor. Catatan log ini hanya dikompresi jika ukurannya lebih besar dari 128 byte, yang merupakan ukuran catatan log minimum WiredTiger.
Membatasi Ukuran File Jurnal
Ukuran maksimum file jurnal adalah 100 MB dan oleh karena itu jika file melebihi batas ini, yang baru akan dibuat.
Setelah file jurnal digunakan dalam pemulihan atau lebih tepatnya ada file yang lebih lama dari yang dapat digunakan untuk memulihkan dari pos pemeriksaan terakhir, WiredTiger secara otomatis menghapusnya.
Pra-Alokasi
File jurnal dapat dialokasikan sebelumnya dengan mesin penyimpanan WiredTiger jika proses mongod menentukan bahwa lebih efisien untuk mengalokasikan file jurnal terlebih dahulu daripada membuat yang baru.
Cara kerja Jurnal di In-Memory Storage Engine
Mesin penyimpanan dalam memori dinyatakan sebagai bagian dari ketersediaan Umum (GA) dimulai dengan MongoDB Enterprise versi 3.2.6. Dengan mesin penyimpanan ini, data disimpan dalam memori sehingga tidak ada teknik penjurnalan yang terpisah. Jika ada operasi tulis dengan masalah tulis (j:true) mereka akan segera dikenali.
Untuk replika yang disetel dengan anggota voting menggunakan mesin penyimpanan dalam memori, seseorang harus menyetel writeConcernMajorityJournalDefault ke false. Jika tidak, jika ini disetel ke true, kumpulan replika akan mencatat peringatan startup.
Bila opsi ini disetel ke false, database tidak akan menunggu penulisan w:“mayority” untuk ditulis ke jurnal on-disk sebelum mengakui penulisan. Kerugian dari pendekatan ini adalah bahwa dengan mayoritas operasi tulis dapat memutar kembali jika terjadi kehilangan sementara (seperti restart atau crash) dari mayoritas node dalam set replika yang diberikan.
Jika menggunakan mesin penyimpanan MMapv1, pra-alokasi jurnal dapat dinonaktifkan menggunakan opsi --nopreallocation saat memulai mongod.
Dengan mesin penyimpanan WiredTiger, dari MongoDB versi 4.0 ke atas, tidak mungkin menentukan opsi --nojournal atau bahkan storage.journal.enabled:false untuk anggota kumpulan replika menggunakan mesin penyimpanan WiredTiger.
Mengelola Jurnal
Menonaktifkan Penjurnalan
Penjurnalan hanya dapat dinonaktifkan untuk penerapan mandiri dan tidak disarankan untuk sistem produksi. Untuk MongoDB versi 4.0 ke atas, seseorang tidak dapat menentukan opsi --nojournal maupun storage.journal.enabled:false ketika anggota kumpulan replika yang menggunakan mesin penyimpanan WiredTiger terlibat.
Untuk menonaktifkan penjurnalan, mulailah mongod dengan opsi baris perintah --nojournal.
Pantau Status Jurnal
Untuk mendapatkan statistik pada jurnal gunakan perintah db.serverStatus() yang mengembalikan wiredTiger.log.
Dapatkan Pengakuan Komitmen
Kami menggunakan masalah tulis dengan opsi j untuk mendapatkan pengakuan komit. {j:benar}. Penjurnalan harus diaktifkan dalam kasus ini jika tidak, instance mongod dapat menghasilkan kesalahan.
Jika penjurnalan diaktifkan, w:“mayority” ini mungkin menyiratkan j:true.
Untuk kumpulan replika, ketika j:true, penyiapan hanya memerlukan penulisan utama ke jurnal, terlepas dari masalah penulisan w:
Namun, meskipun j:true dikonfigurasi untuk kumpulan replika, rollback dapat terjadi karena failover utama kumpulan replika.
Pemulihan Data Penghentian Tak Terduga
Semua file jurnal di direktori jurnal diputar ulang setiap kali MongoDB dimulai ulang dari error sebelum server terdeteksi. Karena operasi ini akan direkam dalam output log, tidak perlu menjalankan --repair.
Mengganti Kompresor Jurnal WiredTiger
Snappy compressor adalah algoritme default kompresi untuk jurnal. Namun seseorang dapat mengubahnya tergantung pada penyiapan instance mongod.
Untuk instance mongod mandiri:
- Setel storage.wiredTiger.engineConfig.journalCompressor ke nilai baru untuk memperbaruinya. Cara paling tepat untuk melakukannya adalah melalui file konfigurasi, tetapi jika menggunakan opsi baris perintah, Anda harus memperbarui opsi baris perintah --wiredTigerJournalCompressor saat memulai ulang.
- Matikan instance mongod dengan menghubungkan ke shell mongo instance dan jalankan perintah:db.shutdownServer() atau db.getSiblingDB('admin ).shutdownServer()
- Mulai ulang instance mongod:
- Jika menggunakan file konfigurasi, gunakan:mongod -f
- Jika menggunakan opsi baris perintah, perbarui wiredTigerJournalCompressor:
Mongod --wiredTigerJournalCompressor <differentCompressor|none>
- Jika menggunakan file konfigurasi, gunakan:mongod -f
Untuk Anggota Set Replika:
- Matikan instance mongod:db.shutdownServer() atau db.getSiblingDB(‘admin).shutdownServer()
- Buat perubahan berikut pada file konfigurasi:
- Setel storage.journal.enabled ke false.
- Komentar pengaturan replikasi
- Setel parameter disableLogicalSessionCacheRefresh ke true.
i.e
storage:
journal:
enabled: false
#replication:
# replSetName: replA
setParameter:
disableLogicalSessionCacheRefresh: true
-
Mulai ulang instance mongod:
-
Jika menggunakan file konfigurasi, gunakan:mongod -f
-
Jika menggunakan opsi baris perintah:sertakan opsi --nojournal, hapus semua opsi baris perintah replikasi yaitu --replSet dan setel parameter disableLogicalSessionCacheRefresh ke true
mongod --nojournal --setParameter disableLogicalSessionCacheRefresh=true
-
-
Matikan instance mongod:
db.shutdownServer() or db.getSiblingDB(‘admin).shutdownServer()
-
Perbarui file konfigurasi untuk mempersiapkan restart anggota kumpulan replika dengan kompresor jurnal baru:Hapus penyimpanan. journal.enabled, batalkan komentar pada pengaturan replikasi untuk penerapan, hapus opsi disableLogicalSessionCacheRefresh dan terakhir hapus storage.wiredTiger.engineConfig.journalCompressor.
storage:
wiredTiger:
engineConfig:
journalCompressor: <newValue>
replication:
replSetName: replA
-
Mulai ulang instance mongod sebagai anggota kumpulan replika
- Jika menggunakan file konfigurasi, gunakan:mongod -f
- Jika menggunakan opsi baris perintah:hapus opsi --nojournal dan --wiredTigerJournalCompressor. Sertakan opsi baris perintah replikasi dan hapus parameter disableLogicalSessionCacheRefresh.
mongod --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...
Kesimpulan
Agar MongoDB menjamin ketahanan operasi tulis, penjurnalan digunakan di mana data ditulis ke dalam disk terus menerus penebangan Meskipun mesin penyimpanan WiredTiger (yang paling disukai) dapat memulihkan data melalui pos pemeriksaan terakhir, jika MongoDB keluar secara tidak terduga dan penjurnalan tidak diaktifkan, pemulihan data tersebut menjadi tidak mungkin. Jika tidak, jika penjurnalan diaktifkan, MongoDB dapat menerapkan kembali operasi tulis saat memulai ulang dan mempertahankan status yang konsisten.