NimoShake (juga dikenal sebagai DynamoShake) adalah alat sinkronisasi data yang dikembangkan oleh Alibaba Cloud, memungkinkan migrasi database Amazon DynamoDB ke Alibaba Cloud.
Prasyarat
Sebuah instance ApsaraDB for MongoDB telah dibuat. Untuk informasi lebih lanjut, lihat Buat Instance Set Replika atau Buat Instance Kluster Sharded.
Informasi latar belakang
NimoShake dirancang untuk migrasi dari database Amazon DynamoDB. Tujuan harus berupa database ApsaraDB for MongoDB. Untuk informasi lebih lanjut, lihat Ikhtisar NimoShake.
Pertimbangan penting
Konsumsi Sumber Daya. Migrasi data penuh mengonsumsi sumber daya di kedua database sumber dan tujuan, meningkatkan beban server. Jika database Anda memiliki lalu lintas tinggi atau spesifikasi server rendah, ini dapat menyebabkan tekanan tambahan. Kami menyarankan untuk mengevaluasi dampak potensial pada kinerja sebelum migrasi dan menjalankannya selama jam-jam sepi.
Kapasitas Penyimpanan. Pastikan ruang penyimpanan instance ApsaraDB for MongoDB lebih besar daripada database Amazon DynamoDB.
Istilah kunci
Transmisi yang Dapat Dilanjutkan: Fitur ini membagi tugas menjadi beberapa bagian untuk transmisi. Jika transmisi terputus karena kegagalan jaringan atau alasan lainnya, tugas dapat dilanjutkan dari tempat terakhir, bukan dimulai ulang dari awal.
CatatanMigrasi penuh tidak mendukung transmisi yang dapat dilanjutkan.
Migrasi inkremental mendukung transmisi yang dapat dilanjutkan. Jika koneksi sinkronisasi inkremental hilang dan pulih dalam waktu singkat, sinkronisasi dapat dilanjutkan. Namun, dalam situasi tertentu seperti pemutusan koneksi yang berkepanjangan atau hilangnya titik periksa sebelumnya, sinkronisasi penuh mungkin dipicu lagi.
Titik Periksa: Transmisi yang dapat dilanjutkan untuk sinkronisasi inkremental dicapai melalui titik periksa. Secara default, titik periksa ditulis ke database MongoDB tujuan, khususnya ke database bernama
nimo-shake-checkpoint. Setiap koleksi mencatat tabel titik periksa miliknya sendiri, dan sebuahstatus_tablemencatat apakah sinkronisasi saat ini merupakan tugas penuh atau inkremental.
Fitur NimoShake
NimoShake mendukung mekanisme sinkronisasi terpisah, yang dilakukan dalam dua langkah:
Migrasi data penuh.
Migrasi data inkremental.
Migrasi penuh
Migrasi penuh terdiri dari dua bagian: migrasi data dan migrasi indeks. Gambar berikut menunjukkan arsitektur dasar:
Migrasi data: NimoShake menggunakan beberapa thread konkuren untuk menarik data sumber, seperti yang ditunjukkan pada gambar berikut:

