Skip to content

MongoDB 分片集群指标

分片集群是 MongoDB 处理大规模数据的核心架构,由分片(Shard)、路由服务器(mongos)和配置服务器(Config Server)组成。监控分片集群需要关注各个组件的关键指标,以确保集群的健康运行和最佳性能。

分片(Shard)指标

复制集指标

分片通常是一个复制集,因此需要监控复制集相关指标:

  • oplog 窗口大小db.serverStatus().repl.oplogWindowSecs

    • 表示 oplog 可以维持的时间窗口,单位为秒
    • 建议保持在 24-72 小时,确保副本集成员可以赶上主节点
  • 复制延迟db.serverStatus().repl.lagMillis

    • 副本集成员与主节点的延迟时间,单位为毫秒
    • 建议设置告警阈值为 1000ms
  • 复制集状态rs.status()

    • 监控复制集的健康状态,包括成员角色、心跳状态等

分片存储指标

  • 数据大小db.collection.stats().size

    • 集合的数据大小,不包括索引
  • 索引大小db.collection.stats().totalIndexSize

    • 集合的索引大小
  • 存储使用率db.serverStatus().storageEngine.cache[0].bytesUsed / db.serverStatus().storageEngine.cache[0].bytesConfigured

    • WiredTiger 缓存使用率,建议保持在 80% 以下

分片性能指标

  • 每秒查询数db.serverStatus().opcounters.query

    • 每秒执行的查询操作数
  • 每秒写入数db.serverStatus().opcounters.insert + db.serverStatus().opcounters.update + db.serverStatus().opcounters.delete

    • 每秒执行的写入操作数
  • 连接数db.serverStatus().connections.current

    • 当前活跃连接数,不应超过配置的最大连接数

路由服务器(mongos)指标

连接指标

  • 活跃连接数db.serverStatus().connections.current

    • mongos 节点当前的活跃连接数
  • 连接使用率db.serverStatus().connections.current / db.serverStatus().connections.available

    • 连接使用率,建议保持在 70% 以下

路由性能指标

  • 每秒请求数db.serverStatus().metrics.operation.executionTime

    • mongos 每秒处理的请求数量
  • 查询延迟db.serverStatus().metrics.operation.executionTime

    • 查询的平均执行时间,单位为毫秒
  • 分片选择耗时db.serverStatus().metrics.routeConfigRefresh.totalDurationMillis

    • mongos 刷新路由配置的耗时

缓存指标

  • 元数据缓存大小db.serverStatus().metrics.mongos.metadataCache.size

    • mongos 缓存的分片元数据大小
  • 缓存命中率db.serverStatus().metrics.mongos.metadataCache.hits / (db.serverStatus().metrics.mongos.metadataCache.hits + db.serverStatus().metrics.mongos.metadataCache.misses)

    • 元数据缓存命中率,建议保持在 95% 以上

配置服务器(Config Server)指标

配置服务器状态

  • 复制集状态rs.status()

    • 配置服务器复制集的健康状态
  • 配置数据大小db.config.chunks.stats().size + db.config.collections.stats().size + db.config.shards.stats().size

    • 配置数据的总大小

配置服务器性能

  • 配置更新频率db.serverStatus().opcounters.update

    • 配置服务器每秒处理的更新操作数
  • 配置读取频率db.serverStatus().opcounters.query

    • 配置服务器每秒处理的查询操作数

分片集群整体指标

分片键分布

  • 块分布均匀性sh.status()

    • 检查各个分片上的块数量是否均匀分布
    • 理想情况下,块数量差异不应超过 10%
  • 块大小db.config.chunks.aggregate([{ $group: { _id: null, avgSize: { $avg: "$jumbo" } } }])

    • 平均块大小,建议保持在配置的块大小附近(默认 64MB)

迁移指标

  • 迁移状态db.adminCommand({ currentOp: true, $query: { $or: [{ type: "op" }, { ns: /^config\.system\.indexBuilds$/ }] } })

    • 监控正在进行的数据迁移
  • 迁移速率db.serverStatus().metrics.sharding.chunkSkipsPerSecond

    • 每秒跳过的块数量,反映迁移效率
  • 迁移失败率db.serverStatus().metrics.sharding.chunkMoveFailed

    • 块迁移失败的数量

