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:
- Buat cadangan zip dari data yang ada
- 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 denganoplogs
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,
- Jalankan migrasi massal awal dengan
oplogs
tangkap - Jalankan tugas sinkronisasi untuk mengurangi latensi sakelar koneksi database
Sekarang, untuk menangkap
oplogs
, kumpulan replika harus diinisialisasi dalam database sumber dan tujuan. Ini karenaoplogs
diambil darilocal.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.