Trino集群监控指标盘点

377 阅读4分钟

当我们部署了一个Trino服务集群时,我们需要去采集一些指标去实时的关注这个集群的健康状态,看是否有什么异常。还可以通过这些指标分析当前集群在哪方面存在瓶颈以及帮助排查线上问题。总的来说,监控告警对于一个服务集群来说是必不可少的。具体可以分为下面几个大类:

1. 集群状态

集群中最重要的就是各个节点是否存活,如果有任何节点死去,都会对集群造成很大的影响。因此需要实时监控ResourceManager, Coordinator, Worker的个数,但凡有一个出现了波动,都要进行告警。

2. 查询历史

在这一分类中我们可以关注这个集群在查询维度的一些表现,包括当前集群有多少正在执行的查询数,集群总共及各个worker上正在执行的split个数,能帮我们了解当前集群和worker上的运行压力。一分钟内或者指定时间区间内完成的查询数,查询失败个数,包括不同原因的失败个数(内部原因失败,外部原因失败,资源不足导致的失败和用户失败)。 可以帮助我们及时发现集群是否出现问题。还有每个查询的一些具体信息,包括totalCpuTime, executinTime和rawInputDataSize等。

3. 集群资源

这个分类主要统计集群的内存,CPU等会影响到集群性能的资源指标。当某一时间段内查询失败数过多,可以通过这些指标判断是不是某些资源达到瓶颈导致的。

如果我们的集群是部署在k8s上,那么可以把POD的内存使用量,使用率,CPU的使用量,使用率,以及网络传输速率等都加入到监控中。还有Trino每个节点都有个MemoryPool来统计内存的使用(具体这个MemoryPool是如何统计的可以看我之前写的那篇分享),我们也可以把MemoryPool的信息也加入到监控指标中。经常当POD发生重启时,我们都可以通过这些指标排查到是否是因为内存使用超了导致的。

4. JVM信息

Trino是Java语言实现的,因此JVM也是需要我们关注的点,Trino内部会通过JMX connector去统计很多JVM的信息,包括堆内存和非堆内存的初始值,使用量,最大值,young GC, old GC发生的次数和时间,以及eden区,survivor区和old区的初始值,最大值和使用量等。

5. 第三方依赖

我们的服务免不了和第三方依赖打交道,包括去读元数据信息,读取ORC数据等,这些都需要我们自己从代码中打点增加指标,可以采集一下每个操作的耗时,成功率,读取数据的速率等。这些指标也特别重要,当被质疑查询很慢时,可以通过这些指标排查是因为第三方依赖响应时间过长还是因为自身的问题。有利于甩锅。

6. QueryTimeLine

在每一个查询结束的时候,Trino都会打印这个查询各阶段的耗时,包括schedulingTime, planningTime, ElapsedTime, inputBlockedTime等,这些信息都是非常有帮助的,特别是查询出现超时,可以通过这些指标判断是哪个阶段耗时过多导致超时的。

7. 其他

上面说的都是一些比较通用的,还有一些指标主要看具体代码实现,比如如果代码里面增加了一些缓存,那可以增加一些代码缓存命中率的监控,还有线程池的监控,每个线程池当前有多少正在执行的线程以及有多少正在排队的任务。

总结

以上都是在实际应用中的一些总结,利用好监控能很好的帮助我们了解集群状态和排查问题,是非常重要的手段。当然随着业务发展和集群优化,会有更多的指标需要被监控,这都是一个逐步优化的过程。