14 hal yang saya harap saya ketahui sebelum memulai MongoDB

Terjemahan artikel disiapkan pada malam dimulainya kursus "Database non-relasional".

14 hal yang saya harap saya ketahui sebelum memulai MongoDB

Highlights:

  • Sangatlah penting untuk mengembangkan skema meskipun itu opsional di MongoDB.
  • Demikian pula, indeks harus sesuai dengan skema dan pola akses Anda.
  • Hindari menggunakan objek besar dan array besar.
  • Berhati-hatilah dengan pengaturan MongoDB, terutama dalam hal keamanan dan keandalan.
  • MongoDB tidak memiliki pengoptimal kueri, jadi Anda harus berhati-hati saat melakukan operasi kueri.

Saya telah bekerja dengan database sejak lama, tetapi baru saja menemukan MongoDB. Ada beberapa hal yang saya harap saya ketahui sebelum saya mulai mengerjakannya. Ketika seseorang sudah memiliki pengalaman di bidang tertentu, mereka memiliki prasangka tentang apa itu database dan apa yang mereka lakukan. Dengan harapan dapat memudahkan orang lain untuk memahaminya, saya menyajikan daftar kesalahan umum.

Membuat server MongoDB tanpa otentikasi

Sayangnya, MongoDB diinstal tanpa otentikasi secara default. Untuk stasiun kerja yang diakses secara lokal, praktik ini normal. Namun karena MongoDB merupakan sistem multi-user yang suka menggunakan memori dalam jumlah besar, akan lebih baik jika Anda meletakkannya di server dengan RAM sebanyak mungkin, meskipun Anda hanya akan menggunakannya untuk pengembangan. Menginstal di server melalui port default dapat menimbulkan masalah, terutama jika ada kode javascript yang dapat dijalankan dalam permintaan (misalnya, $where sebagai ide untuk suntikan).

Ada beberapa metode autentikasi, namun yang paling mudah adalah dengan menetapkan ID pengguna/kata sandi. Gunakan ide ini saat Anda memikirkan tentang otentikasi mewah berdasarkan LDAP. Dalam hal keamanan, MongoDB harus terus diperbarui, dan log harus selalu diperiksa untuk akses tidak sah. Misalnya, saya ingin memilih port lain sebagai port default.

Jangan lupa untuk mengikat permukaan serangan Anda ke MongoDB

Daftar Periksa Keamanan MongoDB berisi tip bagus untuk mengurangi risiko intrusi jaringan dan kebocoran data. Sangat mudah untuk mengabaikannya dan mengatakan bahwa server pengembangan tidak memerlukan tingkat keamanan yang tinggi. Namun, tidak sesederhana itu dan ini berlaku untuk semua server MongoDB. Khususnya, jika tidak ada alasan kuat untuk menggunakannya mapReduce, group или $di mana, Anda perlu menonaktifkan penggunaan kode arbitrer di JavaScript dengan menulis di file konfigurasi javascriptEnabled:false. Karena file data tidak dienkripsi dalam MongoDB standar, masuk akal untuk menjalankan MongoDB Pengguna Khusus, yang memiliki akses penuh ke file, dengan akses terbatas hanya pada file tersebut dan kemampuan untuk menggunakan kontrol akses file milik sistem operasi.

Kesalahan saat mengembangkan sirkuit

MongoDB tidak menggunakan skema. Namun bukan berarti skema tersebut tidak diperlukan. Jika Anda hanya ingin menyimpan dokumen tanpa pola yang konsisten, menyimpannya bisa cepat dan mudah, namun mengambilnya nanti bisa jadi sulit. sangat sulit.

Artikel klasik "6 Aturan Praktis untuk Desain Skema MongoDB" Ini layak untuk dibaca, dan fitur-fiturnya seperti Penjelajah Skema di alat pihak ketiga Studio 3T, ada baiknya digunakan untuk pemeriksaan sirkuit rutin.

Jangan lupa urutannya

Melupakan urutan pengurutan dapat menyebabkan lebih banyak frustrasi dan membuang lebih banyak waktu dibandingkan konfigurasi salah lainnya. Secara default MongoBD menggunakan pengurutan biner. Tapi sepertinya itu tidak akan berguna bagi siapa pun. Jenis biner yang peka huruf besar-kecil, peka aksen, dianggap sebagai anakronisme yang aneh bersama dengan manik-manik, kaftan, dan kumis keriting di tahun 80-an abad yang lalu. Sekarang penggunaannya tidak bisa dimaafkan. Dalam kehidupan nyata, "sepeda motor" sama dengan "Sepeda Motor". Dan “Inggris” dan “Inggris” adalah tempat yang sama. Huruf kecil hanyalah huruf besar yang setara dengan huruf kapital. Dan jangan biarkan saya mulai menyortir diakritik. Saat membuat database di MongoDB, gunakan pemeriksaan yang tidak sensitif terhadap aksen dan daftar, yang sesuai dengan bahasa dan budaya pengguna sistem. Ini akan membuat pencarian melalui data string menjadi lebih mudah.

