介绍
不只是 OpenTelemetry虽然我们建议使用 OpenTelemetry (OTel) 项目进行数据采集,但也可以使用其他框架和工具构建类似的架构,例如 Vector 和 Fluentd (请参阅使用 Fluent Bit 的示例) 。此外,也有其他可视化工具可供选择,包括 Superset 和 Metabase。
为什么使用 ClickHouse?
- 压缩 - 可观测性数据通常包含一些字段,其取值来自有限的集合,例如 HTTP 状态码或服务名称。ClickHouse 的列式存储会将值按序存放,因此这类数据的压缩效果非常好;若再结合一系列面向时间序列数据的专用 codec,效果会更佳。与其他数据存储不同,后者通常需要接近原始数据大小的存储空间,而这些数据往往采用 JSON 格式;ClickHouse 对日志和链路追踪的平均压缩率最高可达 14 倍。除了能为大规模可观测性部署显著节省存储成本外,这种压缩还可以加快查询速度,因为需要从磁盘读取的数据更少。
- 快速聚合 - 可观测性解决方案通常高度依赖图表进行数据可视化,例如展示错误率的折线图或展示流量来源的柱状图。聚合,也就是 GROUP BY,是支撑这些图表的核心能力;而且在问题诊断流程中应用过滤器时,这些图表也必须保持快速响应。ClickHouse 的列式格式结合向量化查询执行引擎,非常适合快速聚合;同时,稀疏索引也能在用户操作后快速过滤数据。
- 快速线性扫描 - 虽然其他技术依赖倒排索引来实现日志的快速查询,但这往往会带来较高的磁盘和资源消耗。尽管 ClickHouse 也提供倒排索引作为一种可选的附加索引类型,但线性扫描本身具备高度并行化能力,并会使用机器上的所有可用 CPU 核心 (除非另有配置) 。这意味着它有可能以每秒数十 GB (压缩后) 的速度扫描数据以查找匹配项,并使用高度优化的文本匹配运算符。
- SQL 的熟悉度 - SQL 是所有工程师都熟悉的通用语言。经过 50 多年的发展,它已经证明自己是数据分析领域的事实标准语言,并且仍然是第 3 大最流行的编程语言。可观测性本质上也只是另一类数据问题,而 SQL 正是解决这类问题的理想工具。
- 分析函数 - ClickHouse 在 ANSI SQL 的基础上扩展了分析函数,让 SQL 查询更简单、更易于编写。如果你要执行根因分析,需要对数据进行多维切片和深入剖析,这些函数就至关重要。
- 次级索引 - ClickHouse 支持次级索引,例如布隆过滤器,可用于加速特定查询模式。这些索引可以按列选择性启用,从而为用户提供细粒度控制,并让他们评估其中的成本收益。
- 开源与开放标准 - 作为开源数据库,ClickHouse 拥抱 OpenTelemetry 等开放标准。既可以参与贡献并积极投身相关项目,也能避免供应商锁定带来的挑战,这一点颇具吸引力。
何时应使用 ClickHouse 做可观测性
- 你或你的团队成员熟悉 SQL (或希望学习 SQL)
- 你倾向于遵循 OpenTelemetry 等开放标准,以避免厂商锁定并获得扩展性。
- 你愿意采用一套从采集到存储再到可视化、由开源创新驱动的生态系统。
- 你预计所管理的可观测性数据量会增长到中等或大型规模 (甚至超大规模)
- 你希望掌控 TCO (总拥有成本) ,避免可观测性成本不断攀升。
- 你无法接受,或不希望仅仅为了控制成本,就把可观测性数据的保留期压得很短。
- 学习 SQL (或生成 SQL!) 对你或你的团队成员没有吸引力。
- 你想要的是一套打包好的端到端可观测性体验。
- 你的可观测性数据量太小,不足以带来明显差异 (例如 <150 GiB) ,且预计不会增长。
- 你的用例以指标为主,并且需要 PromQL。在这种情况下,你仍然可以将 ClickHouse 用于日志和链路追踪,将 Prometheus 用于指标,并通过 Grafana 在展示层统一呈现。
- 你更愿意等待生态系统进一步成熟,以及基于 SQL 的可观测性变得更加开箱即用。
日志和链路追踪
- 日志 - 日志是系统内发生事件的带时间戳记录,用于记录软件运行过程中各个方面的详细信息。日志中的数据通常是非结构化或半结构化的,可能包括错误消息、用户活动日志、系统变更以及其他事件。日志对于故障排查、异常检测,以及理解系统中问题发生前的具体事件至关重要。
- 链路追踪 - 链路追踪用于记录请求在分布式系统中穿越不同服务时的完整过程,详细呈现这些请求的路径和性能。链路追踪中的数据具有高度结构化的特点,由 span 和 trace 组成,用于刻画请求经历的每一个步骤,包括耗时信息。链路追踪能够为系统性能提供宝贵洞察,帮助识别瓶颈、延迟问题,并优化微服务的运行效率。
指标虽然 ClickHouse 可用于存储指标数据,但这一支柱在 ClickHouse 中的成熟度相对较低,对 Prometheus 数据格式和 PromQL 等功能的支持仍在完善中。