You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python查询MongoDB的Oplog大小?求对应rs.printReplicationInfo()的命令

如何用Python查询MongoDB的Oplog大小?

关于rs.printReplicationInfo()对应的命令

MongoDB Shell中的rs.printReplicationInfo()是封装好的辅助工具,它的底层逻辑是查询local.oplog.rs集合的统计信息、oplog时间范围来生成报告。你可以通过以下两种方式在Python中获取等价的Oplog数据:


方法1:通过replSetGetStatus命令获取Oplog时间范围与估算大小

replSetGetStatus(对应Shell的rs.status())的返回结果里,每个节点的oplog字段包含了Oplog的大小、时间覆盖范围等信息,示例代码如下:

uri = "mongodb://username:password@host:port/admin"
conn = pymongo.MongoClient(uri)
db = conn['admin']

# 获取副本集状态,包含各节点oplog信息
rs_status = db.command({'replSetGetStatus': 1})

# 遍历所有节点,输出oplog详情
for member in rs_status['members']:
    member_name = member['name']
    member_state = member['stateStr']
    oplog_info = member['oplog']
    
    oplog_size_mb = oplog_info['sizeMB']
    oplog_time_range = oplog_info['maxTime'] - oplog_info['minTime']
    oplog_cover_hours = oplog_time_range.total_seconds() / 3600
    
    print(f"节点 {member_name} ({member_state}):")
    print(f"  Oplog大小: {oplog_size_mb:.2f} MB")
    print(f"  Oplog覆盖时长: {oplog_cover_hours:.2f} 小时")
    print("---")

方法2:通过collStats命令查询Oplog集合的精确存储大小

直接查询local数据库下的oplog.rs集合统计信息,能得到更精准的存储占用数据:

uri = "mongodb://username:password@host:port/local"
conn = pymongo.MongoClient(uri)
local_db = conn['local']

# 查询oplog.rs集合的详细统计
oplog_stats = local_db.command({'collStats': 'oplog.rs'})

# 转换单位输出
oplog_size_bytes = oplog_stats['size']
oplog_size_mb = oplog_size_bytes / (1024 * 1024)
oplog_size_gb = oplog_size_bytes / (1024**3)

print(f"Oplog总大小: {oplog_size_bytes} 字节")
print(f"Oplog总大小: {oplog_size_mb:.2f} MB")
print(f"Oplog总大小: {oplog_size_gb:.2f} GB")

结合你现有代码的完整示例

如果要在已有的延迟监控代码中加入Oplog大小查询,可以这样修改:

uri = "mongodb://username:password@host:port/admin"
conn = pymongo.MongoClient(uri)
admin_db = conn['admin']
local_db = conn['local']

# 获取副本集状态,计算节点延迟
rs_status = admin_db.command({'replSetGetStatus': 1})

primary_optime = None
secondary_optime = None
primary_oplog_size = None

for member in rs_status['members']:
    if member['stateStr'] == 'SECONDARY':
        secondary_optime = member['optimeDate']
    if member['stateStr'] == 'PRIMARY':
        primary_optime = member['optimeDate']
        primary_oplog_size = member['oplog']['sizeMB']
        print(f"主节点Oplog大小: {primary_oplog_size:.2f} MB")

if primary_optime and secondary_optime:
    seconds_lag = (primary_optime - secondary_optime).total_seconds()
    print(f"primary_optime: {primary_optime}")
    print(f"secondary_optime: {secondary_optime}")
    print(f"secondary_lag: {seconds_lag} 秒")
else:
    print("未找到主节点或从节点")

# 补充查询Oplog精确存储大小
oplog_stats = local_db.command({'collStats': 'oplog.rs'})
oplog_size_gb = oplog_stats['size'] / (1024**3)
print(f"Oplog精确存储大小: {oplog_size_gb:.2f} GB")

内容的提问来源于stack exchange,提问作者Sanjay M S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:20:32