MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara Migrasi Data Di MongoDB

Tujuan dari posting ini adalah untuk mempelajari tentang berbagai cara migrasi data di MongoDB yang dapat membantu kami menulis skrip yang mengubah database Anda dengan menambahkan dokumen baru, memodifikasi yang sudah ada.

Jika Anda datang ke sini untuk pertama kalinya, silakan lihat prekuel MongoDB yang Dihosting Sendiri.

Baiklah kalau begitu, memilih dari bagian terakhir yang kita tinggalkan, mari kita mulai dengan migrasi data di MongoDB.

Sekarang, langkah dasar untuk memigrasikan data dari satu MongoDB ke MongoDB lainnya adalah:

  1. Buat cadangan zip dari data yang ada
  2. Buang data di DB baru

Ini sangat mudah ketika database sumber tidak online karena kita tahu bahwa tidak akan ada dokumen baru yang dibuat/diperbarui selama proses migrasi. Mari kita lihat migrasi sederhana terlebih dahulu sebelum masuk ke skenario langsung.

Migrating dari database offline di MongoDB

Membuat cadangan

Kami akan menggunakan program utilitas mongodump yang ada untuk membuat cadangan basis data.

Jalankan perintah ini di server database sumber

mongodump --host="hostname:port" \
  --username="username" --password="password" \
  --authenticationDatabase "admin" \
  --db="db name" --collection="collection name" --query='json' \
  --forceTableScan -v --gzip --out ./dump

--host :Nama host MongoDB sumber beserta portnya. Defaultnya adalah localhost:27017 . Jika ini adalah string koneksi, Anda dapat menggunakan opsi ini —-uri="mongodb://username:password@host1[:port1]..."

--username :Menentukan nama pengguna untuk diautentikasi ke database MongoDB yang menggunakan otentikasi.

--password :Menentukan kata sandi untuk mengautentikasi ke database MongoDB yang menggunakan autentikasi.

--authenticationDatabase :Menentukan database otentikasi tempat --username yang ditentukan telah dibuat.

Jika Anda tidak menentukan database autentikasi atau database untuk diekspor, mongodump menganggap database admin memegang kredensial pengguna.

--db :Menentukan database untuk mengambil cadangan. Jika Anda tidak menentukan database, mongodump mengumpulkan dari semua database dalam contoh ini.

Atau, Anda juga dapat menentukan database secara langsung di string koneksi URI yaitu mongodb://username:password@uri/dbname .
Menyediakan string koneksi sambil juga menggunakan --db dan menetapkan informasi yang bertentangan akan mengakibatkan kesalahan .

--collection :Menentukan koleksi untuk dicadangkan. Jika Anda tidak menentukan koleksi, opsi ini menyalin semua koleksi dalam database atau instance yang ditentukan ke file dump.

--query :Menyediakan dokumen JSON sebagai kueri yang secara opsional membatasi dokumen yang disertakan dalam output mongodump.
Anda harus menyertakan dokumen kueri dalam tanda kutip tunggal ('{ ... }') untuk memastikan bahwa itu tidak berinteraksi dengan lingkungan Anda.
Kueri harus dalam format Extended JSON v2 (baik mode santai atau kanonik/ketat), termasuk menyertakan nama bidang dan operator dalam tanda kutip mis. '{ "created_at": { "\$gte": ISODate(...) } }' .

Untuk menggunakan --query pilihan, Anda juga harus menentukan --collection pilihan.

--forceTableScan :Memaksa mongodump untuk memindai penyimpanan data secara langsung. Biasanya, mongodump menyimpan entri seperti yang muncul di indeks _id bidang.

Jika Anda menentukan kueri --query , mongodump akan menggunakan indeks yang paling tepat untuk mendukung kueri itu.
Oleh karena itu, Anda tidak dapat menggunakan --forceTableScan dengan --query pilihan .

--gzip :Mengompresi keluaran. Jika mongodump keluar ke direktori dump, fitur baru mengompresi file individual. File memiliki akhiran .gz .

--out :Menentukan direktori tempat mongodump akan menulis BSON file untuk database yang dibuang. Secara default, mongodump menyimpan file keluaran dalam direktori bernama dump di direktori kerja saat ini.

Memulihkan cadangan

