Data Backup
MongoPlus provides two types of data backup. One is writing to a configured data source during insert, update, or delete operations. The other is local backup of certain collections, with data import functionality.
Data Backup
When performing insert, update, or delete operations using MongoPlus, AsyncMultipleWriteInterceptor
will asynchronously write to other data sources based on the configured strategy (MultipleWriteHandler
). By default, it writes to all configured sub-data sources.
Plugin Configuration
1. Create a Write Handler
@Component
public class MongoMultipleWriteHandler extends MultipleWriteHandler {
public MongoMultipleWriteHandler(MongoPlusClient mongoPlusClient) {
super(mongoPlusClient);
}
/**
* Write strategy: returns the data source names where data should be written. Throws an exception if not found.
* <p>If elements exist in the response data, this method's return value is used directly for writing.</p>
* @param currentDataSource Current data source name
* @param namespace Collection namespace
* @return {@code List<String>} Other data source names to write to
*/
@Override
public List<String> multipleWrite(String currentDataSource, MongoNamespace namespace) {
return super.multipleWrite(currentDataSource, namespace);
}
}
2. Create the Data Backup Plugin
@Bean
public AsyncMultipleWriteInterceptor multipleWriteInterceptor(MongoPlusClient mongoPlusClient,
MongoMultipleWriteHandler multipleWriteHandler){
// Add strategies
// On save, write to test1 and test2
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.SAVE, Arrays.asList("test1","test2"));
// On remove, write to test1 and test2
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.REMOVE, Arrays.asList("test1","test2"));
// On update, write to test1 and test2
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.UPDATE, Arrays.asList("test1","test2"));
// On bulkWrite, write to test1 and test2
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.BULK_WRITE, Arrays.asList("test1","test2"));
return new AsyncMultipleWriteInterceptor(mongoPlusClient,multipleWriteHandler);
}
Local Backup
Use BackupManager
to perform local backups of MongoDB. It works by paginated queries that convert each Document
to JSON and write it to a JSON file per page, then finally packages them into a zip file. For import, pass the zip file to BackupManager
, which will delete the corresponding collections before unpacking and adding the data.
public class Backup {
@Resource
private MongoPlusClient mongoPlusClient;
public void backupTest() {
String path = "/usr/local/backup/";
//BackupManager backupManager = new BackupManager(path, Arrays.asList("user", "role"), mongoPlusClient);
BackupManager backupManager = new BackupManager(mongoPlusClient);
// Set rows per page
backupManager.setLimit(1000);
// Set collections to backup (can be passed via constructor)
backupManager.setCollectionNames(Arrays.asList(User.class, Role.class));
// Set data source for backup, default is current data source
backupManager.setDataSourceName("master");
// Set backup listener, called for each data item
backupManager.setBackupListeners((targetPath, collectionName, document) ->
log.info("path: {}, collectionName: {}, document: {}",
targetPath,
collectionName,
document.toJson()
)
);
// Execute backup
Map<String,String> backupResult = backupManager.export();
backupResult.forEach((key, value) -> System.out.println("collectionName: "+key+"| path: "+value));
// Execute import
backupManager.imports(".zip");
}
}
With the above configuration, MongoPlus can perform data backup and asynchronous writes.