MongoShake adalah alat open-source yang dikembangkan oleh Alibaba Cloud untuk menyinkronkan data antar database MongoDB dalam berbagai skenario, seperti analitik data, disaster recovery, dan replikasi aktif-aktif. Topik ini menjelaskan cara mengonfigurasi sinkronisasi real-time antar instans ApsaraDB for MongoDB.
MongoShake
MongoShake adalah alat umum yang dikembangkan oleh Alibaba Cloud menggunakan Go. Alat ini mereplikasi data dari MongoDB dengan membaca operation log (oplog) dan memainkannya ulang (replay) pada instans tujuan.
MongoShake juga menyediakan fitur subscription dan konsumsi data. Alat ini terintegrasi dengan SDK, Kafka, dan MetaQ untuk mendukung skenario seperti subscription log, sinkronisasi antarpusat data, dan penghapusan cache secara asinkron.
Untuk informasi lebih lanjut, lihat repositori GitHub MongoShake.
Sumber data yang didukung
Source | Destination |
Database MongoDB yang dikelola sendiri pada instance ECS | Database MongoDB yang dikelola sendiri pada instance ECS |
Database MongoDB yang dikelola sendiri di lingkungan on-premises | Database MongoDB yang dikelola sendiri di lingkungan on-premises |
Instans ApsaraDB for MongoDB | Instans ApsaraDB for MongoDB |
Database MongoDB cloud pihak ketiga | Database MongoDB cloud pihak ketiga |
Catatan
Jangan lakukan operasi DDL apa pun pada database sumber sebelum sinkronisasi penuh selesai. Jika tidak, ketidakkonsistenan data dapat terjadi.
Sinkronisasi database lokal tidak didukung. Untuk menyinkronkan data dari database admin, lihat Migrasikan data bisnis dari database admin ke database non-admin.
Izin yang diperlukan
Source | Izin yang diperlukan |
Instans MongoDB sumber | Izin Catatan Database |
Instans MongoDB tujuan | Izin |
Untuk informasi tentang cara membuat dan memberikan otorisasi kepada pengguna database MongoDB, lihat Gunakan DMS untuk mengelola pengguna database MongoDB atau perintah db.createUser.
Prasyarat
Untuk kinerja sinkronisasi optimal, pastikan instans replica set MongoDB sumber menggunakan VPC. Jika menggunakan jaringan klasik, ubah jenis jaringannya menjadi VPC. Untuk informasi lebih lanjut, lihat Ubah jenis jaringan instans dari jaringan klasik ke VPC.
Buat instans replica set MongoDB tujuan. Untuk meminimalkan latensi jaringan, buat instans tujuan dalam VPC yang sama dengan instans sumber. Untuk informasi lebih lanjut, lihat Buat instans replica set.
Buat instance ECS untuk menjalankan MongoShake. Untuk meminimalkan latensi jaringan, buat instance ECS dalam VPC yang sama dengan instans sumber. Untuk informasi lebih lanjut, lihat Buat instance ECS.
Tambahkan alamat IP pribadi instance ECS ke daftar putih kedua instans MongoDB (sumber dan tujuan), dan verifikasi bahwa instance ECS dapat terhubung ke kedua instans tersebut. Untuk informasi lebih lanjut, lihat Ubah daftar putih.
Jika konfigurasi jaringan Anda tidak memenuhi persyaratan di atas, Anda dapat mengajukan titik akhir publik untuk kedua instans MongoDB (sumber dan tujuan). Kemudian, tambahkan alamat IP publik instance ECS ke daftar putih kedua instans MongoDB tersebut untuk melakukan sinkronisasi melalui titik akhir publik. Untuk informasi lebih lanjut, lihat Ajukan titik akhir publik dan Ubah daftar putih.
Prosedur
Prosedur ini mengasumsikan bahwa MongoShake diinstal di direktori /test/mongoshake.
Login ke instance ECS.
CatatanAnda dapat memilih metode login sesuai skenario Anda. Untuk informasi lebih lanjut, lihat Ikhtisar metode login untuk server ECS.
Jalankan perintah berikut untuk mengunduh program MongoShake dan mengganti namanya menjadi
mongoshake.tar.gz.wget "https://github.com/alibaba/MongoShake/releases/download/release-v2.8.7-20251218/mongo-shake-v2.8.7.tgz" -O mongoshake.tar.gzCatatanPerintah ini mengunduh MongoShake versi 2.8.7. Untuk mengunduh versi terbaru, lihat halaman rilis.
Jalankan perintah berikut untuk mengekstrak paket MongoShake ke direktori /test/mongoshake.
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshakeJalankan perintah
vi collector.confuntuk mengubah file konfigurasi MongoShake collector.conf. Tabel berikut menjelaskan parameter utama.Parameter
Deskripsi
Contoh
mongo_urls
URI string koneksi instans MongoDB sumber. Pada contoh ini, akun database adalah test, yang berada di database admin.
CatatanKami menyarankan menggunakan titik akhir VPC untuk meminimalkan latensi jaringan.
Untuk detail format URI string koneksi, lihat Deskripsi koneksi untuk instans replica set.
mongo_urls = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717CatatanPassword tidak boleh mengandung tanda at (
@). Jika tidak, koneksi akan gagal.tunnel.address
URI string koneksi instans MongoDB tujuan. Pada contoh ini, akun database adalah test, yang berada di database admin.
CatatanKami menyarankan menggunakan titik akhir VPC untuk meminimalkan latensi jaringan.
Untuk detail format URI string koneksi, lihat Deskripsi koneksi untuk instans replica set.
tunnel.address = mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717CatatanPassword tidak boleh mengandung tanda at (
@). Jika tidak, koneksi akan gagal.sync_mode
Mode sinkronisasi data. Nilai yang valid:
all: melakukan sinkronisasi penuh dan sinkronisasi inkremental.
full: hanya melakukan sinkronisasi penuh.
incr: hanya melakukan sinkronisasi inkremental.
CatatanNilai default adalah
incr.sync_mode = allCatatanUntuk daftar lengkap parameter dalam collector.conf, lihat bagian "parameter collector.conf" di Lampiran.
Jalankan perintah berikut untuk memulai tugas sinkronisasi dan mencetak log.
./collector.linux -conf=collector.conf -verboseAmati output log. Ketika muncul entri yang mirip dengan berikut, itu menandakan bahwa sinkronisasi penuh telah selesai dan sinkronisasi inkremental telah dimulai.
[09:38:57 CST 2019/06/20] [INFO] (mongoshake/collector.(*ReplicationCoordinator).Run:80) finish full sync, start incr sync with timestamp: fullBeginTs[1560994443], fullFinishTs[1560994737]
Status pemantauan
Setelah sinkronisasi inkremental dimulai, buka jendela terminal baru dan jalankan perintah berikut:
cd /test/mongoshake && ./mongoshake-stat --port=9100mongoshake-stat adalah skrip Python dan memerlukan Python 2.7 untuk diinstal. Untuk informasi lebih lanjut, lihat situs web resmi Python.
Contoh output:
./mongoshake-stat --port=9100
logs_get/sec | logs_repl/sec | logs_success/sec | lsn.time | lsn_ack.time | lsn_ckpt.time | now.time | replset
none | none | none | 2019-06-20 10:34:14 | 2019-06-20 10:34:13 | 2019-06-20 10:33:36 | 2019-06-20 10:34:14 | mgset-10
545 | 768 | 768 | 2019-06-20 10:34:15 | 2019-06-20 10:34:15 | 2019-06-20 10:34:14 | 2019-06-20 10:34:15 | mgset-10
541 | 511 | 511 | 2019-06-20 10:34:15 | 2019-06-20 10:34:15 | 2019-06-20 10:34:14 | 2019-06-20 10:34:16 | mgset-10
639 | 512 | 512 | 2019-06-20 10:34:16 | 2019-06-20 10:34:16 | 2019-06-20 10:34:14 | 2019-06-20 10:34:17 | mgset-10
543 | 512 | 512 | 2019-06-20 10:34:17 | 2019-06-20 10:34:17 | 2019-06-20 10:34:14 | 2019-06-20 10:34:18 | mgset-10
546 | 768 | 768 | 2019-06-20 10:34:19 | 2019-06-20 10:34:19 | 2019-06-20 10:34:14 | 2019-06-20 10:34:19 | mgset-10
538 | 512 | 512 | 2019-06-20 10:34:20 | 2019-06-20 10:34:20 | 2019-06-20 10:34:19 | 2019-06-20 10:34:20 | mgset-10
550 | 511 | 511 | 2019-06-20 10:34:21 | 2019-06-20 10:34:21 | 2019-06-20 10:34:19 | 2019-06-20 10:34:21 | mgset-10
546 | 512 | 512 | 2019-06-20 10:34:22 | 2019-06-20 10:34:22 | 2019-06-20 10:34:19 | 2019-06-20 10:34:22 | mgset-10
531 | 512 | 512 | 2019-06-20 10:34:23 | 2019-06-20 10:34:23 | 2019-06-20 10:34:19 | 2019-06-20 10:34:23 | mgset-10
547 | 512 | 512 | 2019-06-20 10:34:24 | 2019-06-20 10:34:24 | 2019-06-20 10:34:19 | 2019-06-20 10:34:24 | mgset-10
541 | 512 | 512 | 2019-06-20 10:34:24 | 2019-06-20 10:34:24 | 2019-06-20 10:34:19 | 2019-06-20 10:34:25 | mgset-10Deskripsi parameter:
Parameter | Deskripsi |
logs_get/sec | Jumlah oplog yang diambil per detik. |
logs_repl/sec | Jumlah operasi replay oplog yang dilakukan per detik. |
logs_success/sec | Jumlah operasi replay oplog yang berhasil per detik. |
lsn.time | Timestamp oplog terakhir yang dikirim. |
lsn_ack.time | Timestamp saat operasi tulis dikonfirmasi oleh instans tujuan. |
lsn_ckpt.time | Timestamp saat checkpoint dipersistensikan. |
now.time | Waktu saat ini. |
replset | Nama replica set database sumber. |
Migrasikan data dari database admin
MongoDB tidak merekomendasikan secara resmi menyimpan data bisnis di database admin karena perilaku locking dan konflik dengan perintah internal dapat menurunkan kinerja instans.
MongoShake mendukung sinkronisasi data bisnis dari database admin ke database non-admin.
Untuk melakukannya, ikuti Prosedur. Pada Langkah 4, saat Anda mengubah file collector.conf, tambahkan item konfigurasi berikut:
filter.pass.special.db = admin
# Migrasikan semua koleksi bisnis dari database admin ke newDB.
transform.namespace = admin:newDB
# Atau, migrasikan koleksi abc di database admin ke koleksi def di database target. Anda dapat mengonfigurasi beberapa aturan.
transform.namespace = admin.abc:target.defLampiran
Tabel 1. parameter collector.conf
Kategori | Parameter | Deskripsi | Contoh |
N/A | conf.version | Versi file konfigurasi. Jangan ubah nilai ini. |
|
Opsi global | id | ID tugas sinkronisasi. Anda dapat menyesuaikan nilai ini. ID ini digunakan untuk nama file log, nama database penyimpanan informasi checkpoint, dan nama database pada instans tujuan. |
|
master_quorum | Opsi ketersediaan tinggi. Saat node primary dan standby MongoShake menyinkronkan data dari sumber yang sama, atur parameter ini ke Nilai yang valid:
Catatan Nilai default adalah false. |
| |
full_sync.http_port | Port HTTP untuk melihat status sinkronisasi penuh. Catatan Nilai default adalah 9101. |
| |
incr_sync.http_port | Port HTTP untuk melihat status sinkronisasi inkremental. Catatan Nilai default adalah 9100. |
| |
system_profile_port | Port profiling yang digunakan untuk melihat informasi stack internal. |
| |
log.level | Tingkat log. Nilai yang valid:
Nilai default: info. |
| |
log.dir | Direktori untuk file log dan file PID. Jika parameter ini tidak diatur, direktori logs di path saat ini digunakan secara default. Catatan Anda harus menentukan jalur mutlak untuk parameter ini. |
| |
log.file | Nama file log. Anda dapat menyesuaikan nilai ini. Catatan Nilai default adalah collector.log. |
| |
log.flush | Frekuensi penyegaran log di layar. Nilai yang valid:
Catatan Nilai default adalah false. |
| |
sync_mode | Mode sinkronisasi data. Nilai yang valid:
Catatan Nilai default adalah incr. |
| |
mongo_urls | URI string koneksi instans MongoDB sumber. Pada contoh ini, akun database adalah test, yang berada di database admin. Catatan
|
| |
mongo_cs_url | Jika sumbernya adalah instans kluster sharded, Anda harus menentukan URI string koneksi node ConfigServer (CS). Untuk informasi cara mendapatkan URI string koneksi node ConfigServer, lihat Ajukan titik akhir untuk shard. Pada contoh ini, akun database adalah test, yang berada di database admin. |
| |
mongo_s_url | Jika sumbernya adalah instans kluster sharded, Anda harus menentukan URI string koneksi minimal satu node mongos. Pisahkan beberapa alamat mongos dengan koma (,). Untuk informasi cara mendapatkan URI string koneksi node mongos, lihat Ajukan titik akhir untuk shard. Pada contoh ini, akun database adalah test, yang berada di database admin. |
| |
tunnel | Jenis channel sinkronisasi. Nilai yang valid:
Catatan Nilai default adalah direct. |
| |
tunnel.address | Alamat tujuan. Format alamat yang didukung bervariasi berdasarkan jenis tunnel:
Pada contoh ini, akun database adalah test, yang berada di database admin. |
| |
tunnel.message | Tipe data dalam channel. Parameter ini hanya berlaku jika
Catatan Nilai default adalah raw. |
| |
mongo_connect_mode | Mode koneksi instans MongoDB. Parameter ini hanya berlaku jika
Catatan Nilai default adalah secondaryPreferred. |
| |
filter.namespace.black | Menentukan daftar hitam untuk sinkronisasi data. Namespace yang ditentukan tidak disinkronkan ke database tujuan. Pisahkan beberapa namespace dengan titik koma (;). Catatan Namespace adalah nama kanonis koleksi atau indeks di MongoDB. Ini merupakan kombinasi nama database dan nama koleksi atau indeks, seperti |
| |
filter.namespace.white | Menentukan daftar putih untuk sinkronisasi data. Hanya namespace yang ditentukan yang disinkronkan ke database tujuan. Pisahkan beberapa namespace dengan titik koma (;). |
| |
filter.pass.special.db | Mengaktifkan sinkronisasi database khusus. Secara default, database seperti |
| |
filter.ddl_enable | Menentukan apakah sinkronisasi DDL diaktifkan. Nilai yang valid:
Catatan Fitur ini tidak didukung jika sumbernya adalah instans kluster sharded. |
| |
checkpoint.storage.url | Alamat penyimpanan untuk checkpoint, yang digunakan untuk mendukung sinkronisasi yang dapat dilanjutkan. Jika parameter ini tidak dikonfigurasi, program menulis checkpoint ke salah satu database berikut berdasarkan jenis instans:
Pada contoh ini, akun database adalah test, yang berada di database admin. |
| |
checkpoint.storage.db | Nama database untuk menyimpan checkpoint. Catatan Nilai default adalah mongoshake. |
| |
checkpoint.storage.collection | Nama koleksi untuk menyimpan checkpoint. Saat node primary dan standby MongoShake menyinkronkan data dari sumber yang sama, Anda dapat mengubah nama koleksi ini untuk mencegah konflik. Catatan Nilai default adalah ckpt_default. |
| |
checkpoint.start_position | Posisi awal untuk sinkronisasi. Parameter ini hanya digunakan jika tidak ditemukan checkpoint. Formatnya adalah Catatan Nilai default adalah 1970-01-01T00:00:00Z. |
| |
transform.namespace | Mengganti nama database atau koleksi sumber dan menyinkronkannya ke tujuan. Misalnya, Anda dapat mengganti nama |
| |
Opsi sinkronisasi penuh | full_sync.reader.collection_parallel | Jumlah maksimum koleksi yang dapat ditarik MongoShake secara konkuren dalam satu waktu. |
|
full_sync.reader.write_document_parallel | Jumlah thread penulisan konkuren per koleksi untuk MongoShake. |
| |
full_sync.reader.document_batch_size | Ukuran batch untuk menulis dokumen ke instans tujuan. Misalnya, nilai 128 menunjukkan bahwa 128 dokumen dikelompokkan sebelum ditulis. |
| |
full_sync.collection_exist_drop | Menentukan tindakan jika koleksi tujuan memiliki nama yang sama dengan koleksi sumber. Nilai yang valid:
|
| |
full_sync.create_index | Menentukan apakah akan membuat indeks setelah sinkronisasi selesai. Nilai yang valid:
|
| |
full_sync.executor.insert_on_dup_update | Menentukan apakah akan mengonversi pernyataan
|
| |
full_sync.executor.filter.orphan_document | Menentukan apakah akan memfilter dokumen yatim jika sumbernya adalah instans kluster sharded. Nilai yang valid:
|
| |
full_sync.executor.majority_enable | Menentukan apakah akan mengaktifkan majority write pada instans tujuan. Nilai yang valid:
|
| |
Opsi sinkronisasi inkremental | incr_sync.mongo_fetch_method | Metode untuk menarik data inkremental. Nilai yang valid:
Nilai default: oplog. |
|
incr_sync.oplog.gids | Digunakan untuk mengatur replikasi dua arah untuk kluster cloud. |
| |
incr_sync.shard_key | Metode konkurensi internal untuk MongoShake. Jangan ubah parameter ini. |
| |
incr_sync.worker | Jumlah thread konkuren untuk mengirimkan oplog. Anda dapat menambah nilai ini jika kinerja host mencukupi. Catatan Jika sumbernya adalah instans kluster sharded, jumlah thread harus sama dengan jumlah shard. |
| |
incr_sync.worker.oplog_compressor | Mengaktifkan kompresi data untuk mengurangi konsumsi lebar pita jaringan. Nilai yang valid:
Catatan Parameter ini hanya berlaku jika parameter |
| |
incr_sync.target_delay | Penundaan, dalam detik, sebelum perubahan dari sumber diterapkan ke tujuan. Anda dapat mengatur parameter ini untuk mencegah operasi tidak disengaja. Misalnya, Catatan Nilai 0 menunjukkan sinkronisasi real-time. |
| |
incr_sync.worker.batch_queue_size | Parameter konfigurasi antrian internal MongoShake. Jangan ubah parameter ini kecuali diperlukan. |
| |
incr_sync.adaptive.batching_max_size |
| ||
incr_sync.fetcher.buffer_capacity |
| ||
Opsi sinkronisasi MongoDB (hanya untuk mode | incr_sync.executor.upsert | Menentukan apakah akan mengonversi pernyataan
|
|
incr_sync.executor.insert_on_dup_update | Menentukan apakah akan mengonversi pernyataan
|
| |
incr_sync.conflict_write_to | Menentukan apakah akan mencatat dokumen yang bentrok jika terjadi konflik tulis selama sinkronisasi. Nilai yang valid:
|
| |
incr_sync.executor.majority_enable | Menentukan apakah akan mengaktifkan majority write pada instans tujuan. Nilai yang valid:
Catatan Mengaktifkan fitur ini dapat memengaruhi kinerja. |
|
FAQ
Lihat FAQ MongoShake. Jika Anda mengalami masalah lain saat menggunakan MongoShake, Anda dapat membuat issue di GitHub Issues.