Kami akan menggunakan program utilitas bernama mongorestore untuk memulihkan cadangan basis data.

Salin dump direktori cadangan ke instance Database baru dan jalankan perintah berikut:

mongorestore --uri="mongodb://user:password@host:port/?authSource=admin" \
  --drop --noIndexRestore --gzip -v ./dump

Ganti kredensial dengan kredensial database baru. Hapus garis pada langkah sebelumnya, --authenticationDatabase opsi ditentukan dalam string URI.

Juga, gunakan --gzip jika digunakan saat membuat cadangan.

--drop :Sebelum memulihkan koleksi dari cadangan yang dibuang, hapus koleksi dari database target. Itu tidak menjatuhkan koleksi yang tidak ada dalam cadangan.--noIndexRestore :Mencegah mongorestore memulihkan dan membangun indeks seperti yang ditentukan dalam output mongodump yang sesuai.

Jika Anda ingin mengubah nama database saat memulihkan, Anda dapat melakukannya menggunakan
--nsFrom="old_name.*" --nsTo="new_name.*" opsi.

Namun, ini tidak akan berfungsi jika Anda bermigrasi dengan oplogs yang merupakan persyaratan dalam migrasi dari instans online.

Migrating dari database online di MongoDB

Satu-satunya tantangan dengan migrasi dari database online adalah tidak dapat menjeda pembaruan selama migrasi. Jadi di sini adalah ikhtisar langkah-langkahnya,

  1. Jalankan migrasi massal awal dengan oplogs tangkap
  2. Jalankan tugas sinkronisasi untuk mengurangi latensi sakelar koneksi database

Sekarang, untuk menangkap oplogs , kumpulan replika harus diinisialisasi dalam database sumber dan tujuan. Ini karena oplogs diambil dari local.oplog.rs namespace, yang dibuat setelah menginisialisasi set replika.

Anda dapat mengikuti panduan ini untuk mengonfigurasi kumpulan replika.

Migrasi Awal dengan Oplog Capture

Oplog, dengan kata sederhana, adalah log operasi yang dibuat per operasi dalam database. Mereka mewakili status dokumen parsial atau, dengan kata lain, status basis data. Jadi, kami akan merekam pembaruan apa pun di basis data lama kami selama proses migrasi menggunakan oplogs ini .

Jalankan program mongodump dengan opsi berikut,

mongodump --uri=".../?authSource=admin" \
  --forceTableScan --oplog \
  --gzip -v --out ./dump

--oplog :Membuat file bernama oplog.bson sebagai bagian dari mongodump keluaran. oplog.bson file, terletak di tingkat atas direktori keluaran, berisi oplog entri yang terjadi selama operasi mongodump. File ini menyediakan snapshot point-in-time yang efektif dari status instance database kami.

Pulihkan data dengan oplog replay

Untuk memutar ulang oplog, diperlukan peran khusus. Mari buat dan tetapkan peran ke pengguna database yang digunakan untuk migrasi.

Buat peran

db.createRole({
  role: "interalUseOnlyOplogRestore",
  privileges: [
    {
      resource: { anyResource: true },
      actions: [ "anyAction" ] 
    }
  ],
  roles: []
})

Tetapkan peran

db.grantRolesToUser(
  "admin",
  [{ role:"interalUseOnlyOplogRestore", db:"admin" }]
);

Sekarang Anda dapat memulihkan menggunakan program mongorestore dengan opsi berikut,

mongorestore --uri="mongodb://admin:.../?authSource=admin" \
  --oplogReplay 
  --gzip -v ./dump

Pada perintah di atas, menggunakan pengguna yang sama admin dengan siapa peran itu dikaitkan.

--oplogReplay :Setelah memulihkan dump basis data, memutar ulang entri oplog dari file bson dan memulihkan basis data ke cadangan waktu yang diambil dengan mongodump --oplog perintah.

Mengurangi latensi sakelar koneksi database

Baiklah, sejauh ini kita sudah selesai dengan sebagian besar pekerjaan berat. Satu-satunya hal yang tersisa adalah menjaga konsistensi antara database selama sakelar koneksi di server aplikasi kami.

