SkyWalking的OAP(ObservabilityAnalysisPlatform,观察分析平台)是一个针对链路数据的分布式计算系统。由于其巧妙的设计,在链路数据计算和聚合过程中,无需考虑数据一致性,也没有事务、分布式锁等概念。极端情况下可能会丢失链路数据,但会最大程度保证OAP集群的可用性。下面我们来看看它是如何设计的,为以后的系统设计和架构提供一些思路。数据类型在介绍分布式计算之前,我们先了解一下需要计算的数据类型:记录数据,即详细数据,如Trace、访问日志等,由RecordStreamProcessor处理。Metrisc数据,即指标数据,由大多数OAL指标生成,由MetricsStreamProcessor处理。TopN数据,即周期性采样的数据,比如慢SQL的周期性采集,由TopNStreamProcessor处理。分布式计算Trace、accesslog等详细数据,数据量比较大,但不需要合并,可以在OAP节点内完成。通过缓存、异步批处理、流式写入等方式将明细数据写入存储。OAL(ObservabilityAnalysisLanguage,可观察性分析语言)定义的指标数据大部分需要分布式聚合计算,因此OAP集群计算流程分为两步。Step1:接收并解析probe发送过来的数据,在当前OAP节点进行数据聚合,使用OAL或者其他聚合方式。如果是不需要分布式聚合的数据,直接写入存储;如果是需要分布式聚合的数据,则按照一定的路由规则发送到指定的OAP节点。Step2:接收并解析Step1处理后的数据,然后进行二次聚合计算,写入存储。因为以上两个步骤很可能不在同一个OAP节点上,所以OAP节点分为两个角色:Receiver(步骤1)和Aggregator(步骤2)。为了降低部署难度,所有OAP节点默认都会使用Mixed角色(步骤1和步骤2都可以执行)。在大规模部署时,可以根据网络流量进行角色分离的两级部署。指标数据是最消耗计算资源的分布式计算,也是整套分布式计算应该支持的核心计算类型。在这个计算过程中,使用哈希路由策略,根据计算出的实体的哈希值,如服务ID、端点ID,来选择对应的OAP节点。OAP节点之间的通信采用gRPC流方式。传输过程中不包含业务字段名,根据数据类型和字段定义顺序进行序列化,减少非数据字段的传输。注:本文以SkyWalking8.2.0版本为例,不同版本会有细微差异。最后谢谢大家的喜欢和关注,帅气又漂亮。
