专栏首页黑客下午茶Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)

Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)

系列

Snuba 是一种在 Clickhouse 之上提供丰富数据模型以及快速摄取消费者(直接从 Kafka 获取数据)和查询优化器的服务。

Snuba 最初的开发目的是取代 PostgresRedis 的组合,以搜索和提供有关 Sentry 错误的聚合数据。从那时起,它已经演变成目前的形式,在多个数据集上支持大多数与时间序列相关的 Sentry 功能。

功能

  • Clickhouse 分布式数据存储提供数据库访问层。
  • 提供一个图形逻辑数据模型,客户端可以通过 SnQL 语言查询,该语言提供类似于 SQL 的功能。
  • 在单个安装中支持多个单独的数据集。
  • 提供基于规则的查询优化器。
  • 提供一个迁移系统,将 DDL 更改应用于单节点和分布式环境中的 Clickhouse
  • 直接从 Kafka 摄取数据
  • 支持时间点查询和流式查询。

Sentry 中的一些用例:

  • events 数据集为 Issue Page 等功能提供支持。此处的搜索功能由 Snuba 以及所有聚合(aggregation)函数提供支持。
  • discover 数据集为所有性能监控(Performance Monitoring)相关功能提供支持。
  • sessions 数据集为发布(Releases)功能提供支持。具体来说,该数据集会摄取大量数据点并存储预先聚合的数据,以允许对大量数据进行快速查询。
  • outcomes 数据集为统计页面(Stats page)提供支持。

开始使用 Snuba

这是在 Sentry 开发环境中快速启动 Snuba 的指南。

必要条件

Snuba 假设如下:

  1. 一个 Clickhouse 服务器端点位于 CLICKHOUSE_HOST(默认 localhost)。
  2. REDIS_HOST(默认 localhost)上运行的 redis 实例。在端口 6379 上。

让这些服务运行的快速方法是设置 sentry,然后使用:

sentry devservices up --exclude=snuba

请注意,Snuba 假设一切都在 UTC 时间运行。否则,您可能会遇到时区不匹配的问题。

Sentry + Snuba

~/.sentry/sentry.conf.py 中添加/更改以下几行:

SENTRY_SEARCH = 'sentry.search.snuba.EventsDatasetSnubaSearchBackend'
SENTRY_TSDB = 'sentry.tsdb.redissnuba.RedisSnubaTSDB'
SENTRY_EVENTSTREAM = 'sentry.eventstream.snuba.SnubaEventStream'

运行:

sentry devservices up

访问原始 clickhouse client(类似于 psql):

docker exec -it sentry_clickhouse clickhouse-client

数据写入表 sentry_local: select count() from sentry_local;

设置

设置可以在 settings.py 中找到

  • CLUSTERS:提供集群列表以及应该在每个集群上运行的主机名(hostname)、端口(port)和存储集(storage sets)。每个集群也设置了本地与分布式(Local vs distributed)。
  • REDIS_HOSTredis 正在运行此处。

Snuba 架构概述

Snuba 是一个由 Clickhouse 支持的面向时间序列的数据存储服务,它是一个列式存储分布式数据库,非常适合 Snuba 服务的查询类型。

  • https://clickhouse.tech/

数据完全存储在 Clickhouse 表和物化(materialized)视图中,它通过输入流(目前只有 Kafka topic)摄取,并且可以通过时间点查询或流式查询(subscriptions)进行查询。

存储

之所以选择 Clickhouse 作为后备存储,是因为它在 Snuba 需要的实时性能、分布式和复制性质、存储引擎方面的灵活性和一致性保证之间提供了良好的平衡。

Snuba 数据存储在 Clickhouse 表和 Clickhouse 物化视图(materialized views)中。根据表的目标使用多个 Clickhouse 存储引擎。

  • https://clickhouse.tech/docs/en/engines/table-engines/

Snuba 数据组织在多个数据集中,这些数据集表示数据模型的独立分区。更多细节见 Snuba 数据模型部分。

摄取

Snuba 不提供用于插入行的 api 端点(除非在调试模式下运行)。数据从多个输入流加载,由一系列消费者处理并写入 Clickhouse 表。

一个 consumer 消费一个或多个 topic 并写入一个或多个表。到目前为止,还没有多个消费者写入表。这允许下面讨论的一些一致性保证。

