mongo-migration-stream is a tool for online migrations of MongoDB databases. It transfers all the data from source database to the destination database, and keeps eventual consistency between those two MongoDB databases - allowing you to switch from one database to another without any downtime. To perform migrations, mongo-migration-stream utilises:
- MongoDB Database Tools - to dump and restore the data,
- Mongo Change Events - to keep synchronization between source and destination database,
- A Kotlin application - to manage, orchestrate and monitor all underneath processes.
- Installed MongoDB Database Tools on the machine,
- Source MongoDB instance is either replica set or sharded cluster,
- Source MongoDB instance is in version >= 3.6.
mongo-migration-stream can be used in two ways:
- as a dependency in JVM application,
- as a standalone JAR from command line.
Firstly, add mongo-migration-stream as a dependency to your project:
dependencies {
    implementation("pl.allegro.tech:mongo-migration-stream:0.9.0")
}Then, you can perform migrations using MongoMigrationStream object:
val migrator = MongoMigrationStream(
  ApplicationProperties(
    generalProperties = GeneralProperties(
      shouldPerformTransfer = shouldPerformTransfer,
      shouldPerformSynchronization = shouldPerformSynchronization,
      synchronizationHandlers = synchronizationHandlers,
      synchronizationDetectors = synchronizationDetectors,
      databaseValidators = startMongoMigrationStreamInfo.validators
    ),
    sourceDbProperties = startMongoMigrationStreamInfo.source,
    destinationDbProperties = startMongoMigrationStreamInfo.destination,
    collectionsProperties = startMongoMigrationStreamInfo.collections,
    performerProperties = PerformerProperties(
      rootPath,
      configuration.mongoToolsPath,
      configuration.queueFactoryType,
      startMongoMigrationStreamInfo.dumpReadPreference,
      batchSizeProvider,
      false,
      1
    ),
    stateConfig = StateConfig(stateEventHandler)
  ),
  meterRegistry
)
migrator.start()    // Starts a migration
migrator.pause()    // Pauses a migration
migrator.resume()   // Resumes a migration from a pause
migrator.stop()     // Stops a migrationFirstly, you need a mongo-migration-stream JAR. You can either:
- Download it from the newest release page, or
- Clone project repository and execute ./gradlew shadowJarcommand in root project directory - a JAR file should appear inmongo-migration-stream-cli/build/libs/directory.
Secondly, you have to define a properties file specifying migration details.
Below you can find a simple example of application.properties file:
perform.transfer=true
perform.synchronization=true
perform.synchronization.handlers=LoggingSynchronizationHandler
perform.synchronization.detectors=QueueSize,CollectionCount,DbHash
perform.synchronization.validators=DbAvailability,DestinationCollectionMissing,SourceCollectionAvailable
custom.rootPath=/tmp/mongomigrationstream/
custom.queue.factory=BiqQueueFactory
custom.dumpReadPreference=primary
custom.isCompressionEnabled=false
custom.insertionWorkersPerCollection=1
custom.batchSize=1000
collections.source=collection1,collection2
collections.destination=collection1changedName,collection2changedName
# Source - Replica set 3.6
source.db.uri=mongodb://mongo_rs36_1:36301,mongo_rs36_2:36302,mongo_rs36_3:36303/?replicaSet=replicaSet36
source.db.name=test
source.db.authentication.enabled=false
# Destination - Replica set 5.0
destination.db.uri=mongodb://mongo_rs5_1:50301,mongo_rs5_2:50302,mongo_rs5_3:50303/?replicaSet=replicaSet5
destination.db.name=test
destination.db.authentication.enabled=falseHaving both JAR and properties file, you can start the migration with a command:
java -jar mongo-migration-stream-cli.jar --config application.properties
You can find more information about mongo-migration-stream in: