NimoShake (DynamoShake olarak da bilinir), Amazon DynamoDB veritabanlarını ApsaraDB for MongoDB'ye geçiren ve Alibaba Cloud tarafından geliştirilen bir veri senkronizasyon aracıdır. Tek bir çalıştırmada tam geçiş, artımlı geçiş veya her ikisini birden destekler.
Desteklenen özellikler
| Özellik | Destekleniyor |
|---|---|
| Tam geçiş | Evet |
| Artımlı geçiş | Evet |
| Yeniden başlatılabilir iletim (artımlı) | Evet |
| Yeniden başlatılabilir iletim (tam) | Hayır |
| Dizin geçişi (yalnızca tam aşama) | Evet |
| Yalnızca şema geçişi | Evet |
| Koleksiyon filtreleme | Evet |
| Dizin geçişi (artımlı aşama) | Hayır |
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Bir ApsaraDB for MongoDB çoğaltma kümesi örneği veya parçalı küme örneği. Bkz. Çoğaltma kümesi örneği oluşturma veya Parçalı küme örneği oluşturma.
Amazon DynamoDB için AccessKey ID ve AccessKey secret.
Kaynak DynamoDB veritabanındaki tüm verileri barındıracak kadar ApsaraDB for MongoDB depolama alanı. Hedef depolama kapasitesi kaynağı aşmalıdır.
Çalışma şekli
NimoShake, tam geçiş ve artımlı geçişi ayrı aşamalar olarak yürütür.
Tam geçiş
Tam geçiş, veri geçişini takiben dizin geçişinden oluşan iki bölümden oluşur.

Veri geçişi, bir işlem hattında üç iş parçacığı türü kullanır:

| İş Parçacığı | Açıklama |
|---|---|
| Fetcher | Amazon'un protokol dönüştürme sürücüsünü çağırarak kaynak tablodan toplu veri alır ve kuyruklara yerleştirir. Aynı anda yalnızca bir fetcher iş parçacığı çalışır. |
| Parser | Verileri kuyruklardan okur ve BSON formatına dönüştürerek yürütücülere iletir. Varsayılan: 2 iş parçacığı. full.document.parser ile kontrol edilir. |
| Executor | Verileri kuyruklardan çeker, 16 MB'a veya 1.024 girişe kadar toplar ve hedefe yazar. Varsayılan: 4 iş parçacığı. full.document.concurrency ile kontrol edilir. |
Dizin geçişi, veri geçişi tamamlandıktan sonra çalışır ve aşağıdaki dizinleri oluşturur:
-
Otomatik oluşturulan dizinler:
Kaynak tabloda bir bölüm anahtarı ve sıralama anahtarı varsa: Her iki anahtar üzerinde benzersiz bir bileşik dizin ve bölüm anahtarı üzerinde karma bir dizin.
Kaynak tabloda yalnızca bir bölüm anahtarı varsa: Bölüm anahtarı üzerinde bir karma dizin ve benzersiz bir dizin.
Kullanıcı tarafından oluşturulan dizinler: Her kullanıcı tanımlı dizin için birincil anahtara dayalı bir karma dizin oluşturulur.
Artımlı geçiş
Artımlı geçiş, kaynakta devam eden değişiklikleri yakalar ve bunları ApsaraDB for MongoDB'ye yazar. Artımlı aşama sırasında oluşturulan dizinleri geçirmez.