数据摄取(Data ingestion)在批处理中最有效(对于 Kafka 但尤其是对于 Clickhouse)。我们的 consumer 支持批处理并保证从 Kafka 获取的一批事件至少传递给 Clickhouse 一次。通过正确选择 Clickhouse 表引擎对行进行重复数据删除,如果我们接受最终一致性,我们可以实现恰好一次语义。

查询

最简单的查询系统是时间点。查询以 SnQL 语言(SnQL 查询语言)表示,并作为 HTTP post 调用发送。查询引擎处理查询(Snuba 查询处理中描述的过程)并将其转换为 ClickHouse 查询。

流式查询(通过订阅引擎完成)允许客户端以推送方式接收查询结果。在这种情况下,HTTP 端点允许客户端注册流查询。然后订阅 Consumer 消费到用于填充相关 Clickhouse 表以进行更新的 topic,通过查询引擎定期运行查询并在订阅 Kafka topic 上生成结果。

数据一致性

不同的一致性模型在 Snuba 中并存以提供不同的保证。

默认情况下,Snuba 是最终一致的。运行查询时,默认情况下,不能保证单调读取(monotonic reads),因为 Clickhouse 是多领导者(multi-leader),查询可以命中任何副本,并且不能保证副本是最新的。此外,默认情况下,不能保证 Clickhouse 会自行达到一致状态。

通过强制 Clickhouse 在执行查询之前达到一致性(FINAL keyword),并强制查询命中 consumer 写入的特定副本,可以在特定查询上实现强一致性。这本质上使用 Clickhouse,就好像它是一个单一的领导系统(single leader system),它允许顺序一致性(Sequential consistency)。

Sentry 部署中的 Snuba

本节解释了 Snuba 在展示主要数据流的 Sentry 部署中扮演的角色。如果您单独部署 Snuba,这对您没有用处。

Errors 和 Transactions 数据流

图表顶部的主要部分说明了 EventsTransactions 实体的摄取过程。这两个实体为 Sentry 和整个 Performance 产品中的大多数问题/错误(issue/errors)相关功能提供服务。

只有一个 Kafka topic(events)在 errorstransactions 之间共享,为这条管道提供信息。此 topic 包含 error 消息和 transaction 消息。

Errors consumers 使用 events topic,在 Clickhouse errors 表中写入消息。提交后,它还会生成关于 snuba-commit-log topic 的记录。

错误警报由 Errors Subscription Consumer 生成。这是同步消费者(synchronized consumer),它同时消费主 events topic 和 snuba-commit-log topic,因此它可以与主 consumer 同步进行。

synchronized consumer 然后通过查询 Clickhouse 生成警报,并在 result topic 上生成结果。

transactions 存在于一个相同但独立的管道。

Errors 管道还有一个额外的步骤:写入 replacements topic。Sentryevents topic 上产生 Errors mutations(合并/取消合并/再处理/等等)。然后,Errors Consumer 将它们转发到 replacements topic,并由 Replacement Consumer 执行。

events topic 必须按 Sentry project id 在语义上进行分区,以允许按顺序处理项目中的事件。目前为止,这是 alertsreplacements 的要求。

Sessions 与 Outcomes

SessionsOutcomes 以非常相似和更简单的方式工作。特别是 Sessions 增强 Release Health 功能,而 Outcomes 主要向 Sentry 统计页面提供数据。

两个管道都有自己的 Kafka topicKafka consumer,它们在 Clickhouse 中写自己的表。

变更数据捕获管道

这条管道仍在建设中。它使用 cdc topic 并填充 Clickhouse 中的两个独立表。

