如何使用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
相关产品推荐
相关产品推荐

