文章摘抄轉載自:https://lluozh.blog.csdn.net/article/details/111027998
Loki 日志系統由以下3個部分組成:
- loki是主服務器,負責存儲日志和處理查詢
- promtail是專為loki定制的代理,負責收集日志並將其發送給 loki
- Grafana用於查詢和顯示日志
整體架構

Loki 日志存儲架構:

Loki 包含Distributor、Ingester、Querier和可選的Query frontend五個組件。每個組件都會起一個用於處理內部請求的 gRPC 服務器和一個用於處理外部 API 請求的 HTTP/1服務器
i. Distributor
Distributor 是客戶端連接的組件,用於收集日志
在 promtail 收集並將日志發送給Loki 之后, Distributor 就是第一個接收它們的組件,每秒可以接收數百萬次寫入。Distributor會對接收到的日志流進行正確性校驗,並將驗證后的chunk日志塊分批並行發送到Ingester。
ii. Ingester
Ingester 接收來自Distributor的日志流,並將日志壓縮后存放到所連接的存儲后端。

Ingester接受日志流並構建數據塊,其操作通常是壓縮和追加日志。每個Ingester 的生命周期有PENDING, JOINING, ACTIVE, LEAVING 和 UNHEALTHY 五種狀態。處於JOINING和ACTIVE狀態的Ingester可以接受寫請求,處於ACTIVE和LEAVING狀態時可以接受讀請求。
Ingester 將收到的日志流在內存中打包成 chunks ,並定期同步到存儲后端。由於存儲的數據類型不同,Loki 的數據塊和索引可以使用不同的存儲
當滿足以下條件時,chunks 會被標記為只讀:
- 當前 chunk 達到配置的最大容量
- 當前 chunk 長時間沒有更新
- 發生了定期同步
- 當舊的 chunk 經過了壓縮並被打上了只讀標志后,新的可寫的 chunk 就會生成
iii. Querier
Querier 用來查詢日志,可以直接從 Ingester 和后端存儲中查詢數據。當客戶端給定時間區間和標簽選擇器之后,Querier 就會查找索引來確定所有匹配 chunk ,然后對選中的日志進行 grep並返回查詢結果。查詢時,Querier先訪問所有Ingester用於獲取其內存數據,只有當內存中沒有符合條件的數據時,才會向存儲后端發起同樣的查詢請求。
需要注意的是,對於每個查詢,單個 Querier 會 grep 所有相關的日志。目前 Cortex 中已經實現了並行查詢,該功能可以擴展到 Loki,通過分布式的 grep 加速查詢。此外,由於副本因子的存在,Querier可能會接收到重復的數據,所以其內置了去重的功能,對擁有同樣時間戳、標簽組和消息內容的日志進行去重處理
Loki與其他日志聚合系統差別:
- 不對日志進行全文本索引。通過存儲壓縮的,非結構化的日志以及僅索引元數據,Loki更加易於操作且運行成本更低
- 使用與Prometheus相同的標簽對日志流進行索引和分組,從而使您能夠使用與Prometheus相同的標簽在指標和日志之間無縫切換。
- 特別適合存儲Kubernetes Pod日志。諸如Pod標簽之類的元數據會自動被抓取並建立索引
- 在Grafana中原生支持(需要Grafana v6.0及以上)