| İş Parçacığı | Açıklama |
|---|---|
| Fetcher | Akıştaki parça değişikliklerini izler. |
| Manager | Mesaj bildirimini yönetir ve her parça için bir Dispatcher oluşturur. |
| Dispatcher | Kaynaktan artımlı verileri alır; yeniden başlatılabilir iletim etkin olduğunda son kontrol noktasından devam eder. |
| Batcher | Dispatcher iş parçacıklarından gelen artımlı verileri ayrıştırır, paketler ve toplar. |
| Executor | Toplanan verileri hedef ApsaraDB for MongoDB örneğine yazar ve kontrol noktasını günceller. |
Yeniden başlatılabilir iletim ve kontrol noktaları
Artımlı geçiş, kontrol noktaları aracılığıyla yeniden başlatılabilir iletimi destekler. Bağlantı kesilir ve hızla geri yüklenirse geçiş son kontrol noktasından devam eder. Uzun süreli bağlantı kesintisi veya kontrol noktasının kaybı tam geçişin yeniden tetiklenmesine neden olabilir.
Varsayılan olarak kontrol noktaları, nimo-shake-checkpoint adlı bir veritabanında hedef ApsaraDB for MongoDB veritabanında saklanır. Her koleksiyonun kendi kontrol noktası tablosu vardır ve status_table mevcut senkronizasyonun tam mı yoksa artımlı bir görev mi olduğunu kaydeder.
Tam geçiş yeniden başlatılabilir iletimi desteklemez. Tam geçiş kesintiye uğrarsa baştan başlar.
DynamoDB'yi ApsaraDB for MongoDB'ye geçirin
Aşağıdaki adımlarda Ubuntu örnek olarak kullanılmıştır.
Adım 1: NimoShake'i indirin
wget https://github.com/alibaba/NimoShake/releases/download/release-v1.0.14-20250704/nimo-shake-v1.0.14.tar.gz
En son sürümü NimoShake sürümler sayfasından indirin.
Adım 2: Paketi çıkarın
tar zxvf nimo-shake-v1.0.14.tar.gz
Adım 3: Dizine girin
cd nimo-shake-v1.0.14
Adım 4: NimoShake'i yapılandırın
Yapılandırma dosyasını açın:
vi nimo-shake.conf
Aşağıdaki tablolar tüm yapılandırma parametrelerini kategori gruplarına ayrılmış şekilde açıklar. Önce gerekli parametrelerle başlayın, ardından isteğe bağlı parametreleri ihtiyaca göre ayarlayın.
Gerekli parametreler
| Parametre | Açıklama | Örnek |
|---|---|---|
source.access_key_id |
Amazon DynamoDB veritabanı için AccessKey ID. | source.access_key_id = AKIAIOSFODNN7EXAMPLE |
source.secret_access_key |
Amazon DynamoDB veritabanı için AccessKey secret. | source.secret_access_key = wJalrXUtnFEMI/K7MDENG |
source.region |
DynamoDB veritabanının AWS bölgesi. Bölge otomatik algılanıyorsa veya geçerli değilse isteğe bağlıdır. | source.region = us-east-2 |
target.type |
Hedef veritabanının türü. ApsaraDB for MongoDB için mongodb olarak ayarlayın. DynamoDB uyumlu ApsaraDB for MongoDB örneği için aliyun_dynamo_proxy olarak ayarlayın.Diğer MongoDB adresleri için bkz. Çoğaltma kümesi örneği bağlantısı veya Parçalı küme örneğine bağlanma. |
target.type = mongodb |
target.address |
Hedef veritabanının bağlantı dizesi. Bkz. Çoğaltma kümesi örneğine bağlanma veya Parçalı küme örneğine bağlanma. | target.address = mongodb://username:password@s-*****-pub.mongodb.rds.aliyuncs.com:3717 |
target.mongodb.type |
Hedef ApsaraDB for MongoDB örneğinin türü. Çoğaltma kümesi örneği için replica. Parçalı küme örneği için sharding. |
target.mongodb.type = sharding |
sync_mode |
Geçiş modu. all: Tam geçişi çalıştırır, ardından artımlı geçiş yapar. full: Yalnızca tam geçişi çalıştırır. Varsayılan: all. Not
Kaynak DynamoDB uyumlu bir ApsaraDB for MongoDB örneği olduğunda yalnızca |
sync_mode = all |
Genel ayarlar
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
id |
— | İsteğe bağlı | Geçiş görevinin kimliği. PID dosyaları, günlük adları, kontrol noktası veritabanı adı ve hedef veritabanı adı için kullanılır. | id = nimo-shake |
log.file |
stdout | İsteğe bağlı | Günlük dosyasının yolu. Ayarlanmazsa günlükler stdout'a yazdırılır. | log.file = nimo-shake.log |
log.level |
info |
İsteğe bağlı | Günlük seviyesi. Geçerli değerler: none, error, warn, info, debug. |
log.level = info |
log.buffer |
true |
İsteğe bağlı | Günlük arabelleğe almanın etkin olup olmadığı. true: yüksek performans sağlar ancak çıkışta son birkaç günlük girişi kaybedebilir. false: tüm günlük girişleri temizlenir ancak performans düşebilir. |
log.buffer = true |
system_profile |
— | İsteğe bağlı | Hata ayıklama ve yığın içeren eş zamanlı bilgi görüntüleme için PPROF bağlantı noktası. | system_profile = 9330 |
full_sync.http_port |
— | İsteğe bağlı | Tam geçiş aşaması için RESTful bağlantı noktası. İzleme istatistiklerini görüntülemek için curl kullanın. Bkz. wiki. |
full_sync.http_port = 9341 |
incr_sync.http_port |
— | İsteğe bağlı | Artımlı geçiş aşaması için RESTful bağlantı noktası. İzleme istatistiklerini görüntülemek için curl kullanın. Bkz. wiki. |
incr_sync.http_port = 9340 |
Kaynak bağlantı ayarları
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
source.session_token |
— | İsteğe bağlı | DynamoDB'ye erişim için geçici oturum belirteci. Yalnızca geçici kimlik bilgileri kullanırken gereklidir. | source.session_token = AQoXnyc4lcK4w4... |
source.endpoint_url |
— | İsteğe bağlı | Kaynak bir uç nokta türüyse uç nokta URL'si. **Bu parametreyi ayarlamak diğer tüm source.* parametrelerini geçersiz kılar.** |
source.endpoint_url = "http://192.168.0.1:1010" |
source.session.max_retries |
— | İsteğe bağlı | Oturum hatasından sonraki maksimum yeniden deneme sayısı. | source.session.max_retries = 3 |
source.session.timeout |
— | İsteğe bağlı | Milisaniye cinsinden oturum zaman aşımı. Zaman aşımını devre dışı bırakmak için 0 olarak ayarlayın. |
source.session.timeout = 3000 |
Koleksiyon filtreleme
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
filter.collection.white |
— | İsteğe bağlı | Geçirilecek koleksiyonların izin listesi. Yalnızca listelenen koleksiyonlar geçirilir. | filter.collection.white = c1;c2 |
filter.collection.black |
— | İsteğe bağlı | Hariç tutulacak koleksiyonların engelleme listesi. Diğer tüm koleksiyonlar geçirilir. filter.collection.white ile birlikte kullanılamaz. İkisi de ayarlanırsa tüm koleksiyonlar geçirilir. |
filter.collection.black = c1;c2 |
Hedef ayarları
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
target.db.exist |
Error | İsteğe bağlı | Hedefte aynı ada sahip mevcut koleksiyonların nasıl ele alınacağı. rename: Mevcut koleksiyonu zaman damgası soneki ekleyerek yeniden adlandırır (örneğin c1 şuna dönüşür: c1.2019-07-01Z12:10:11). drop: Mevcut koleksiyonu siler. Ayarlanmazsa aynı adlı bir koleksiyon varsa geçiş hata ile durur. |
target.db.exist = drop |
sync_schema_only |
false |
İsteğe bağlı | Veriler olmadan yalnızca tablo şemasının geçirilip geçirilmeyeceği. | sync_schema_only = false |
Tam geçiş performansı
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
full.concurrency |
4 |
İsteğe bağlı | Eşzamanlı olarak geçirilen maksimum koleksiyon sayısı. | full.concurrency = 4 |
full.read.concurrency |
1 |
İsteğe bağlı | Tek bir kaynak tablodan okuyan eşzamanlı iş parçacığı sayısı. DynamoDB Scan API'sinin TotalSegments parametresine karşılık gelir. |
full.read.concurrency = 1 |
full.document.concurrency |
4 |
İsteğe bağlı | Tablo başına eşzamanlı yazar iş parçacığı sayısı. | full.document.concurrency = 4 |
full.document.write.batch |
— | İsteğe bağlı | Yazma başına toplanan giriş sayısı. Hedef DynamoDB uyumlu bir veritabanı olduğunda maksimum değer 25'tir. | full.document.write.batch = 25 |
full.document.parser |
2 |
İsteğe bağlı | DynamoDB verilerini hedef protokole dönüştürmek için eşzamanlı parser iş parçacığı sayısı. | full.document.parser = 2 |
full.enable_index.user |
true |
İsteğe bağlı | Kullanıcı tanımlı dizinlerin geçirilip geçirilmeyeceği. | full.enable_index.user = true |
full.executor.insert_on_dup_update |
true |
İsteğe bağlı | Hedefte yinelenen bir anahtar bulunduğunda INSERT işleminin UPDATE işlemine dönüştürülüp dönüştürülmeyeceği. |
full.executor.insert_on_dup_update = true |
qps.full |
1000 |
İsteğe bağlı | Tam geçiş sırasında saniye başına maksimum Scan komutu çağrısı sayısı. |
qps.full = 1000 |
qps.full.batch_num |
128 |
İsteğe bağlı | Tam geçiş sırasında saniye başına çekilen veri girişi sayısı. | qps.full.batch_num = 128 |
full.read.filter_expression |
— | İsteğe bağlı | Tam geçiş için bir DynamoDB filtre ifadesi. Değişkenler iki nokta üst üste ile başlar, örneğin :begin ve :end. Değişken değerlerini full.read.filter_attributevalues içinde belirtin. |
full.read.filter_expression = create_time > :begin AND create_time < :end |
full.read.filter_attributevalues |
— | İsteğe bağlı | full.read.filter_expression içindeki değişkenler için değerler. N Sayıyı, S Dizeyi temsil eder. |
full.read.filter_attributevalues = begin`N`1646724207280~~~end`N`1646724207283 |
Artımlı geçiş performansı
Yalnızca tam geçiş çalıştırıyorsanız bu bölümü atlayın ( sync_mode = full ).
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
incr_sync_parallel |
false |
İsteğe bağlı | Paralel artımlı geçişin etkin olup olmadığı. true: daha fazla bellek kullanır. false: standart mod. |
incr_sync_parallel = false |
increase.concurrency |
16 |
İsteğe bağlı | Eşzamanlı olarak yakalanan maksimum parça sayısı. | increase.concurrency = 16 |
increase.executor.insert_on_dup_update |
true |
İsteğe bağlı | Hedefte aynı anahtarlar bulunduğunda INSERT işleminin UPDATE işlemine dönüştürülüp dönüştürülmeyeceği. |
increase.executor.insert_on_dup_update = true |
increase.executor.upsert |
true |
İsteğe bağlı | Hedefte eşleşen anahtar olmadığında UPDATE işleminin UPSERT işlemine dönüştürülüp dönüştürülmeyeceği. Bir UPSERT işlemi anahtar varsa kaydı günceller, yoksa ekler. |
increase.executor.upsert = true |
qps.incr |
1000 |
İsteğe bağlı | Artımlı geçiş sırasında saniye başına maksimum GetRecords komutu çağrısı sayısı. |
qps.incr = 1000 |
qps.incr.batch_num |
128 |
İsteğe bağlı | Artımlı geçiş sırasında saniye başına çekilen veri girişi sayısı. | qps.incr.batch_num = 128 |
Kontrol noktası ayarları
Yalnızca tam geçiş çalıştırıyorsanız bu bölümü atlayın ( sync_mode = full ).
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
checkpoint.type |
— | İsteğe bağlı | Kontrol noktası verileri için depolama türü. mongodb: Kontrol noktalarını bir ApsaraDB for MongoDB veritabanında saklar (yalnızca target.type değeri mongodb olduğunda kullanılabilir). file: Kontrol noktalarını yerel makinede saklar. |
checkpoint.type = mongodb |
checkpoint.address |
Destination DB | İsteğe bağlı | Kontrol noktası verilerini saklamak için adres. checkpoint.type değeri mongodb ise bağlantı dizesini girin. Ayarlanmazsa kontrol noktaları hedef veritabanında saklanır. checkpoint.type değeri file ise göreli bir yol girin. Ayarlanmazsa varsayılan olarak NimoShake yürütülebilir dosyasına göreli checkpoint klasörüdür. |
checkpoint.address = mongodb://username:password@s-*****-pub.mongodb.rds.aliyuncs.com:3717 |
checkpoint.db |
<id>-checkpoint |
İsteğe bağlı | Kontrol noktası depolaması için veritabanı adı. Varsayılan olarak <id>-checkpoint şeklindedir, örneğin nimo-shake-checkpoint. |
checkpoint.db = nimo-shake-checkpoint |
Gelişmiş ayarlar
| Parametre | Varsayılan | Gerekli | Açıklama | Örnek |
|---|---|---|---|---|
convert._id |
— | İsteğe bağlı | MongoDB'nin _id alanıyla çakışmaları önlemek için DynamoDB'den gelen _id alanına eklenen önek. |
convert._id = pre |
Adım 5: Geçişi başlatın
./nimo-shake.linux -conf=nimo-shake.conf
Tam geçiş tamamlandığında çıktı şunu gösterir:
full sync done!
Geçiş bir hata nedeniyle durursa NimoShake hata mesajını yazdırır ve çıkar. Sorunu teşhis etmek için günlük dosyasını veya stdout çıktısını inceleyin.
Kullanım notları
Yoğun olmayan saatlerde çalıştırın. Tam geçiş hem kaynak DynamoDB veritabanında hem de hedef ApsaraDB for MongoDB örneğinde kaynak tüketir. Yüksek trafik veya yetersiz sunucu teknik özellikleri veritabanı yükünü artırabilir. Etkiyi en aza indirmek için geçişleri yoğun olmayan saatlerde planlayın.
Artımlı geçişi sürekli izleyin. Artımlı geçiş uzun süre kesintiye uğrarsa veya kontrol noktası kaybolursa tüm verileri yeniden senkronize etmek için tam geçiş gerekebilir.
Artımlı geçiş dizinleri senkronize etmez. Artımlı aşama sırasında oluşturulan veya değiştirilen dizinler geçirilmez. Gerekirse dizin değişikliklerini hedefte manuel olarak yönetin.
Koleksiyon adı çakışmaları. Hedefte aynı ada sahip bir koleksiyon zaten varsa
target.db.existparametresinirenameveyadropolarak yapılandırın. Bu ayar olmadan geçiş hata ile durur.