本文分享自微信公众号 - 黑客下午茶(hi-weishao),作者:为少

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 抓 Bug 神器的工作原理——聊聊 Sentry 的架构

    Sentry 是什么?这是一个用于错误上报的服务中心,使用近乎一致的 API 设计,统一了不同语言生产环境代码异常上报的难题。

    FesonX
  • 抓 Bug 神器的工作原理——聊聊 Sentry 的架构

    Sentry 是什么?这是一个用于错误上报的服务中心,使用近乎一致的 API 设计,统一了不同语言生产环境代码异常上报的难题。

    benny
  • Sentry 监控 - Snuba 数据中台架构(Data Model 简介)

    本节介绍数据在 Snuba 中的组织方式以及面向用户的数据如何映射到底层数据库(如: Clickhouse)。

    为少
  • Snuba:Sentry 新的搜索基础设施(基于 ClickHouse 之上)

    Sentry 已经在名为 Search,Tagstore(用于事件标签)和 TSDB(时间序列数据库,为大多数图形提供动力)的抽象服务接口上运行。这些服务中的每...

    为少
  • Sentry(v20.12.1) K8S云原生架构探索,玩转前/后端监控与事件日志大数据分析,高性能高可用+可扩展可伸缩集群部署

    Sentry 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一。将它部署到 Kubernetes,再搭配它本身自带的利用 Cli...

    为少
  • Sentry 监控 - Snuba 数据中台架构(Query Processing 简介)

    在数据模型上,查询处理流水线分为逻辑部分,进行产品相关处理,物理部分专注于优化查询。

    为少
  • Sentry 10 K8S 云原生架构探索,Vue App 1 分钟快速接入

    Sentry 10 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一。将它部署到 Kubernetes,再搭配它本身自带的利用 ...

    为少
  • 我用EggJS开发了一个日增量过亿的数据可视化平台

    前些日子,我所在的Team接到了一个“大活儿”,为我们公司某个服务(出于保密的原因,这里不能直说)做数据可视化及数据分析平台。

    用户1687375
  • Sentry(v20.12.1) K8S 云原生架构探索,1分钟上手 JavaScript 性能监控

    通过性能监视,Sentry 可以跟踪您的软件性能,测量吞吐量和延迟等指标,并显示多个系统之间的错误影响。

    为少
  • Sentry(v20.12.1) K8S 云原生架构探索, SENTRY FOR JAVASCRIPT 手动捕获事件基本用法

    Sentry 的 SDK 挂接到您的运行时环境中,并自动报告错误(errors)、异常(exceptions)和拒绝(rejections)。

    为少
  • SOC日志收集实践:企业邮件服务日志收集

    这次我们举个接近实际生产的例子,来说明开源SOC系统如何采集数据,如果之前介绍系统是抽象的,现在就是实例具象的。平时我们利用日志系统收集了大量的各类的日志数据,...

    FB客服
  • 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(开发基础篇)

    所以您想要开发一个 SDK ?在你开始之前,这里有一些基本的东西是值得遵循的,以获得更好的体验。

    为少
  • Sentry(v20.12.1) K8S 云原生架构探索,JavaScript 性能监控之采样 Transactions

    如果您希望 transactions 的 cross-section 均匀,无论您在应用程序中的何处或在什么情况下发生,并且对下文所述的默认继承和优先级行为感到...

    为少
  • ClickHouse 数据导入实战:Kafka 篇

    在生产环境中,经常遇到将数据从消息队列Kafka写入ClickHouse集群中。本文介绍如何将Kafka中的数据导入到ClickHouse集群的方案。

    fastio
  • ClickHouse 数据导入实战:Kafka 篇

    在生产环境中,经常遇到将数据从消息队列Kafka写入ClickHouse集群中。本文介绍如何将Kafka中的数据导入到ClickHouse集群的方案。

    fastio
  • 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(理念与设计原则篇)

    本文档为 Sentry 上的 SDK 开发设置了一些常规指南。它应该帮助内部和外部开发人员了解 SDK 的设计动机以及为什么我们以某些方式做出决定。

    为少
  • 万亿级大数据平台的建设实践

    从互联网、移动互联网到物联网,数据量之巨大已突破想象边界。与此同时,实时数据分析的需求日益增长,那么,当数据量达到亿级、百亿级甚至万亿级规模,实时数据分析如何来...

    数据和云
  • 数据分析引擎黑马 ClickHouse 最新技术的实践与应用

    ? 导语 | ClickHouse 在近几年是大数据分析引擎界的一匹黑马,从默默无闻到一路起飞,在 DB engine Rank 上进入前50名,成为全球数据...

    腾小云
  • 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(概述篇)

    下面是一个实现新的 Sentry SDK 的指南。它涵盖了事件提交的协议,以及客户端的典型外观和行为准则。

    为少

扫码关注云+社区

领取腾讯云代金券