分片集群健康状态

  • 集群状态sh.status()

    • 查看整个分片集群的配置和状态
  • 均衡器状态sh.getBalancerState()

    • 检查均衡器是否正在运行
  • 均衡器窗口sh.getBalancerWindow()

    • 查看均衡器的运行窗口设置

监控工具与实践

MongoDB Atlas 监控

  • 提供分片集群的全面监控面板
  • 支持自定义告警规则
  • 自动收集和可视化关键指标

Ops Manager 监控

  • 企业版 MongoDB 的监控解决方案
  • 支持分片集群的详细监控和管理
  • 提供性能分析和优化建议

第三方监控工具

  • Prometheus + Grafana

    • 使用 MongoDB Exporter 收集指标
    • 支持自定义仪表盘和告警
    • 适合大规模分片集群监控
  • Datadog

    • 提供 MongoDB 分片集群的专用集成
    • 支持自动发现和监控
    • 提供性能异常检测

监控最佳实践

  1. 设置合理的告警阈值

    • 根据业务需求和集群规模调整阈值
    • 重点关注复制延迟、连接使用率、存储使用率等关键指标
  2. 定期分析指标趋势

    • 建立基线性能数据
    • 监控指标的长期变化趋势
    • 预测资源需求和性能瓶颈
  3. 结合日志分析

    • 将指标监控与日志分析相结合
    • 快速定位性能问题的根本原因
    • 分析慢查询和错误日志
  4. 监控均衡器活动

    • 避免在业务高峰期运行均衡器
    • 监控均衡器的运行状态和效率
    • 定期检查块分布情况

常见问题与解决方案

问题:分片集群性能下降

可能原因

  • 某个分片负载过高
  • 块分布不均匀
  • mongos 缓存命中率低
  • 网络延迟高

解决方案

  • 检查各分片的负载情况,考虑增加分片
  • 手动触发均衡器或调整分片键
  • 增加 mongos 节点数量
  • 优化网络配置,减少延迟

问题:块迁移频繁失败

可能原因

  • 分片间网络不稳定
  • 目标分片资源不足
  • 存在超大块(jumbo chunk)

解决方案

  • 检查网络连接和防火墙设置
  • 增加目标分片的资源
  • 手动拆分超大块
  • 调整块大小配置

问题:mongos 响应缓慢

可能原因

  • 元数据缓存失效
  • 配置服务器负载过高
  • mongos 节点数量不足

解决方案

  • 重启 mongos 节点刷新缓存
  • 增加配置服务器的资源
  • 增加 mongos 节点数量
  • 优化配置服务器的性能

常见问题(FAQ)

Q1: 如何监控分片集群的整体健康状态?

A1: 使用 sh.status() 命令可以查看整个分片集群的配置和状态,包括分片、数据库、集合的分片情况以及块分布。同时,结合复制集状态、性能指标和均衡器状态,可以全面评估集群健康状况。

Q2: 哪些指标是分片集群监控的重点?

A2: 分片集群监控的重点指标包括:复制延迟、存储使用率、连接数、查询延迟、块分布均匀性、均衡器状态和迁移成功率。这些指标直接反映了集群的性能和可靠性。

Q3: 如何优化分片集群的监控?

A3: 优化分片集群监控的方法包括:设置合理的告警阈值、结合多种监控工具、定期分析指标趋势、监控均衡器活动、结合日志分析以及建立性能基线。这些实践可以帮助及时发现和解决性能问题,确保集群的稳定运行。

Q4: 如何处理块分布不均匀的问题?

A4: 块分布不均匀可能导致部分分片负载过高。解决方案包括:检查并调整分片键设计、确保均衡器正常运行、在业务低峰期运行均衡器、手动触发均衡器或拆分超大块。

Q5: 如何监控 mongos 节点的性能?

A5: 监控 mongos 节点性能的关键指标包括:活跃连接数、查询延迟、缓存命中率、配置刷新耗时和请求处理速率。可以使用 MongoDB 内置的监控命令、MongoDB Atlas、Ops Manager 或第三方工具(如 Prometheus + Grafana)来收集和可视化这些指标。