Alibaba Cloud tarafından geliştirilen açık kaynaklı bir araç olan MongoShake; veri analitiği, olağanüstü durum kurtarma ve aktif-aktif çoğaltma gibi kullanım senaryoları için MongoDB veritabanları arasında veri senkronizasyonu sağlar. Bu konuda, ApsaraDB for MongoDB örnekleri arasında gerçek zamanlı senkronizasyonun nasıl yapılandırılacağı açıklanmaktadır.
MongoShake
MongoShake, Alibaba Cloud tarafından Go dilinde geliştirilmiş genel amaçlı bir hizmet aracıdır. MongoDB'nin işlem günlüklerini (oplog) okuyarak ve bunları hedef örnekte yeniden oynatarak verileri çoğaltır.
MongoShake ayrıca veri aboneliği ve tüketimi özellikleri sunar. Günlük aboneliği, veri merkezi senkronizasyonu ve eşzamansız önbellek temizleme gibi senaryoları desteklemek amacıyla SDK'lar, Kafka ve MetaQ ile entegre olur.
Daha fazla bilgi için MongoShake GitHub deposuna bakın.
Desteklenen veri kaynakları
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notlar
Tam senkronizasyon tamamlanana kadar kaynak veritabanında herhangi bir DDL işlemi gerçekleştirmeyin. Aksi takdirde veri tutarsızlığı oluşabilir.
Yerel veritabanının senkronizasyonu desteklenmez. admin veritabanından veri senkronize etmek için İş verilerini admin veritabanından admin olmayan bir veritabanına taşıyın bölümüne bakın.
Gerekli izinler
Kaynak | Gerekli izinler |
Kaynak MongoDB örneği |
Not
|
Hedef MongoDB örneği |
|
MongoDB veritabanı kullanıcılarının nasıl oluşturulacağına ve yetkilendirileceğine ilişkin bilgi için MongoDB veritabanı kullanıcılarını yönetmek için DMS kullanın veya db.createUser komutu konularına bakın.
Önkoşullar
Optimum senkronizasyon performansı için kaynak MongoDB çoğaltma kümesi örneğinin bir VPC kullandığından emin olun. Klasik ağ kullanıyorsa ağ türünü VPC'ye geçirin. Daha fazla bilgi için Bir örneğin ağ türünü klasik ağdan VPC'ye geçirin konusuna bakın.
Bir hedef MongoDB çoğaltma kümesi örneği oluşturun. Ağ gecikme süresini en aza indirmek için hedef örneği kaynak örnekle aynı VPC'de oluşturun. Daha fazla bilgi için Çoğaltma kümesi örneği oluşturun konusuna bakın.
MongoShake'i çalıştırmak için bir ECS örneği oluşturun. Ağ gecikme süresini en aza indirmek için ECS örneğini kaynak örnekle aynı VPC'de oluşturun. Daha fazla bilgi için ECS örneği oluşturun konusuna bakın.
ECS örneğinin özel IP adresini hem kaynak hem de hedef MongoDB örneklerinin izin listesine ekleyin ve ECS örneğinin her iki örneğe de bağlanabildiğini doğrulayın. Daha fazla bilgi için İzin listesini değiştirin konusuna bakın.
Ağ kurulumunuz yukarıdaki gereksinimleri karşılamıyorsa hem kaynak hem de hedef MongoDB örnekleri için bir genel uç nokta talep edebilirsiniz. Ardından, genel uç noktalar üzerinden senkronizasyon gerçekleştirmek amacıyla ECS örneğinin genel IP adresini her iki MongoDB örneğinin izin listesine ekleyin. Daha fazla bilgi için Genel uç nokta talep edin ve İzin listesini değiştirin konularına bakın.
Yordam
Bu yordamda MongoShake'in /test/mongoshake dizinine yüklendiği varsayılmaktadır.
-
ECS örneğinde oturum açın.
NotSenaryonuzuna uygun bir oturum açma yöntemi seçebilirsiniz. Daha fazla bilgi için ECS sunucuları için oturum açma yöntemlerine genel bakış konusuna bakın.
-
MongoShake programını indirmek ve adını
mongoshake.tar.gzolarak değiştirmek için aşağıdaki komutu çalıştırın.wget "https://github.com/alibaba/MongoShake/releases/download/release-v2.8.7-20251218/mongo-shake-v2.8.7.tgz" -O mongoshake.tar.gzNotKomut, MongoShake 2.8.7 sürümünü indirir. En son sürümü indirmek için sürümler sayfasına bakın.
-
MongoShake paketini /test/mongoshake dizinine ayıklamak için aşağıdaki komutu çalıştırın.
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshake -
MongoShake yapılandırma dosyası collector.conf dosyasını değiştirmek için
vi collector.confkomutunu çalıştırın. Aşağıdaki tabloda ana parametreler açıklanmıştır.Parametre
Açıklama
Örnek
mongo_urls
Kaynak MongoDB örneğinin bağlantı dizesi URI'si. Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır.
NotAğ gecikme süresini en aza indirmek için bir VPC uç noktası kullanmanızı öneririz.
Bağlantı dizesi URI biçimiyle ilgili ayrıntılar için Çoğaltma kümesi örneği için bağlantı açıklaması konusuna bakın.
mongo_urls = mongodb://test:**@dds-bp19f409d7512.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512**.mongodb.rds.aliyuncs.com:3717NotParola at işaretini (
@) içeremez. Aksi takdirde bağlantı başarısız olur.tunnel.address
Hedef MongoDB örneğinin bağlantı dizesi URI'si. Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır.
NotAğ gecikme süresini en aza indirmek için bir VPC uç noktası kullanmanızı öneririz.
Bağlantı dizesi URI biçimiyle ilgili ayrıntılar için Çoğaltma kümesi örneği için bağlantı açıklaması konusuna bakın.
tunnel.address = mongodb://test:**@dds-bp19f409d7512.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512**.mongodb.rds.aliyuncs.com:3717NotParola at işaretini (
@) içeremez. Aksi takdirde bağlantı başarısız olur.sync_mode
Veri senkronizasyon modu. Geçerli değerler:
all: tam senkronizasyon ve artımlı senkronizasyon gerçekleştirir.
full: yalnızca tam senkronizasyon gerçekleştirir.
incr: yalnızca artımlı senkronizasyon gerçekleştirir.
NotVarsayılan değer
incrdeğeridir.sync_mode = allNotcollector.conf dosyasındaki parametrelerin tam listesi için Ek bölümündeki "collector.conf parametreleri" kısmına bakın.
-
Senkronizasyon görevini başlatmak ve günlükleri yazdırmak için aşağıdaki komutu çalıştırın.
./collector.linux -conf=collector.conf -verbose -
Günlük çıktısını gözlemleyin. Aşağıdakine benzer bir giriş göründüğünde tam senkronizasyonun tamamlandığı ve artımlı senkronizasyonun başladığı anlaşılır.
[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]
İzleme durumu
Artımlı senkronizasyon başladıktan sonra yeni bir terminal penceresi açın ve aşağıdaki komutları çalıştırın:
cd /test/mongoshake && ./mongoshake-stat --port=9100
mongoshake-stat bir Python betiğidir ve Python 2.7'nin yüklü olmasını gerektirir. Daha fazla bilgi için resmi Python web sitesine bakın.
Örnek çıktı:
./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-10
Parametre açıklamaları:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
admin veritabanından veri taşıma
MongoDB, kilitleme davranışı ve dahili komutlarla oluşan çakışmaların örnek performansını düşürebilmesi nedeniyle iş verilerinin admin veritabanında depolanmasını resmi olarak önermez.
MongoShake, admin veritabanındaki iş verilerini admin olmayan bir veritabanına senkronize etmeyi destekler.
Bunu yapmak için Yordam bölümündeki adımları uygulayın. 4. Adımda collector.conf dosyasını değiştirirken aşağıdaki yapılandırma öğelerini ekleyin:
filter.pass.special.db = admin
# Migrate all business collections from the admin database to newDB.
transform.namespace = admin:newDB
# Or, migrate the abc collection in the admin database to the def collection in the target database. You can configure multiple rules.
transform.namespace = admin.abc:target.def
Ek
Tablo 1. collector.conf parametreleri
Kategori | Parametre | Açıklama | Örnek |
Yok | conf.version | Yapılandırma dosyasının sürümü. Bu değeri değiştirmeyin. |
|
Global seçenekler | id | Senkronizasyon görevinin kimliği. Bu değeri özelleştirebilirsiniz. Günlük dosyası adı, kontrol noktası bilgilerini depolamak için kullanılan veritabanı adı ve hedef örnekteki veritabanı adı için kullanılır. |
|
master_quorum | Yüksek kullanılabilirlik seçeneği. Birincil ve yedek MongoShake düğümleri aynı kaynaktan veri senkronize ederken bu parametreyi birincil MongoShake düğümünde Geçerli değerler:
Not Varsayılan değer false değeridir. |
| |
full_sync.http_port | Tam senkronizasyon durumunu görüntülemek için kullanılan HTTP bağlantı noktası. Not Varsayılan değer 9101'dir. |
| |
incr_sync.http_port | Artımlı senkronizasyon durumunu görüntülemek için kullanılan HTTP bağlantı noktası. Not Varsayılan değer 9100'dür. |
| |
system_profile_port | Dahili yığın bilgilerini görüntülemek için kullanılan profil oluşturma bağlantı noktası. |
| |
log.level | Günlük düzeyi. Geçerli değerler:
Varsayılan değer: info. |
| |
log.dir | Günlük dosyaları ve PID dosyaları için dizin. Bu parametre ayarlanmazsa varsayılan olarak geçerli yoldaki logs dizini kullanılır. Not Bu parametre için mutlak bir yol belirtmeniz gerekir. |
| |
log.file | Günlük dosyasının adı. Bu değeri özelleştirebilirsiniz. Not Varsayılan değer collector.log değeridir. |
| |
log.flush | Ekrandaki günlük yenileme sıklığı. Geçerli değerler:
Not Varsayılan değer false değeridir. |
| |
sync_mode | Veri senkronizasyon modu. Geçerli değerler:
Not Varsayılan değer incr değeridir. |
| |
mongo_urls | Kaynak MongoDB örneğinin bağlantı dizesi URI'si. Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır. Not
|
| |
mongo_cs_url | Kaynak bir parçalı küme örneğiyse ConfigServer (CS) düğümünün bağlantı dizesi URI'sini belirtmeniz gerekir. Bir ConfigServer düğümünün bağlantı dizesi URI'sinin nasıl alınacağı hakkında bilgi için Parça için uç nokta talep edin konusuna bakın. Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır. |
| |
mongo_s_url | Kaynak bir parçalı küme örneğiyse en az bir mongos düğümünün bağlantı dizesi URI'sini belirtmeniz gerekir. Birden çok mongos adresini virgülle (,) ayırın. Bir mongos düğümünün bağlantı dizesi URI'sinin nasıl alınacağı hakkında bilgi için Parça için uç nokta talep edin konusuna bakın. Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır. |
| |
tunnel | Senkronizasyon kanalı türü. Geçerli değerler:
Not Varsayılan değer direct değeridir. |
| |
tunnel.address | Hedefin adresi. Desteklenen adres biçimi tünel türüne göre değişir:
Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır. |
| |
tunnel.message | Kanaldaki veri türü. Bu parametre yalnızca
Not Varsayılan değer raw değeridir. |
| |
mongo_connect_mode | MongoDB örneğinin bağlantı modu. Bu parametre yalnızca
Not Varsayılan değer secondaryPreferred değeridir. |
| |
filter.namespace.black | Veri senkronizasyonu için bir engelleme listesi belirtir. Belirtilen ad alanları hedef veritabanına senkronize edilmez. Birden çok ad alanını noktalı virgülle (;) ayırın. Not Ad alanı, MongoDB'deki bir koleksiyonun veya dizinin kanonik adıdır. Veritabanı adı ile koleksiyon veya dizin adının birleşiminden oluşur; örneğin |
| |
filter.namespace.white | Veri senkronizasyonu için bir izin listesi belirtir. Yalnızca belirtilen ad alanları hedef veritabanına senkronize edilir. Birden çok ad alanını noktalı virgülle (;) ayırın. |
| |
filter.pass.special.db | Özel veritabanlarının senkronizasyonunu etkinleştirir. Varsayılan olarak |
| |
filter.ddl_enable | DDL senkronizasyonunun etkinleştirilip etkinleştirilmeyeceğini belirtir. Geçerli değerler:
Not Kaynak bir parçalı küme örneği olduğunda bu özellik desteklenmez. |
| |
checkpoint.storage.url | Kalan senkronizasyonu desteklemek için kullanılan kontrol noktalarının depolama adresi. Bu parametre yapılandırılmazsa program, örnek türüne bağlı olarak kontrol noktalarını aşağıdaki veritabanlarından birine yazar:
Örnekte veritabanı hesabı, admin veritabanında bulunan test hesabıdır. |
| |
checkpoint.storage.db | Kontrol noktalarını depolamak için kullanılan veritabanının adı. Not Varsayılan değer mongoshake değeridir. |
| |
checkpoint.storage.collection | Kontrol noktalarını depolamak için kullanılan koleksiyonun adı. Birincil ve yedek MongoShake düğümleri aynı kaynaktan veri senkronize ederken çakışmaları önlemek için bu koleksiyon adını değiştirebilirsiniz. Not Varsayılan değer ckpt_default değeridir. |
| |
checkpoint.start_position | Senkronizasyonun başlangıç konumu. Bu parametre yalnızca kontrol noktası bulunamadığında kullanılır. Biçim Not Varsayılan değer 1970-01-01T00:00:00Z değeridir. |
| |
transform.namespace | Bir kaynak veritabanını veya koleksiyonu yeniden adlandırır ve hedefe senkronize eder. Örneğin, kaynak örnekteki |
| |
Tam senkronizasyon seçenekleri | full_sync.reader.collection_parallel | MongoShake'in aynı anda çekebileceği maksimum koleksiyon sayısı. |
|
full_sync.reader.write_document_parallel | MongoShake için koleksiyon başına eşzamanlı yazma iş parçacığı sayısı. |
| |
full_sync.reader.document_batch_size | Belgelerin hedef örneğe yazılması için kullanılan toplu iş boyutu. Örneğin, 128 değeri 128 belgenin birlikte gruplanıp yazıldığını gösterir. |
| |
full_sync.collection_exist_drop | Hedef koleksiyonun kaynak koleksiyonla aynı ada sahip olması durumunda ne yapılacağını belirtir. Geçerli değerler:
|
| |
full_sync.create_index | Senkronizasyon tamamlandıktan sonra dizin oluşturulup oluşturulmayacağını belirtir. Geçerli değerler:
|
| |
full_sync.executor.insert_on_dup_update | Hedef veritabanı yinelenen bir
|
| |
full_sync.executor.filter.orphan_document | Kaynak bir parçalı küme örneğiyse sahipsiz belgelerin filtrelenip filtrelenmeyeceğini belirtir. Geçerli değerler:
|
| |
full_sync.executor.majority_enable | Hedef örnekte çoğunluk yazmanın etkinleştirilip etkinleştirilmeyeceğini belirtir. Geçerli değerler:
|
| |
Artımlı senkronizasyon seçenekleri | incr_sync.mongo_fetch_method | Artımlı verileri çekme yöntemi. Geçerli değerler:
Varsayılan değer: oplog. |
|
incr_sync.oplog.gids | Cloud kümeleri için çift yönlü çoğaltma kurmak amacıyla kullanılır. |
| |
incr_sync.shard_key | MongoShake'in dahili eşzamanlılık yöntemi. Bu parametreyi değiştirmeyin. |
| |
incr_sync.worker | Oplog'ları iletmek için kullanılan eşzamanlı iş parçacığı sayısı. Ana bilgisayar performansı yeterliyse bu değeri artırabilirsiniz. Not Kaynak bir parçalı küme örneğiyse iş parçacığı sayısı parça sayısına eşit olmalıdır. |
| |
incr_sync.worker.oplog_compressor | Ağ bant genişliği tüketimini azaltmak için veri sıkıştırmayı etkinleştirir. Geçerli değerler:
Not Bu parametre yalnızca |
| |
incr_sync.target_delay | Kaynaktaki değişikliklerin hedefe uygulanmasından önceki saniye cinsinden gecikme. Yanlışlıkla yapılan işlemleri önlemek için bu parametreyi ayarlayabilirsiniz. Örneğin, Not 0 değeri gerçek zamanlı senkronizasyonu gösterir. |
| |
incr_sync.worker.batch_queue_size | MongoShake'in dahili kuyruk yapılandırma parametreleri. Gerekmedikçe bu parametreleri değiştirmeyin. |
| |
incr_sync.adaptive.batching_max_size |
| ||
incr_sync.fetcher.buffer_capacity |
| ||
MongoDB senkronizasyon seçenekleri (yalnızca | incr_sync.executor.upsert | İlgili
|
|
incr_sync.executor.insert_on_dup_update | İlgili
|
| |
incr_sync.conflict_write_to | Senkronizasyon sırasında bir yazma çakışması oluşursa çakışan belgelerin kaydedilip kaydedilmeyeceğini belirtir. Geçerli değerler:
|
| |
incr_sync.executor.majority_enable | Hedef örnekte çoğunluk yazmanın etkinleştirilip etkinleştirilmeyeceğini belirtir. Geçerli değerler:
Not Bu özelliği etkinleştirmek performansı etkileyebilir. |
|
SSS
MongoShake SSS konularına bakın. MongoShake'i kullanırken başka sorunlarla karşılaşırsanız GitHub Issues üzerinden bir sorun bildirebilirsiniz.