tablet可用性监控与统计

基于tablet维度,给出系统可用性指标。

tablet有多种状态,只有ready状态的tablet才可以正常提供服务(read、write、scan等), tablet会在各种状态间迁移(例如负载均衡),迁移时,tablet会有短时间(正常情况是秒级)不可服务, 我们认为不可服务时间到达一定阈值(例如30s)的tablet处于不可用状态,这个阈值与使用场景紧密相关。

数据采集

  1. t1 t2
  2. tablet-a | <-not-ready-> |
  3. tablet-b | <-not-ready--------|---->
  4. tablet-c | |
  5. tablet.. | |

tablet状态的迁移由master控制, master用std::map<std::string, int64_t>结构采集tablet状态数据, std::map中std::string即tablet的path,是tablet全局唯一的id;int64_t即not-ready的开始时间。

当一个tablet状态迁移为not-ready时,master将<tablet->GetPath(), current_time>记录在std::map里, 在这个tablet恢复ready时再从map中删除掉。

master重启时可以恢复这个内存结构,所以不用持久化。

持久化的数据

master在定时任务(例如小时一次)里通过上述std::map计算过去一小时中,tablet不可用总时间(秒级)和tablet应服务总时间,并存入stat表。

tablet不可用总时间:例如tablet-a不可用5s,tablet-b不可用10s,那么过去1小时内,tablet总的不可用时间为15s;

在定时任务里,上述std::map里可以找到当前非ready状态的tablet(如图中tablet-b),采集它们的不可用时间; 还有部分tablet在定时任务之前已经恢复ready(如图中tablet-a),我们在将其从std::map中删除时,用counter累计它们在这一小时内不可用时间。

tablet应服务总时间:例如执行定时任务时总共有1000个tablet,那么过去1小时应服务总时间近似为 1000 60 60s.

分析计算

  • 当前可用tablet比例(%)[master定时任务,数据采集时顺便完成]

    • 当前可用tablet比例 = 1 - 不可用tablet数/总tablet数
    • 不可用tablet数:master定时检查map中not-ready的tablet,如果not-ready达到一定阈值判定为不可用,计为1个不可用tablet
    • 总tablet数:通过tablet_manager获取
  • 过去1h/1d/1m/1y的可用性 [teracli功能]

    • 每小时可用性数据已由master存入stat表;
    • teracli读stat表,获取原始数据,进行计算,给出过去1h/1d/1m/1y的可用性数据。
    • 过去1h可用性 = 1 - tablet不可用总时间/tablet应服务总时间

FAQ

  • master挂掉导致的数据缺失?
    • master控制tablet状态的迁移,除非集群接近崩溃否则tablet状态不会大规模变化。
    • 如果master有0.1%的时间不可用,那么损失0.1%的原始数据,对可用性计算影响不大。当master长时间不可用时,系统已不工作,可用性统计失去意义。