Scrub: Online TroubleShooting for Large Mission-Critical Applications

针对极致的性能需求,对故障排除的query相关进行了优化。

Scrub是一个新的故障排除工具,适用于大型关键任务的分布式应用,在Turn的广告竞价系统中使用。 与类似的工具非常相似,Scrub允许用户对系统中的事件进行类似SQL的查询,以评估其正确的操作。 Scrub是由开发者和用户共同使用的,所以查询的内容相当多样,查询的负荷有时也相当大。 Scrub的关键设计目标,也是它与现有系统的区别,是对应用的最小干扰,即使是在高查询负荷下

Scrub为应用开发者提供了一个定义和生成事件的API,并支持故障排除者用查询语言来表达对这些事件的查询。

QUERY LANGUAGE

Events

在Scrub中,一个事件是一个由用户定义的字段组成的n元组。 此外,Scrub用两个系统字段来注释事件,一个唯一的请求标识符和一个时间戳。

一个事件的定义需要两个参数:事件类型(一个字符串标签),和一个字段及其数据类型的列表。 Scrub支持的字段类型有:布尔型、int、long、float、double、日期/时间、字符串,以及这些原始类型的同质化列表。 此外,Scrub还支持嵌套对象,例如XML编码的对象。其他的数据类型可以随着系统的发展而增加。

应用程序通过Scrub API log(),定义了代码中某一类型的事件可以在哪里生成。

Query Language

主要是需要实现query span、target host、sampling

QUERY EXECUTION

Data Collectors

Scrub的主要查询优化目标是尽量减少对目标系统的主机的影响。 为了实现这一目标,Scrub偏离了传统的查询操作策略,即尽可能地将操作移到数据或数据产生的地方。

join、group和aggregation是在一个专门的中央设施ScrubCentral进行的,而不是在主机上。 只有selection和projection发生在主机上,因为它们减少了要发送到ScrubCentral的数据量。

Joins

join是在ScrubCentral中进行的。Scrub支持属于同一请求的事件之间的equi-join,即使它们是由不同的主机生成的。 为此,Scrub数据收集器用一个请求标识符对事件进行注释,该标识符被用作join key。

Scrub join被实现为内存哈希join。因为只根据request identifier进行join,所以不需要stream join中使用的时间窗口。

Implementation

有几个注意的点。

Query objects are sent to the hosts to instruct the data collectors which data to collect. 看起来是先query再collect。

用accuracy换performance。

DISCUSSION

主要是和现有系统的对比。

Pivot Tracing

scrub只forward identifier。Pivot Tracing允许an arbitrary set of attributes to be carried forward。

此外,scrub只在host上做selection and projection。pivot tracing靠近数据侧。

Dynamic Instrumentation

Scrub要求开发者通过调用log()方法来指明在他们的代码中必须发生记录的地方。 dynamic tracing的优点是,记录可以在运行时附加到程序中的任何方法,而不需要修改源代码。

但是dynamic tracing的开销大、安全性低。