Mempelajari MongoDB membutuhkan banyak pemikiran yang tepat. Sedikit pertimbangan sering tidak dibuat dalam usaha penting yang sebaliknya dapat membahayakan kinerja database dalam mode produksi.
MongoDB adalah DBMS NoSQL yang secara harfiah mengikuti pola yang berbeda dari database SQL, terutama dalam hal keamanan dan struktur. Meskipun beberapa fitur terintegrasi meningkatkan kinerjanya dan menjadikannya salah satu yang terbaik belakangan ini, beberapa fitur menimbulkan potensi ancaman yang dapat merusak kinerjanya jika tidak diperhitungkan.
Dalam pengalaman "kasus terburuk" baru-baru ini, saya mencoba menanyakan koleksi dengan dokumen yang memiliki susunan besar dan butuh waktu lama bagi saya untuk mendapatkan hasilnya kembali. Saya memutuskan untuk menulis blog ini karena saya tahu jika seseorang mengalami masalah yang sama bahwa blog ini akan sangat membantu.
Pertimbangan Utama untuk MongoDB dalam Produksi
- Keamanan dan otentikasi.
- Mengindeks dokumen Anda
- Menggunakan skema di koleksi Anda
- Koleksi terbatas
- Ukuran dokumen
- Ukuran array untuk dokumen yang disematkan
- Tahap alur agregasi
- Urutan kunci dalam objek hash
- 'tidak terdefinisi' dan 'null' di MongoDB
- Operasi tulis
Keamanan dan Otentikasi MongoDB
Data bervariasi dalam banyak hal dan Anda jelas perlu merahasiakan beberapa informasi. Secara default, pemasangan MongoDB tidak menetapkan persyaratan otentikasi sebagai suatu keharusan tetapi itu tidak memberi Anda kesempatan untuk menggunakannya terutama ketika data rahasia seperti catatan keuangan dan medis terlibat. Pada workstation pengembangan, ini bukan masalah besar tetapi karena keterlibatan multi-pengguna dalam mode produksi, adalah praktik yang baik untuk mengatur sertifikat otentikasi. Metode yang paling umum dan mudah digunakan adalah kredensial Nama Pengguna dan Kata Sandi MongoDB default.
Data ditulis ke file yang dapat diakses melalui alat pihak ketiga terlebih lagi jika tidak dienkripsi. Data dapat diubah tanpa sepengetahuan Anda jika beberapa orang anonim mendapatkan akses ke file sistem. Hosting database di server khusus dan menetapkan satu pengguna yang akan memiliki akses penuh ke file data akan menghemat trik Anda.
Melindungi data dari serangan injeksi eksternal juga merupakan tugas penting. Beberapa operator seperti $group, $whereby dan operasi mapReduce dikembangkan oleh javascript(js) sehingga rentan terhadap manipulasi js. Untuk menghindari instance integritas data sebagai hasilnya, Anda dapat menonaktifkan pengaturan JS arbitrer dengan mengonfigurasi parameter javascriptEnabled:false dalam file konfigurasi jika Anda belum menggunakan salah satu operator yang disebutkan. Selanjutnya, Anda dapat mengurangi risiko akses data melalui pelanggaran jaringan dengan menggunakan beberapa prosedur yang disorot dalam Daftar Periksa Keamanan MongoDB.
Mengindeks Dokumen Anda
Pengindeksan umumnya menetapkan nilai identifikasi unik untuk setiap dokumen dalam koleksi MongoDB. Pengindeksan menghasilkan peningkatan kinerja dalam operasi baca dan tulis. Secara default, ini diaktifkan dan seseorang harus selalu mempertahankan setelan tersebut. Tanpa pengindeksan, database harus memeriksa beberapa dokumen dari awal sampai akhir dan sayangnya operasi akan memakan waktu yang mahal untuk dokumen yang menjelang akhir, menghasilkan latensi yang buruk untuk kueri. Pada titik tertentu, di ujung aplikasi, pengguna mungkin mengalami kelambatan dan mungkin mengira aplikasi tersebut sebenarnya tidak berfungsi. Pengindeksan sangat membantu dalam operasi kueri pengurutan dan pencarian tanpa mengabaikan operasi pencarian itu sendiri. Penyortiran adalah operasi umum untuk banyak dokumen yang dikembalikan. Ini sering dilakukan sebagai tahap akhir setelah dokumen difilter sehingga sejumlah kecil data perlu disortir. Indeks dalam hal ini akan membantu mengurutkan data dalam sifat entri dan membatasi data yang dikembalikan hingga batas 32MB. Jika tidak ada pengindeksan, kemungkinan batas memori 32 pada ukuran gabungan dokumen yang dikembalikan akan terlampaui dan setiap kali database mencapai batas ini, itu akan menimbulkan kesalahan selain mengembalikan kumpulan catatan kosong.
$operasi pencarian juga didukung dengan pengindeksan di tempat. Indeks pada nilai kunci yang digunakan sebagai kunci asing sangat penting untuk pemrosesan tahap sebelumnya.
Menggunakan Skema di Koleksi Anda
MongoDB tidak memerlukannya untuk mendefinisikan bidang (kolom) seperti yang mungkin Anda perlukan untuk SQL dbms. Seberapa pun Anda tidak perlu mendefinisikan bidang, untuk menghindari inkonsistensi data dan beberapa kemunduran yang mungkin muncul, mendefinisikan skema selalu merupakan praktik yang baik. Desain skema memungkinkan Anda untuk menentukan jenis data mana yang masuk ke bidang tertentu, bidang mana yang harus diberikan dengan nilai dan umumnya meningkatkan validasi data sebelum masuk atau memperbarui sehingga meningkatkan integritas dan konsistensi data. Desain skema juga akan mengarahkan Anda apakah akan mereferensikan atau menyematkan data. Sebagai pemula, Anda mungkin berpikir bahwa satu-satunya model adalah “Satu-ke-N” yang akan memfasilitasi seseorang untuk memiliki entri larik subdokumen, tetapi bukan itu masalahnya.
Anda perlu memahami hubungan kardinalitas antar dokumen sebelum membuat model Anda. Beberapa aturan yang akan membantu Anda memiliki skema yang optimal adalah:
- Untuk mengurangi jumlah kueri yang perlu Anda jalankan sebelum mengakses beberapa data dan jika hanya sedikit kolom atau elemen larik yang terlibat, Anda dapat menyematkan subdokumen. Ambil contoh model di bawah ini:
-
{ Name: ‘John Doh’, Age:20 Addresses:[ {street: ‘Moi Avenue’, city:’Nairobi’, countryCode: ‘KE’}, {street: ‘Kenyatta Avenue’, city:’Nairobi’, countryCode: ‘KE’}, ] }
-
- Untuk dokumen yang sering diperbarui, gunakan denormalisasi . Jika ada bidang yang akan sering diperbarui, maka akan ada tugas untuk menemukan semua contoh yang perlu diperbarui. Hal ini akan menghasilkan pemrosesan kueri yang lambat, sehingga membanjiri bahkan manfaat yang terkait dengan denormalisasi.
- Kueri kompleks seperti pemipaan agregat membutuhkan lebih banyak waktu untuk dieksekusi ketika banyak sub-dokumen terlibat dan ada kebutuhan untuk mengambil dokumen secara terpisah.
- Elemen array dengan kumpulan data objek yang besar tidak boleh disematkan secara jelas karena faktanya elemen tersebut dapat bertambah dan akibatnya melebihi ukuran dokumen.
Pemodelan skema sering ditentukan oleh pola akses aplikasi. Anda dapat menemukan lebih banyak prosedur yang dapat membantu dalam mendesain model Anda di blog 6 Rules of Thumb for MongoDB Schema Design
Gunakan Koleksi Capped untuk Prioritas Dokumen Terbaru
MongoDB menyediakan banyak sumber daya seperti koleksi yang dibatasi. Sayangnya beberapa akhirnya tidak dimanfaatkan. Koleksi yang dibatasi memiliki ukuran tetap dan diketahui mendukung operasi throughput tinggi yang menyisipkan dan mengambil dokumen berdasarkan urutan penyisipan. Ketika ruangnya terisi, dokumen lama dihapus untuk memberi ruang bagi yang baru.
Contoh kasus penggunaan koleksi yang dibatasi:
- Menyimpan data yang sering diakses karena koleksi itu sendiri lebih banyak membaca daripada menulis. Anda perlu memastikan koleksi selalu dalam performa.
- Informasi log untuk sistem volume tinggi. Koleksi yang dibatasi sering tidak menggunakan indeks dan ini menguntungkan karena kecepatan perekamannya cukup cepat seperti menulis ke dalam file.
Perhatikan Ukuran Dokumen MongoDB
Setiap dokumen MongoDB dibatasi hingga ukuran 16 megabita. Namun, sebaiknya dokumen mencapai atau mendekati batas ini karena akan menimbulkan beberapa masalah kinerja yang mengerikan. MongoDB sendiri bekerja paling baik ketika ukuran dokumen beberapa kilobyte. Jika dokumen berukuran cukup besar, permintaan proyeksi yang rumit akan memakan waktu lama dan waktu kueri mungkin habis.
Perhatikan Ukuran Array Dokumen Tersemat
Seseorang dapat mendorong subdokumen ke bidang dalam dokumen sehingga menciptakan nilai larik di bidang ini. Seperti disebutkan sebelumnya, Anda perlu menjaga ukuran subdokumen tetap rendah. Sama pentingnya untuk memastikan jumlah elemen larik di bawah angka empat. Jika tidak, dokumen akan tumbuh melebihi ukurannya dan perlu dipindahkan ke disk. Masalah lebih lanjut yang terkait dengan operasi semacam itu adalah, bahwa setiap dokumen perlu diindeks ulang. Selain itu, setiap subdokumen sama-sama perlu diindeks ulang. Artinya akan banyak tulisan indeks yang mengakibatkan operasi lambat. Untuk ukuran subdokumen yang besar, menyimpan catatan dalam koleksi baru lebih penting daripada menyematkan.
Tahap Agregasi Pipeline
Selain operasi kueri MongoDB normal, ada kerangka kerja agregasi yang digunakan untuk memanipulasi dan mengembalikan data sesuai dengan beberapa spesifikasi seperti pengurutan dan pengelompokan. MongoDB tidak memiliki pengoptimal kueri sehingga perlu satu untuk memesan kueri dengan tepat. Dengan framework agregasi, pastikan tahapan pipeline tertata dengan baik. Mulailah dengan mengurangi jumlah data yang Anda tangani menggunakan operator $match dan mungkin $sort pada akhirnya jika perlu diurutkan. Anda dapat menggunakan alat pihak ketiga seperti Studio 3T untuk mengoptimalkan kueri agregasi Anda sebelum mengintegrasikannya ke dalam kode Anda. Alat ini memungkinkan Anda melihat input dan output data di salah satu tahapan sehingga mengetahui apa yang Anda hadapi.
Menggunakan $limit dan $sort harus selalu memberikan hasil yang sama setiap kali kueri dijalankan. Jika Anda menggunakan $limit, data yang dikembalikan tidak akan bersifat deterministik dan dapat menyebabkan beberapa masalah yang sulit dilacak.
Periksa Urutan Kunci dalam Objek Hash
Pertimbangkan untuk memiliki dua dokumen besar dengan data sampel
{
FirstName: ‘John’,
LastName: ‘Doh’
}
Jika Anda melakukan operasi pencarian dengan kueri {FirstName:'John', LastName:'Doh'}, operasi tidak cocok dengan kueri {LastName:'Doh' FirstName:'John' }. Oleh karena itu Anda perlu menjaga urutan pasangan nama dan nilai dalam dokumen Anda.
Hindari 'tidak terdefinisi' dan 'null' di MongoDB
MongoDB menggunakan format BSON untuk dokumennya. Dengan validasi JSON, 'undefined' tidak didukung dan Anda harus menghindari menggunakannya. $null hadir sebagai solusi tetapi Anda juga harus menghindarinya.
Pertimbangkan Operasi Tulis
Anda mungkin menyetel MongoDB untuk penulisan berkecepatan tinggi tetapi ini menimbulkan kemunduran dalam hal itu, respons dikembalikan bahkan sebelum data ditulis. Penjurnalan harus diaktifkan untuk menghindari skenario ini. Selain itu, jika database rusak, data akan tetap tersedia dan akan membuat pos pemeriksaan yang dapat digunakan dalam proses pemulihan. Konfigurasi durasi penulisan jurnal dapat diatur menggunakan parameter commitIntervalMs.
Kesimpulan
Sistem basis data harus memastikan integritas dan konsistensi data selain tahan terhadap kegagalan dan kejahatan. Namun, untuk sampai pada faktor ini, seseorang perlu memahami database itu sendiri dan data yang dimilikinya. MongoDB akan bekerja dengan baik ketika faktor-faktor yang disebutkan di atas diperhitungkan. Yang terpenting dari mereka adalah menggunakan skema. Skema memungkinkan Anda untuk memvalidasi data Anda sebelum masuk atau memperbarui dan bagaimana Anda akan memodelkan data ini. Pemodelan data sering didorong oleh pola aksesibilitas aplikasi. Semua penjumlahan ini akan menawarkan kinerja database yang lebih baik.