tokumx与mongo在oplog同步更新的差异

    在mongo中,oplog.rs集合没有任何索引,从库像主库查询{ts:{$gte:ts}}时会带有oplog_replay位标识,主库接收到这个位标识就认为是oplog同步查询,并对查询做了以下优化:

    查询过程优化:

1.默认使用从尾到头的查询方式(Oplog同步的数据一般位于尾部).
2.如果在5s内查不到所需要的数据,将按照extent的顺序,向前查找,确定所需要查找的数据所在的extent.
3.找到包含数据的extent之后,将从extent的头开始向后查找,直到找到数据为止.

    按照我们实际的测试,这种同步在机械硬盘可以达到每秒5000条的速度,可以认为在oplog的查询时不存在性能瓶颈.

    mongo的oplog使用定长大小的capped extent优化查询,这使得oplog的记录时间难以得到保证,在tokumx中,oplog不再占用固定大小的空间,而是固定记录天数,实际占用大小与实际操作量有关,在从向主查询更新条目时,mongo使用的优化查询相关的代码被取消,取而代之的是原理更为简洁的索引查询.

    tokumx的oplog中,_id不再是objectId类型,而是BinData类型,字段记录的数据与时间无关,并且递增,从按照{_id:{$gte:_id}}查询,为提高查询效率,tokumx在_id上建立了索引.

    于是在集群间进行数据迁移同步oplog时要做相应修改,并且从某一点开始同步oplog变得不可行.

    实际使用过程中,发现这种单纯按照索引查询的效率并不高,日志中出现几百ms甚至几千ms的oplog慢查询,之后为此优化的余地还很大.

    oplog格式也做了小改动,ts类型由timestamp变为ISOData,op操作放入ops数组.

在JavaMongoDB提供了一个叫做Oplog的功能,它是用于记录集合操作日志的一种机制,这对于复制、备份以及实时数据同步非常有用。如果你想监听MongoDB Oplog事件并在Java应用程序处理它们,你可以使用官方的MongoDB驱动程序MongoDB Java Driver,特别是`org.mongodb:mongodb-driver-monitoring`包的监控API。 首先,你需要添加依赖: ```xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-monitoring</artifactId> <version>4.x.x</version> </dependency> ``` 然后,在代码创建一个MongoClient实例,并启用监控: ```java MongoClientSettings clientSettings = MongoClientSettings.builder() .applyConnectionString("mongodb://your_connection_string") .monitorCommands(true) // 开启命令监控 .build(); MongoClient mongoClient = new MongoClient(clientSettings); MongoDatabase database = mongoClient.getDatabase("your_database"); // 创建一个OplogReader实例来监听oplog changes MongoMonitor monitor = mongoClient.getMongoMonitor(); MongoMonitoringCommandListener commandListener = new MongoMonitoringCommandListener(); monitor.register(commandListener); // 注册监听器 OplogReader oplogReader = database.getCollection("local.oplog.rs").withReadConcern(ReadConcern.MAJORITY).asOplogReader(); oplogReader.forEach(new DocumentChangesCallback() { @Override public void processChange(List<DocumentChange> changes) { for (DocumentChange change : changes) { // 处理每个oplog条目 System.out.println("Change: " + change); } } }); mongoClient.close(); // 关闭连接时记得移除监听 monitor.deregister(commandListener); ``` 在这个例子,我们创建了一个`MongoMonitoringCommandListener`,它会在接收到新的命令响应时触发`processChange`方法。这个监听器会捕获到所有对数据库的操作变更,并允许你在回调函数进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值