Jika Anda menjalankan MongoDB versi 3.6+, lebih baik menggunakan pendekatan Change Stream, yang merupakan mekanisme berbasis peristiwa yang diperkenalkan untuk menangkap perubahan dalam database Anda dengan cara yang dioptimalkan. Berikut adalah artikel yang membahasnya https://www.mongodb.com/blog/post/an-introduction-to-change-streams

Lihat skrip sinkronisasi umum, yang dapat Anda jalankan sebagai tugas CRON setiap menit.

Perbarui variabel dalam skrip ini dan jalankan sebagai

$ ./delta-sync.sh from_epoch_in_milliseconds

# from_epoch_in_milliseconds is automatically picked with every iteration if not supplied

Atau Anda dapat mengatur tugas cron untuk menjalankannya setiap menit.

* * * * * ~/delta-sync.sh

Output dapat dipantau dengan perintah berikut (Saya menjalankan RHEL 8, lihat panduan OS Anda untuk output cron)

$ tail -f /var/log/cron | grep CRON

Ini adalah contoh log sinkronisasi.

CMD (~/cron/dsync.sh)
CMDOUT (INFO: Updated log registry to use new timestamp on next run.)
CMDOUT (INFO: Created sync directory: /home/ec2-user/cron/dump/2020-11-03T19:01:01Z)
CMDOUT (Fetching oplog in range [2020-11-03T19:00:01Z - 2020-11-03T19:01:01Z])
CMDOUT (2020-11-03T19:01:02.319+0000#011dumping up to 1 collections in parallel)
CMDOUT (2020-11-03T19:01:02.334+0000#011writing local.oplog.rs to /home/ec2-user/cron/dump/2020-11-03T19:01:01Z/local/oplog.rs.bson.gz)
CMDOUT (2020-11-03T19:01:04.943+0000#011local.oplog.rs  0)
CMDOUT (2020-11-03T19:01:04.964+0000#011local.oplog.rs  0)
CMDOUT (2020-11-03T19:01:04.964+0000#011done dumping local.oplog.rs (0 documents))
CMDOUT (INFO: Dump success!)
CMDOUT (INFO: Replaying oplogs...)
CMDOUT (2020-11-03T19:01:05.030+0000#011using write concern: &{majority false 0})
CMDOUT (2020-11-03T19:01:05.054+0000#011will listen for SIGTERM, SIGINT, and SIGKILL)
CMDOUT (2020-11-03T19:01:05.055+0000#011connected to node type: standalone)
CMDOUT (2020-11-03T19:01:05.055+0000#011mongorestore target is a directory, not a file)
CMDOUT (2020-11-03T19:01:05.055+0000#011preparing collections to restore from)
CMDOUT (2020-11-03T19:01:05.055+0000#011found collection local.oplog.rs bson to restore to local.oplog.rs)
CMDOUT (2020-11-03T19:01:05.055+0000#011found collection metadata from local.oplog.rs to restore to local.oplog.rs)
CMDOUT (2020-11-03T19:01:05.055+0000#011restoring up to 4 collections in parallel)
CMDOUT (2020-11-03T19:01:05.055+0000#011replaying oplog)
CMDOUT (2020-11-03T19:01:05.055+0000#011applied 0 oplog entries)
CMDOUT (2020-11-03T19:01:05.055+0000#0110 document(s) restored successfully. 0 document(s) failed to restore.)
CMDOUT (INFO: Restore success!)

Anda dapat menghentikan skrip ini setelah memverifikasi bahwa tidak ada lagi oplogs sedang dibuat, yaitu saat DB sumber offline.

Ini mengakhiri panduan lengkap migrasi data MongoDB yang di-hosting-sendiri. Jika Anda ingin mempelajari lebih lanjut tentang MongoDB, berikut adalah sumber yang berguna tentang cara menggunakan MongoDB sebagai sumber data di goLang.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Buat bidang peningkatan otomatis yang unik dengan luwak

  2. atom MongoDB findOrCreate:findOne, masukkan jika tidak ada, tetapi jangan perbarui

  3. Hitung rata-rata bidang dalam dokumen/array yang disematkan

  4. Adakah alasan terperinci dan spesifik untuk Mengapa MongoDB jauh lebih cepat daripada SQL DB?

  5. Bagaimana cara mencetak lebih dari 20 item (dokumen) di shell MongoDB?