关于 Pyroscope 架构
Pyroscope 采用基于微服务的架构。系统拥有多个可水平扩展的微服务,这些微服务可以独立并行运行。Pyroscope 微服务被称为组件。
Pyroscope 的设计将所有组件的代码编译成一个单独的二进制文件。-target
参数控制该单一二进制文件充当哪些组件。对于那些希望简单上手的人来说,Pyroscope 也可以在单体模式下运行,所有组件都在一个进程中同时运行。更多信息请参阅部署模式。
Pyroscope 组件
大多数组件是无状态的,在进程重启之间不需要持久化任何数据。一些组件是有状态的,依赖于非易失性存储来防止进程重启之间的数据丢失。有关每个组件的详细信息,请参阅组件中的相应页面。
写入路径
Ingester 从 Distributor 接收传入的性能分析数据。每个推送请求都属于一个租户,Ingester 将接收到的性能分析数据附加到存储在本地磁盘上的特定租户 Pyroscope 数据库中。
一旦接收到该租户的第一批性能分析数据,每个 Ingester 就会懒惰地创建该租户的 Pyroscope 数据库。
内存中的性能分析数据会定期刷新到磁盘并创建新的块。
更多信息请参阅Ingester。
序列分片和复制
默认情况下,每个性能分析序列都会被复制到三个 Ingester 中,每个 Ingester 将自己的块写入长期存储。Compactor 将来自多个 Ingester 的块合并成一个块,并移除重复的样本。块压缩显著降低了存储利用率。
读取路径
进入 Pyroscope 的查询到达 query-frontend 组件,该组件负责加速查询并将其分派给 query-scheduler。
query-scheduler 维护一个查询队列,并确保公平地执行每个租户的查询。
Querier 充当工作节点,从 query-scheduler 中的队列拉取查询。Querier 连接到 Ingester 以获取执行查询所需的所有数据。有关查询执行方式的更多信息,请参阅querier。
根据所选的时间窗口,Querier 会调用Ingester 获取近期数据,并调用store-gateways 获取长期存储的数据。
长期存储
Pyroscope 存储格式在块格式页面中有详细描述。Pyroscope 存储格式将每个租户的性能分析数据存储到他们自己的磁盘块中。每个磁盘块目录包含一个索引文件、一个包含元数据的文件和 Parquet 表。
Pyroscope 要求块文件使用以下任何对象存储