集群性能监控

    • 客户端连接数反映了应用系统与集群建立的连接数量,可以使用以下命令查看:

    • getCoordConn.js内容如下:

      1. var nodes = db.list(7,{GroupName:"SYSCoord"},{"Group.HostName":1,"Group.Service.Name":1}).next().toObj()["Group"];
      2. var sum = 0;
      3. for(var i in nodes){
      4. var node = nodes[i];
      5. sum += new Sdb(node["HostName"],node["Service"][0]["Name"]).snapshot(6,{},{"TotalNumConnects":1}).next().toObj()["TotalNumConnects"];
      6. }
      7. println("集群客户端连接数:"+sum);

    连接会消耗文件句柄和内存资源,并发量过大还会导致线程上下文的频繁切换。如果该指标高于预期值,表明用户请求量超过了数据库处理请求的能力;当数据节点压力不大时,可以增加协调节点提高并发量,否则需要对集群进行扩容。

    数据库连接的创建是比较耗时的操作,应用程序频繁创建销毁,未关闭连接也有可能导致连接数过高,建议使用驱动程序中的数据库连接池进行连接管理,连接池允许应用程序更有效地使用和重用连接。

    数据和索引的访问次数,如果指标值偏低,建议应用配置会话为读写分离模式,如果DataRead值远高于IndexRead的值,可能会话中有未通过索引检索,直接进行表扫描的查询,通过使用sdbtop工具的会话统计界面,查出DataRead高的会话, 检查该查询是否有命中的索引。其次,查看该查询的访问计划,查看用户请求在每个数据节点的索引命中情况和返回记录条数,如果在某些节点的 ScanType 为 tbscan ,则有可能是部分节点索引缺失导致未命中索引,如果各节点返回记录条数差距过大,则有可能是分区键选择不合理,导致热点数据。

    • DataWrite和 IndexWrite

    数据和索引的写入次数,如果指标值偏低,检查应用程序,确认能否将单条插入改写成批量插入的方式。其次如果观察到数据节点磁盘 io 偏高,建议增加集合的分片数量,将 io 压力分担到其他磁盘。或考虑使用 SSD 磁盘替换 SAS 或 SATA 盘。

    • snapshot命令可以查看当前节点副本集同步状态,命令如下:

    • 输出实例:

      1. {
      2. "LSNQueSize": 0,
      3. }
      4. {
      5. "LSNQueSize": 0,
      6. "DiffLSNWithPrimary": 0
      7. }
      8. {
      9. "LSNQueSize": 0,
      10. "DiffLSNWithPrimary": 0
    • DiffLSNWithPrimary: 与主节点的 LSN 差异

    通过以上两个指标,可以看出集群数据复制组间副本集数据同步的压力,如果两个指标长期较高,需要检查复制组间网络状态。

    • snapshot命令可以查看当前节点运行状态,命令如下:

    • 输出实例:

      1. "ServiceStatus": true,
      2. "SyncControl": false
      3. }
      4. {
      5. "ServiceStatus": true,
      6. "SyncControl": false
      7. }
      8. {
      9. "ServiceStatus": true,
      10. }