1 loki简介
Loki 是由 Grafana Labs 团队开发的一组日志收集组件,使用 Go 语言编写。Loki 的第一个稳定版本于 2019 年 11 月 19 日发布。 Loki 是一个水平可扩展、高可用性、多租户的日志聚合系统,它的构建理念受到了 Prometheus 的启发,是对有关日志的元数据进行索引。日志数据本身会被压缩并以块的形式存储在本地或者对象存储中。 Loki 可以商用,它的商用许可证是 Apache License 2.0。
Loki的主要特点是它不会对日志数据进行全文索引,而是仅索引日志的元数据(例如,日志来源的应用、容器、主机等)。这种设计使得Loki可以更高效地存储和查询大量的日志数据。
Loki的另一个关键特点是它与Grafana紧密集成。你可以在Grafana中查询和可视化Loki中的日志数据,这使得对日志和度量数据进行联合查询和监控变得更简单。
Loki的主要组件包括Promtail(用于收集和发送日志的代理)、Loki(用于存储和查询日志的服务)和Grafana(用于可视化和查询数据的面板)。
2 基础架构
Promtail:负责日志数据的采集、提取、匹配、过滤、打标签、推送到 Loki。
Distributor:接收 Promtail 推送过来的日志数据,并把日志数据分发给Ingester。
Ingester:负责接收数据并构建 chunk,存储日志索引及数据。
Querier:负责数据读取,通过给定的时间范围和标签选择器,查看索引以确定哪些块匹配,并通过 greps 聚合各个 Ingester 中的数据,并将结果返回给 client。
Grafana:Loki 的数据查询都是通过 Grafana,在 Grafana 中支持 loki 的数据源,通过配置 Loki 的接口地址即可。
3 loki存储层
Loki的存储层由其自身的存储组件完成,它需要存储两种不同类型的数据:索引和块。当使用加速搜索(实验性)时,会使用第三种数据类型:布隆块。
索引:索引包含日志流的元数据,例如标签(就像Prometheus的标签)。索引数据通常存储在键值存储系统中,例如Amazon DynamoDB,Google Bigtable,或者使用索引商店接口的任何兼容实现。
块:日志数据本身被压缩并存储在块中。这些块存储在对象存储系统中,例如Amazon S3,Google Cloud Storage,或者本地文件系统。
Loki是围绕仅索引日志的元数据(标签)构建的,这与其他日志系统有所不同。这种设计使得Loki在存储和查询大量日志数据时能够更加高效。同时,通过使用高度压缩的块和小型索引,可以简化存储结构并降低存储成本。
因此,Loki的存储层是一个独立的解决方案,但它依赖于其他存储系统(如S3,GCS或本地文件系统)来存储日志数据和索引。
默认部署的 Loki 日志组件采用以下存储方式:
Loki 将日志数据压缩后存储在对象存储(如 S3 或 GCS)的块中,或者存储在本地文件系统上1。
Loki 使用紧凑的索引和压缩算法来存储日志数据,这大大减少了存储空间的需求,与 Elasticsearch 等需要大量硬盘空间和内存的方案相比,Loki 的存储成本更低3。
Loki 还使用 Write-Ahead Log (WAL) 来记录传入的数据,并将其存储在本地文件系统中,以确保在进程崩溃的情况下数据能够持久保存1。
Loki 不需要依赖 Elasticsearch 等复杂的存储引擎,而是采用了更轻量级的方式,这使得 Loki 更适合中小团队使用13。
总之,Loki 采用了对象存储或本地文件系统作为其主要的日志数据存储方式,并使用紧凑的索引和压缩算法来降低存储成本,同时还使用 WAL 机制来保证数据的持久性。这种设计使 Loki 的资源需求更低,更适合中小规模的日志收集和分析场景
4 loki与高可用
Loki 可以通过以下方式实现高可用性:
部署多个 Loki 实例
使用分布式存储
使用 Write-Ahead Log (WAL) 机制
Loki 使用 WAL 来记录传入的数据,并将其存储在本地文件系统中,以确保在进程崩溃的情况下数据能够持久保存5。
这种机制可以保证数据的持久性,即使在系统故障的情况下,也可以通过重放 WAL 日志来恢复数据5。
总之,Loki 通过部署多个实例、使用分布式存储以及采用 WAL 机制等方式来实现高可用性,确保在某些服务器故障时仍然可以继续运行,并保证数据的安全性和持久性。