Buat koleksi dengan dokumen besar

MongoDB dengan senang hati menghosting dokumen besar hingga 16MB dalam koleksi, dan GridFS Dirancang untuk dokumen besar lebih besar dari 16 MB. Namun hanya karena dokumen berukuran besar dapat ditempatkan di sana, menyimpannya di sana bukanlah ide yang baik. MongoDB akan bekerja paling baik jika Anda menyimpan dokumen individual berukuran beberapa kilobyte, memperlakukannya lebih seperti baris dalam tabel SQL yang lebar. Dokumen berukuran besar akan menjadi sumber masalah produktifitas.

Membuat dokumen dengan array besar

Dokumen dapat berisi array. Yang terbaik adalah jika jumlah elemen dalam array jauh dari angka empat digit. Jika elemen sering ditambahkan ke dalam array, maka jumlah dokumen yang memuat elemen tersebut akan bertambah besar dan hal ini perlu dilakukan bergerak, yang berarti itu akan diperlukan perbarui indeks juga. Saat mengindeks ulang dokumen dengan array besar, indeks akan sering ditimpa, karena ada a catatan, yang menyimpan indeksnya. Pengindeksan ulang ini juga terjadi ketika dokumen disisipkan atau dihapus.

MongoDB memiliki sesuatu yang disebut "faktor pengisi", yang memberikan ruang bagi dokumen untuk berkembang guna meminimalkan masalah ini.
Anda mungkin berpikir bahwa Anda dapat melakukannya tanpa pengindeksan array. Sayangnya, kurangnya indeks dapat menyebabkan Anda mengalami masalah lain. Karena dokumen dipindai dari awal hingga akhir, pencarian elemen di akhir larik akan memakan waktu lebih lama, dan sebagian besar operasi yang terkait dengan dokumen tersebut akan memakan waktu lebih lama. lambat.

Jangan lupa bahwa urutan tahapan dalam suatu agregasi itu penting

Dalam sistem database dengan pengoptimal kueri, kueri yang Anda tulis adalah penjelasan tentang apa yang ingin Anda dapatkan, bukan bagaimana cara mendapatkannya. Mekanisme kerja ini mirip dengan pemesanan di restoran: biasanya Anda hanya memesan hidangan, dan tidak memberikan instruksi rinci kepada juru masak.

Di MongoDB, Anda menginstruksikan juru masak. Misalnya, Anda perlu memastikan bahwa datanya lolos reduce sedini mungkin dalam penggunaan pipa $match и $project, dan penyortiran hanya terjadi setelahnya reduce, dan pencarian dilakukan sesuai urutan yang Anda inginkan. Memiliki pengoptimal kueri yang menghilangkan pekerjaan yang tidak perlu, mengurutkan langkah secara optimal, dan memilih jenis gabungan dapat memanjakan Anda. Dengan MongoDB, Anda memiliki kendali lebih besar dengan mengorbankan kenyamanan.

Alat seperti Studio 3T akan menyederhanakan konstruksi kueri agregasi di MongoDB. Fitur Editor Agregasi memungkinkan Anda menerapkan pernyataan alur satu per satu, dan memeriksa data masukan dan keluaran pada setiap tahap untuk menyederhanakan proses debug.

Menggunakan Perekaman Cepat

Jangan pernah menyetel opsi penulisan MongoDB agar memiliki kecepatan tinggi tetapi keandalannya rendah. Modus ini "file-dan-lupakan" tampaknya cepat karena perintah dikembalikan sebelum penulisan terjadi. Jika sistem crash sebelum data ditulis ke disk, maka data tersebut akan hilang dan berakhir dalam keadaan tidak konsisten. Untungnya, MongoDB 64-bit telah mengaktifkan logging.

Mesin penyimpanan MMAPv1 dan WiredTiger menggunakan logging untuk mencegah hal ini, meskipun WiredTiger dapat memulihkan ke kondisi terakhir yang konsisten. titik kontrol, jika pencatatan dinonaktifkan.

Penjurnalan memastikan bahwa database berada dalam keadaan konsisten setelah pemulihan dan menyimpan semua data hingga ditulis ke jurnal. Frekuensi perekaman dikonfigurasi menggunakan parameter commitIntervalMs.

Untuk memastikan entri, pastikan logging diaktifkan di file konfigurasi (storage.journal.enabled), dan frekuensi perekaman sesuai dengan jumlah informasi yang dapat Anda hilangkan.

Menyortir tanpa indeks

Saat mencari dan menggabungkan, sering kali ada kebutuhan untuk mengurutkan data. Semoga hal ini dilakukan pada salah satu tahap akhir, setelah memfilter hasilnya untuk mengurangi jumlah data yang diurutkan. Dan bahkan dalam hal ini, untuk penyortiran Anda memerlukannya indeks. Anda dapat menggunakan indeks tunggal atau gabungan.

