数据备份
MongoPlus提供了两种数据备份方式,一种是进行增删改时,向配置的某个数据源也进行写入;另一种则是将某些集合中的数据进行本地备份,并提供了数据导入的功能
数据备份
在使用MongoPlus进行增删改时,AsyncMultipleWriteInterceptor
将会通过配置的策略(MultipleWriteHandler
),进行异步写入,默认为所有的子数据源写入数据
配置插件
1. 创建写入处理器
java
@Component
public class MongoMultipleWriteHandler extends MultipleWriteHandler {
public MongoMultipleWriteHandler(MongoPlusClient mongoPlusClient) {
super(mongoPlusClient);
}
/**
* 写入策略,返回需要写入数据的数据源名称,不存在则抛出异常
* <p>如果该方法响应数据中存在元素,则直接使用该方法返回值进行写入</p>
* @param currentDataSource 当前数据源名称
* @param namespace 集合命名空间
* @return {@code List<String>} 其他需要写入的数据源名称
*/
@Override
public List<String> multipleWrite(String currentDataSource, MongoNamespace namespace) {
return super.multipleWrite(currentDataSource, namespace);
}
}
2. 创建数据备份插件
java
@Bean
public AsyncMultipleWriteInterceptor multipleWriteInterceptor(MongoPlusClient mongoPlusClient,
MongoMultipleWriteHandler multipleWriteHandler){
// 添加策略
// save时,向test1和test2写入
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.SAVE, Arrays.asList("test1","test2"));
// remove时,向test1和test2写入
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.REMOVE, Arrays.asList("test1","test2"));
// update时,向test1和test2写入
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.UPDATE, Arrays.asList("test1","test2"));
// bulkWrite时,向test1和test2写入
multipleWriteHandler.addMultipleWriteStrategy(MultipleWrite.BULK_WRITE, Arrays.asList("test1","test2"));
return new AsyncMultipleWriteInterceptor(mongoPlusClient,multipleWriteHandler);
}
本地备份
通过BackupManager
即可实现对MongoDB的本地备份。原理是通过分页查询将得到的Document
转换为JSON,写入JSON文件,每页为一个JSON文件,最终打包为zip文件;导入时将zip文件传入,BackupManager
则会删除对应的集合后解包执行添加
java
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);
// 设置每页行数
backupManager.setLimit(1000);
// 设置需要备份的集合,可以通过构建BackupManager的构造参数传递List<String>
backupManager.setCollectionNames(Arrays.asList(User.class, Role.class));
// 设置需要备份的数据源,默认当前数据源
backupManager.setDataSourceName("master");
// 设置备份监听器,每条数据都会回调该方法
backupManager.setBackupListeners((targetPath, collectionName, document) ->
log.info("path: {},collectionName: {},document: {}",
targetPath,
collectionName,
document.toJson()
)
);
// 执行备份
Map<String,String> backupResult = backupManager.export();
backupResult.forEach((key, value) -> System.out.println("collectionName: "+key+"| path: "+value));
// 执行导入
backupManager.imports(".zip");
}
}
通过上述配置方式,即可实现MongoPlus对数据的备份,异步写入