Thread
Deskripsi
Fetcher
Memanggil driver konversi protokol yang disediakan oleh Amazon untuk mengambil data secara batch dari tabel sumber dan menempatkannya di antrian hingga semua data sumber ditarik.
CatatanHanya satu thread fetcher yang disediakan.
Parser
Membaca data dari antrian dan mengurai data tersebut menjadi struktur BSON. Setelah data diuraikan, parser menulis data ke thread executor. Beberapa thread parser dapat dimulai. Nilai default adalah 2. Sesuaikan jumlah thread parser menggunakan parameter
FullDocumentParser.Executor
Menarik data dari antrian, kemudian mengumpulkan dan menulis data ke database ApsaraDB for MongoDB tujuan. Hingga 16 MB data atau 1.024 entri dapat dikumpulkan. Beberapa thread executor dapat dimulai. Nilai default adalah 4. Sesuaikan jumlah thread executor menggunakan parameter
FullDocumentConcurrency.Migrasi indeks: NimoShake membuat indeks setelah migrasi data selesai. Indeks dikategorikan menjadi indeks yang dihasilkan otomatis dan indeks yang dibuat pengguna:
Indeks yang Dihasilkan Otomatis:
Jika Anda memiliki kunci partisi dan kunci sortir, NimoShake akan membuat indeks komposit unik dan menulisnya ke MongoDB.
NimoShake juga akan membuat indeks hash untuk kunci partisi dan menulisnya ke MongoDB.
Jika Anda hanya memiliki kunci partisi, NimoShake akan membuat indeks hash dan indeks unik di MongoDB.
Indeks yang Dibuat Pengguna: Jika Anda memiliki indeks yang dibuat pengguna, NimoShake membuat indeks hash berdasarkan kunci utama dan menulis indeks tersebut ke database ApsaraDB for MongoDB tujuan.
Migrasi inkremental
Migrasi inkremental hanya mensinkronkan data; tidak mensinkronkan indeks yang dihasilkan selama proses sinkronisasi inkremental. Arsitektur dasarnya adalah sebagai berikut:
Thread | Deskripsi |
Fetcher | Memantau perubahan shard dalam aliran. |
Manager | Mengelola notifikasi pesan dan pembuatan dispatcher; setiap shard sesuai dengan satu Dispatcher. |
Dispatcher | Mengambil data inkremental dari sumber. Untuk transmisi yang dapat dilanjutkan, pengambilan data dilanjutkan dari titik periksa terakhir, bukan dari awal. |
Batcher | Mengurai, mengemas, dan mengumpulkan data inkremental yang diambil oleh thread Dispatcher. |
Executor | Menulis data yang dikumpulkan ke database ApsaraDB for MongoDB tujuan dan memperbarui checkpoint. |
Langkah-langkah: Migrasi Amazon DynamoDB ke Alibaba Cloud (contoh Ubuntu)
Bagian ini menunjukkan cara menggunakan NimoShake untuk memigrasikan database Amazon DynamoDB ke ApsaraDB for MongoDB, menggunakan sistem Ubuntu sebagai contoh.
Unduh NimoShake: Jalankan perintah berikut untuk mengunduh paket NimoShake:
wget https://github.com/alibaba/NimoShake/releases/download/release-v1.0.14-20250704/nimo-shake-v1.0.14.tar.gzCatatanKami menyarankan untuk mengunduh versi terbaru dari paket NimoShake.
Dekompresi Paket: Jalankan perintah berikut untuk mendekompresi paket NimoShake:
tar zxvf nimo-shake-v1.0.14.tar.gzAkses Direktori: Setelah dekompresi, jalankan perintah
cd nimo-shake-v1.0.14untuk masuk ke foldernimo.Buka File Konfigurasi: Jalankan perintah
vi nimo-shake.confuntuk membuka file konfigurasi NimoShake.Konfigurasikan NimoShake: Konfigurasikan parameter dalam file
nimo-shake.conf. Tabel berikut menjelaskan setiap item konfigurasi:Parameter
Deskripsi
Contoh
id
ID tugas migrasi. Ini dapat disesuaikan dan digunakan untuk mengeluarkan file PID, nama log, nama database untuk penyimpanan titik periksa, dan nama database tujuan.
id = nimo-shakelog.file
Jalur file log. Jika parameter ini tidak dikonfigurasi, log ditampilkan di
stdout.log.file = nimo-shake.loglog.level
Tingkat logging. Nilai valid:
none: Tidak ada logerror: Pesan kesalahanwarn: Informasi peringataninfo: Status sistemdebug: Informasi debugging
Nilai default:
info.log.level = infolog.buffer
Menentukan apakah buffering log diaktifkan. Nilai valid:
true: Buffering log diaktifkan. Buffering log memastikan performa tinggi tetapi mungkin kehilangan beberapa entri log terbaru saat keluar.false: Buffering log dinonaktifkan. Jika dinonaktifkan, performa mungkin menurun. Namun, semua entri log ditampilkan saat keluar.
Nilai default:
true.log.buffer = truesystem_profile
Port PPROF, digunakan untuk debugging dan menampilkan informasi coroutine stackful.
system_profile = 9330full_sync.http_port
Port RESTful untuk fase migrasi penuh. Gunakan
curluntuk melihat statistik pemantauan internal. Untuk informasi lebih lanjut, lihat wiki.full_sync.http_port = 9341incr_sync.http_port
Port RESTful untuk fase migrasi inkremental. Gunakan
curluntuk melihat statistik pemantauan internal. Untuk informasi lebih lanjut, lihat wiki.incr_sync.http_port = 9340sync_mode
Jenis migrasi data. Nilai valid:
all: Migrasi penuh dan inkrementalfull: Hanya migrasi penuh
Nilai default:
all.CatatanHanya
fullyang didukung ketika sumbernya adalah instance ApsaraDB for MongoDB yang kompatibel dengan protokol DynamoDB.sync_mode = allincr_sync_parallel
Menentukan apakah akan melakukan migrasi inkremental paralel. Nilai valid:
true: Migrasi inkremental paralel diaktifkan. Ini mengonsumsi lebih banyak memori.false: Migrasi inkremental paralel dinonaktifkan.
Nilai default:
false.incr_sync_parallel = falsesource.access_key_id
ID AccessKey untuk database Amazon DynamoDB.
source.access_key_id = xxxxxxxxxxxsource.secret_access_key
Rahasia AccessKey untuk database Amazon DynamoDB.
source.secret_access_key = xxxxxxxxxxsource.session_token
Kunci sementara untuk mengakses database Amazon DynamoDB. Opsional jika tidak ada kunci sementara yang digunakan.
source.session_token = xxxxxxxxxxsource.region
Wilayah database Amazon DynamoDB. Opsional jika wilayah tidak berlaku atau terdeteksi otomatis.
source.region = us-east-2source.endpoint_url
Dapat dikonfigurasi jika sumbernya adalah tipe endpoint.
PentingMengaktifkan parameter ini akan menimpa parameter terkait sumber sebelumnya.
source.endpoint_url = "http://192.168.0.1:1010"source.session.max_retries
Jumlah maksimum percobaan ulang setelah kegagalan sesi.
source.session.max_retries = 3source.session.timeout
Periode timeout sesi.
0menunjukkan bahwa timeout sesi dinonaktifkan. Unit: milidetik.source.session.timeout = 3000filter.collection.white
Daftar putih nama koleksi untuk dimigrasikan. Sebagai contoh,
filter.collection.white = c1;c2menunjukkan bahwa koleksic1danc2akan dimigrasikan dan koleksi lainnya akan difilter.filter.collection.white = c1;c2filter.collection.black
Nama koleksi yang akan difilter. Sebagai contoh,
filter.collection.black = c1;c2menunjukkan bahwa koleksic1danc2akan difilter dan koleksi lainnya akan dimigrasikan.PentingTidak dapat digunakan bersamaan dengan
filter.collection.white. Jika keduanya ditentukan, semua koleksi akan dimigrasikan.filter.collection.black = c1;c2qps.full
Membatasi frekuensi eksekusi perintah
Scanselama migrasi penuh (panggilan maksimum per detik).Nilai default: 1000.
qps.full = 1000qps.full.batch_num
Jumlah entri data yang ditarik per detik selama migrasi penuh.
Nilai default: 128.
qps.full.batch_num = 128qps.incr
Membatasi frekuensi eksekusi perintah
GetRecordsselama migrasi inkremental (panggilan maksimum per detik).Nilai default: 1000.
qps.incr = 1000qps.incr.batch_num
Jumlah entri data yang ditarik per detik dalam migrasi inkremental.
Nilai default: 128.
qps.incr.batch_num = 128target.type
Tipe database tujuan. Nilai valid:
mongodb: instance ApsaraDB for MongoDB.aliyun_dynamo_proxy: instance ApsaraDB for MongoDB yang kompatibel dengan protokol DynamoDB.
target.type = mongodbtarget.address
String koneksi database tujuan. Mendukung string koneksi MongoDB dan alamat koneksi yang kompatibel dengan DynamoDB.
Untuk lebih banyak alamat MongoDB, lihat Hubungkan ke instance set replika atau Hubungkan ke instance kluster sharding.
target.address = mongodb://username:password@s-*****-pub.mongodb.rds.aliyuncs.com:3717target.mongodb.type
Tipe instance ApsaraDB for MongoDB tujuan. Nilai valid:
replica: instance set replika.sharding: instance kluster sharding.
target.mongodb.type = shardingtarget.db.exist
Menentukan cara menangani koleksi yang sudah ada dengan nama yang sama di tujuan. Nilai valid:
rename: NimoShake mengubah nama koleksi yang sudah ada dengan menambahkan akhiran timestamp pada nama. Sebagai contoh, NimoShake mengubah c1 menjadi c1.2019-07-01Z12:10:11.PeringatanIni mungkin memengaruhi bisnis Anda. Pastikan persiapan sebelumnya.
drop: Menghapus koleksi yang sudah ada di tujuan.
Jika tidak dikonfigurasi, migrasi akan berhenti dengan kesalahan jika koleksi dengan nama yang sama sudah ada di tujuan.
target.db.exist = dropsync_schema_only
Menentukan apakah hanya skema tabel yang dimigrasikan. Nilai valid:
true: Hanya skema tabel yang dimigrasikan.false: Tidak.
Nilai default:
false.sync_schema_only = falsefull.concurrency
Jumlah maksimum koleksi yang dapat dimigrasikan secara bersamaan dalam migrasi penuh.
Nilai default: 4.
full.concurrency = 4full.read.concurrency
Konkurensi tingkat dokumen dalam sebuah tabel selama migrasi penuh. Parameter ini menentukan jumlah maksimum thread yang dapat membaca dari sumber secara konkuren untuk satu tabel, yang sesuai dengan parameter TotalSegments dari antarmuka Scan.
Kekonkurenan tingkat dokumen dalam tabel selama migrasi penuh. Parameter ini menunjukkan jumlah maksimum thread yang dapat membaca dari sumber secara bersamaan untuk satu tabel, sesuai dengan parameter TotalSegments dari antarmuka Scan.
full.read.concurrency = 1full.document.concurrency
Parameter untuk migrasi penuh. Jumlah thread konkuren untuk menulis dokumen dari satu tabel ke tujuan selama migrasi penuh. Default: 4
Nilai default: 4.
full.document.concurrency = 4full.document.write.batch
Jumlah entri data yang akan dikumpulkan dan ditulis sekaligus. Jika tujuannya adalah database yang kompatibel dengan protokol DynamoDB, nilai maksimumnya adalah 25.
full.document.write.batch = 25full.document.parser
Parameter untuk migrasi penuh. Jumlah thread parser konkuren untuk mengonversi data protokol DynamoDB ke protokol yang sesuai untuk tujuan.
Nilai default: 2.
full.document.parser = 2full.enable_index.user
Parameter untuk migrasi penuh. Menentukan apakah indeks yang ditentukan pengguna akan dimigrasikan. Nilai valid:
true: Ya.false: Tidak.
Nilai default:
true.full.enable_index.user = truefull.executor.insert_on_dup_update
Parameter untuk migrasi penuh. Menentukan apakah operasi
INSERTdiubah menjadi operasiUPDATEjika kunci duplikat ditemui di tujuan. Nilai valid:true: Ya.false: Tidak.
Nilai default:
true.full.executor.insert_on_dup_update = trueincrease.concurrency
Parameter untuk migrasi inkremental. Jumlah maksimum shard yang dapat ditangkap secara bersamaan.
Nilai default: 16.
increase.concurrency = 16increase.executor.insert_on_dup_update
Parameter untuk migrasi inkremental. Menentukan apakah operasi
INSERTdiubah menjadi operasiUPDATEjika kunci yang sama ada di tujuan. Nilai valid:true: Ya.false: Tidak.
Nilai default:
true.increase.executor.insert_on_dup_update = trueincrease.executor.upsert
Parameter untuk migrasi inkremental. Menentukan apakah operasi
UPDATEdiubah menjadi operasiUPSERTjika tidak ada kunci yang ditemukan di tujuan. Nilai valid:true: Yafalse: Tidak
CatatanOperasi
UPSERTmemeriksa apakah kunci yang ditentukan ada. Jika ada, operasiUPDATEdilakukan. Jika tidak, operasiINSERTdilakukan.increase.executor.upsert = truecheckpoint.type
Tipe penyimpanan untuk informasi transmisi yang dapat dilanjutkan (titik periksa). Nilai valid:
mongodb: Informasi titik periksa disimpan di database ApsaraDB for MongoDB. Nilai ini tersedia hanya ketika parametertarget.typediatur kemongodb.file: Informasi titik periksa disimpan di komputer Anda.
checkpoint.type = mongodbcheckpoint.address
Alamat untuk menyimpan informasi titik periksa.
Jika parameter
checkpoint.typediatur kemongodb, masukkan string koneksi database ApsaraDB for MongoDB. Jika tidak dikonfigurasi, informasi titik periksa akan disimpan di database ApsaraDB for MongoDB tujuan. Lihat Hubungkan ke instance set replika atau Hubungkan ke instance kluster sharding untuk detail lebih lanjut.Jika parameter
checkpoint.typediatur kefile, masukkan jalur relatif (seperti checkpoint). Secara default ke folder checkpoint relatif terhadap file executable NimoShake jika tidak dikonfigurasi.
checkpoint.address = mongodb://username:password@s-*****-pub.mongodb.rds.aliyuncs.com:3717checkpoint.db
Nama database untuk informasi titik periksa. Jika tidak dikonfigurasi, nama database akan dalam format
<id>-checkpoint.Contoh:
nimo-shake-checkpoint.checkpoint.db = nimo-shake-checkpointconvert._id
Menambahkan awalan ke bidang
_iddi DynamoDB untuk menghindari konflik dengan bidang_iddi MongoDB.convert._id = prefull.read.filter_expression
Ekspresi DynamoDB yang digunakan untuk penyaringan selama migrasi penuh.
:begindan:endadalah variabel yang dimulai dengan tanda titik dua. Nilai aktualnya ditentukan dalamfilter_attributevalues.full.read.filter_expression = create_time > :begin AND create_time < :endfull.read.filter_attributevalues
Nilai yang sesuai dengan variabel dalam
filter_expressionuntuk penyaringan migrasi penuh.Nmerepresentasikan Angka danSmerepresentasikan String.full.read.filter_attributevalues = begin```N```1646724207280~~~end```N```1646724207283Mulai Migrasi: Jalankan perintah berikut untuk memulai migrasi data menggunakan file konfigurasi
nimo-shake.confyang telah dikonfigurasi:./nimo-shake.linux -conf=nimo-shake.confCatatanSetelah migrasi penuh selesai,
full sync done!akan ditampilkan. Jika migrasi dihentikan karena kesalahan, program akan otomatis menutup dan mencetak pesan kesalahan terkait untuk membantu Anda dalam pemecahan masalah.