
168
|
第
16
章
无论是基于行还是基于列的方法都不能完全满足可观测性的功能需求。为了解决行存储
和列存储的权衡问题,混合方法
—
利用两者的优点
—
可以满足可观测性所需的链路
追踪工作负载类型。混合方法允许你有效地执行行和列的部分扫描。请记住,对于可观
测性工作负载来说,查询结果的快速返回比它们的完美更重要。
为了说明如何实际实现这种平衡,我们将研究
Honeycomb
的存储引擎的架构,它代表
了实现这些功能要求的一种方式。
16.2 案例研究:Honeycomb 的列式数据存储实现
在本节中,我们将解释
Honeycomb
的列式数据存储(又称
Retriever
)的实现,以说明如
何用类似的设计来满足可观测性的功能需求。这个参考架构并不是实现这些功能需求的
唯一方法;如前所述,你可以使用
ClickHouse
或
Druid
作为基础来构建一个可观测性后
端。然而,我们希望能够说明具体的实现和操作上的权衡,否则你无法在理论模型的抽
象讨论中看到这些。
16.2.1
按时间分区存储
早些时候,当讨论基于行的存储与基于列的存储的挑战时,我们提出了一种混合方法,
即按时间戳划分搜索空间以减少搜索空间。然而,分布式系统中的时间从来都不是完全
一致的,链路追踪
span
的时间戳可能是
span
的开始时间,而不是结束时间,这意味着
数据的到达时间可能比当前时间晚几秒钟或几分钟。将手伸向已经保存在磁盘上的字
节,在中间插入记录是没有意义的,因为这将产生重写数据的费用。你到底应该如何进
行分区,以使其在面对数据的无序到达时有效和可行?
你可以做的一个优化是假设事件的到达时间可能与它们实际产生的时间戳相近,并且你 ...