mongodb oplog java_mongodb oplog与数据同步

1. 复制集(Replica sets)模式时,其会使用下面的local数据库

local.system.replset 用于复制集配置对象存储 (通过shell下的rs.conf()或直接查询)

local.oplog.rs 一个capped collection集合.可在命令行下使用--oplogSize 选项设置该集合大小尺寸.

local.replset.minvalid 通常在复制集内使用,用于跟踪同步状态(sync status)

2. 主从复制模式(Master/Slave)

* Master

o local.oplog.$main 存储"oplog"信息

o local.slaves 存储在master结点上相应slave结点的同步情况(比如syncTo时间戳等)

* Slave

o local.sources 从结点所要链接的master结点信息(可通过--source配置参数指定)

* Other

o local.me 未知待查:)

o local.pair.* (replica pairs选项,目前已不推荐使用)

3. 还有oplog的数据结构(存储在local.oplog.$main)

{ ts : ..., op: ..., ns: ..., o: ... o2: ... }

上面就是一条oplog信息,复制机制就是通过这些信息来进行节点间的数据同步并维护数据一致性的,其中:

ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。

这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary。

op:1字节的操作类型,例如i表示insert,d表示delete。

ns:操作所在的namespace。

o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)

o2: 在执行更新操作时的where条件,仅限于update时才有该属性

其中op,可以是如下几种情形之一:

"i": insert

"u": update

"d": delete

"c": db cmd

"db":声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')

"n": no op,即空操作,其会定期执行以确保时效性

ts: the time this operation occurred.

h: a unique ID for this operation. Each operation will have a different value in this field.

op: the write operation that should be applied to the slave. n indicates a no-op, this is just an informational message.

ns: the database and collection affected by this operation. Since this is a no-op, this field is left blank.

o: the actual document representing the op. Since this is a no-op, this field is pretty useless.

for the update, there are two o fields (o and o2). o2 give the update criteria and o gives the modifications (equivalent to update()‘s second argument).

4. 同步系统设计

e1e8dfc28243d314150a8a45a38e197c.png

mongoDB oplog的说明:

如果需要及时获取mongoDB的增量信息,就可以应用oplog了!

常用的场景模式:索引更新,主动更新缓存等。

通常一个服务监控oplog,将“增量信息”经过一定的处理后塞到ActiveMQ中,相关的应用程序再从ActiveMQ中获取消息进行消费。

注意点:

1)如果当前服务断掉了,要有个断点机制,下次可以接着来。这个主要是对ts字段进行控制。

因此需要实时记录读到了什么位置。

2)如果应用端是异构的,采用一种跨语言的协议,例如json。

3)消息中间件(ActiveMQ)起到解耦、缓冲的作用。

要统计 MongoDB Oplog 中各表项数据,可以使用以下步骤: 1. 连接到 MongoDB 数据库,并打开 Oplog。 2. 执行一个聚合查询来获取 Oplog 中所有操作的列表。可以使用 `$match` 过滤出指定时间范围内的操作。 3. 对于每一个操作,获取操作的名称和操作涉及的表格名称。可以从操作的 `op` 字段中获取操作名称,从操作的 `ns` 字段中获取表格名称。 4. 对于每一个表格,统计其涉及的操作数量。可以使用 `$group` 聚合操作来实现。 以下是一个示例代码,可以帮助你实现这个过程: ```python from pymongo import MongoClient # 连接到 MongoDB 数据库 client = MongoClient('mongodb://localhost:27017/') # 打开 Oplog oplog = client.local.oplog.rs # 聚合查询,获取 Oplog 中所有操作的列表 query = [ {"$match": {"ts": {"$gt": 1614556800, "$lt": 1617158400}}}, {"$project": {"_id": 0, "op": 1, "ns": 1}} ] cursor = oplog.aggregate(query) # 统计每一个表格涉及的操作数量 table_ops = {} for doc in cursor: op = doc["op"] table = doc["ns"].split(".", 1)[1] if table not in table_ops: table_ops[table] = {} if op not in table_ops[table]: table_ops[table][op] = 0 table_ops[table][op] += 1 # 打印结果 for table, ops in table_ops.items(): print(table) for op, count in ops.items(): print(f" {op}: {count}") ``` 在上面的代码中,我们首先连接到 MongoDB 数据库,并打开 Oplog。然后执行了一个聚合查询,获取指定时间范围内 Oplog 中所有操作的列表。接下来,我们对每一个操作,获取操作的名称和操作涉及的表格名称,并统计每一个表格涉及的操作数量。最后,我们打印了结果,以便查看每一个表格的操作数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值