Jika tidak ada indeks yang sesuai, MongoDB akan melakukannya tanpa indeks tersebut. Ada batasan memori sebesar 32 MB pada ukuran total semua dokumen di dalamnya operasi penyortiran, dan jika MongoDB mencapai batas ini, maka MongoDB akan menimbulkan kesalahan atau kembali kumpulan rekaman kosong.

Cari tanpa dukungan indeks

Kueri pencarian menjalankan fungsi yang mirip dengan operasi GABUNG di SQL. Agar berfungsi dengan baik, mereka memerlukan indeks nilai kunci yang digunakan sebagai kunci asing. Hal ini tidak jelas karena penggunaannya tidak tercermin explain(). Indeks tersebut merupakan tambahan dari indeks yang tertulis di dalamnya explain(), yang pada gilirannya digunakan oleh operator saluran pipa $match и $sort, ketika mereka bertemu di awal pipa. Indeks sekarang dapat mencakup tahapan apa pun pipa agregasi.

Memilih untuk tidak menggunakan multi-pembaruan

metode db.collection.update() digunakan untuk mengubah sebagian dokumen yang sudah ada atau keseluruhan dokumen, hingga penggantian seluruhnya, tergantung parameter yang Anda tentukan update. Yang tidak begitu jelas adalah ia tidak akan memproses semua dokumen dalam koleksi kecuali Anda menyetel opsinya multi untuk memperbarui semua dokumen yang memenuhi kriteria permintaan.

Jangan lupa pentingnya urutan kunci dalam tabel hash

Di JSON, sebuah objek terdiri dari kumpulan tak berurutan dengan ukuran nol atau lebih pasangan nama/nilai, di mana nama adalah string dan nilai adalah string, angka, boolean, null, objek, atau array.

Sayangnya, BSON sangat mengutamakan keteraturan saat melakukan pencarian. Di MongoDB, urutan kunci dalam objek bawaan hal, yaitu { firstname: "Phil", surname: "factor" } - ini tidak sama dengan { { surname: "factor", firstname: "Phil" }. Artinya, Anda harus menyimpan urutan pasangan nama/nilai dalam dokumen Anda jika ingin yakin menemukannya.

Jangan bingung "Batal" и "belum diartikan"

Nilai "belum diartikan" tidak pernah valid di JSON, menurut standar resmi JSON (ECMA-404 Bagian 5), meskipun digunakan dalam JavaScript. Apalagi untuk BSON sudah usang dan diubah menjadi $null, yang tidak selalu merupakan solusi yang baik. Hindari pemakaian "belum diartikan" di MongoDB.

Menggunakan $limit() tanpa $sort()

Seringkali ketika Anda mengembangkan di MongoDB, ada gunanya melihat contoh hasil yang akan dikembalikan dari kueri atau agregasi. Untuk tugas ini Anda perlu $limit(), tetapi kode tersebut tidak boleh ada dalam kode akhir kecuali Anda menggunakannya sebelumnya $sort. Mekanik ini diperlukan karena jika tidak, Anda tidak dapat menjamin urutan hasilnya, dan Anda tidak akan dapat melihat data dengan andal. Di bagian atas hasil, Anda akan mendapatkan entri berbeda tergantung pada penyortirannya. Agar dapat bekerja dengan andal, kueri dan agregasi harus bersifat deterministik, yaitu memberikan hasil yang sama setiap kali dijalankan. Kode yang berisi $limit(), tapi tidak $sort, tidak akan bersifat deterministik dan selanjutnya dapat menyebabkan kesalahan yang sulit dilacak.

Kesimpulan

Satu-satunya cara untuk kecewa dengan MongoDB adalah dengan membandingkannya secara langsung dengan jenis database lain, seperti DBMS, atau menggunakannya berdasarkan ekspektasi tertentu. Ini seperti membandingkan jeruk dengan garpu. Sistem basis data melayani tujuan tertentu. Yang terbaik adalah memahami dan menghargai sendiri perbedaan-perbedaan ini. Akan sangat disayangkan jika menekan pengembang MongoDB melalui jalur yang memaksa mereka menempuh jalur DBMS. Saya ingin melihat cara-cara baru dan menarik untuk memecahkan masalah lama, seperti memastikan integritas data dan menciptakan sistem data yang tahan terhadap kegagalan dan serangan berbahaya.

Pengenalan transaksionalitas ACID MongoDB di versi 4.0 adalah contoh yang baik dalam memperkenalkan perbaikan penting dengan cara yang inovatif. Transaksi multi-dokumen dan multi-pernyataan kini bersifat atomik. Dimungkinkan juga untuk menyesuaikan waktu yang diperlukan untuk memperoleh kunci dan menghentikan transaksi yang macet, serta mengubah tingkat isolasi.

14 hal yang saya harap saya ketahui sebelum memulai MongoDB

Baca selengkapnya:

Sumber: www.habr.com

Tambah komentar