本节介绍数据在Snuba中是如何组织的,以及面向用户的数据如何映射到底层数据库(如Clickhouse)。Snuba数据模型横向分为逻辑模型和物理模型。逻辑数据模型通过Snuba查询语言对Snuba客户端可见。此模型中的元素可能会或可能不会1:1映射到数据库中的表。相反,物理模型1:1映射到数据库概念,例如表和视图。这种划分背后的原因是,它允许Snuba通过逻辑数据模型暴露一个稳定的接口,并在内部执行复杂的映射,针对不同的表(物理模型的一部分)执行查询,以一种对客户端透明的方式提高性能.本节的其余部分概述了构成这两个模型的概念以及它们如何相互连接。下面描述的主要概念是数据集、实体和存储。DatasetDataset是Snuba数据的命名空间。它提供自己的模式,并且在逻辑和物理模型方面都独立于其他数据集。数据集的例子有discover(发现)、outcomes(结果)、session(会话)。他们之间没有关系。数据集可以被认为是定义其抽象数据模型和具体数据模型的组件的容器,如下所述。实体和实体类型Snuba向客户公开的逻辑数据模型的基本块是实体。在逻辑模型中,实体表示事务或错误等抽象概念的实例。实际上,一个实体对应于数据库表中的一行。实体类型是实体的类别(例如错误或事务)。逻辑数据模型由一组实体类型及其关系组成。每个实体类型都有一个模式,该模式由具有相关抽象数据类型的字段列表定义。Dataset的所有实体类型(可以有多个)的模式构成了Snuba客户端可见的逻辑数据模型,并且Snuba查询针对该模型进行了验证。不应暴露较低级别的概念。实体类型明确包含在数据集中。一种实体类型不能出现在多个数据集中。数据集中的实体类型在逻辑上是相关的。支持两种类型的关系:实体集关系。这模仿外键。此关系旨在允许实体类型之间的连接。目前只支持一对一和一对多关系。继承关系。这模仿名义上的子类型化。一组实体类型可以共享父实体类型。子类型从它们的超类型继承架构。从语义上讲,父实体类型必须表示其类型继承自它的所有实体的联合。它还必须能够查询父实体类型。这不能只是一种逻辑关系。实体类型和一致性实体类型是Snuba可以提供一些强数据一致性保证的最大单元。具体来说,可以查询期望序列化一致性的实体类型。这不会扩展到任何跨越多个实体类型的查询,在这种情况下,我们最多只能保持最终一致性。这也会对订阅查询产生影响。它们一次只能对一种实体类型起作用,否则它们将需要实体类型之间的一致性,而我们不支持这一点。笔记!准确地说,一致性单元(取决于实体类型)可以更小,并且根据数据摄取主题的分区方式(例如project_id),实体类型是Snuba允许的最大值。存储Storage表示并定义Dataset的物理数据模型。每个Storage表示都具体化为物理数据库概念,例如表或具体化视图。因此,每个存储都有一个由字段及其类型定义的模式,这些字段反映了存储映射到的数据库表/视图的物理模式,并且能够提供所有细节来生成DDL语句以在数据库上构建表。Storage可以将上面讨论的逻辑模型中的逻辑概念映射到数据库的物理概念,所以每个Storage都需要关联一个EntityType。具体来说:每个实体类型必须由至少一个可读存储(我们可以在其上运行查询的存储)支持,但可以由多个存储(例如预聚合物化视图)支持。每个实体类型的多个存储旨在允许查询优化。每个实体类型必须由一个且仅一个可写存储支持,用于摄取数据和填充数据库表。每个存储仅支持一种实体类型。示例本节提供一些示例,说明Snuba数据模型如何表示一些真实世界的模型。这些案例研究不一定反映当前的Sentry生产模型,也不一定属于同一部署。它们必须被视为孤立的例子。单一实体数据集这看起来像哨兵使用的结果数据集。这实际上并没有反映截至2020年4月的成果。尽管设计成果应该朝这个方向发展。数据集只有一个实体类型,表示数据集摄取的单个结果。查询原始结果非常慢,所以我们有两个存储。一种是反映我们摄取的数据的原始存储和计算每小时聚合的物化视图,这样查询效率更高。QueryPlanner将根据是否可以对聚合数据执行查询来选择存储。多实体类型数据集该数据集的一个典型示例是Discover数据集。这具有三种实体类型。错误、事务和它们都继承自事件。这些构成了逻辑数据模型,因此查询Events实体类型给出了Transactions和Errors的联合,但它只允许查询中存在两者之间的公共字段。出于性能原因,错误实体类型由两个存储支持。一个是用于摄取数据的主要ErrorsStorage,另一个是只读视图(read-onlyview),它在查询时对Clickhosue的负载较小,但提供较低的一致性保证。Transactions只有一个存储,有一个MergeTable来服务Events(本质上是两个表的联合视图)。连接实体类型这是一个简单数据集的示例,其中包含可以在查询中连接在一起的多个实体类型。GroupedMessage和GroupAssingee可以是带有错误的左连接查询的一部分。其余部分与前面示例中讨论的内容类似。
