动态

详情 返回 返回

Grafana Loki 架構詳解,比 ES 成本低很多 - 动态 详情

在本指南中,我們將詳細瞭解Grafana Loki架構及其組件。

在公司的分佈式環境中,存儲和管理來自各種系統資源的日誌是一項具有挑戰性的任務。為了簡化這項任務,引入了一個稱為日誌聚合的概念,它從各種系統資源中收集、存儲、管理日誌。有各種各樣的日誌聚合工具,其中一個工具是 Grafana Loki,通過本文我們一起探索一下 Loki。

什麼是 Grafana Loki?

Grafana Loki 是一個開源的日誌收集系統,其功能是收集、存儲和查詢日誌。Grafana Loki 壓縮日誌並將日誌存儲在塊中,並將它們存儲在文件系統或 AWS S3 等後端存儲中。

塊是一個壓縮文件,其中包含基於日誌卷的日誌條目,因此當塊大小達到其大小限制時,它會將日誌存儲在另一個塊中。每當存儲一個塊時,它都會為每個塊創建一個索引。索引不包含日誌的內容,它只包含時間戳、塊的標籤和塊的位置。

日誌的默認保留期限為24小時,最短期限為1小時,最長可延長至30天。Loki 橫向擴展並具有其查詢語言 LogQL。

Grafana Loki 架構

下圖顯示了 Grafana Loki 的架構以及它如何收集日誌的工作流程。

loki-component-2-1

  • 現在,讓我們看看 Grafana Loki Logging 是如何工作的。該圖顯示了 Grafana Loki 如何收集、存儲、查詢和可視化日誌。
  • 在 Grafana Loki 中,agent 負責從文件、容器、pod、應用程序和系統日誌中收集日誌。
  • Loki 使用日誌收集代理(agent)來收集日誌,如果您在 Kubernetes 中使用 Loki,代理將作為守護程序集(Daemonset)部署,因為我們需要來自集羣每個可用節點的日誌。
  • Promtail 是該架構中使用的代理(agent),Promtail 收集日誌,然後過濾和壓縮日誌以節省存儲空間。
  • 壓縮日誌後,它會為日誌提供一個標籤並將其發送給 Loki。
  • 從 Promtail 接收到日誌之後,Loki 將每個日誌存儲為一個塊,該塊將日誌消息收集在一個文件中,以節省存儲空間和有效檢索。
  • 它還為塊提供標籤和時間戳。每當存儲塊時,它都會為每個塊創建一個索引,其中包含塊的時間戳、標籤和位置。
  • Loki 使用 LogQL 查詢語言查詢日誌,LogQL 允許我們根據我們選擇的標籤和值過濾、聚合和分析日誌。
  • 通過將 Loki 添加到 Grafana,您可以可視化查詢的日誌或使用 LogCLI 從 CLI 查詢日誌。

Grafana Loki 組件

Grafana 包含很多組件,promtail, distributor, ingester, querier, ruler, query frontend, Grafana,讓我們看一下這些組件。

Promtail

Promtail 是充當 Loki 的日誌代理(agent)的重要組件。它的功能是從系統中收集每個日誌,標記它,然後將其發送給 Loki。Loki 從本地日誌文件和系統日誌中收集日誌。

您必須在要收集日誌的每個系統中安裝 Promtail,同樣,如果您在 Kubernetes 上使用 Loki,則必須在每個節點中部署 Promtail 作為守護進程集(Daemonset)。

Distributor

Distributor 是一個無狀態組件,負責處理和驗證從日誌代理(如 Promtail)接收的日誌,並將日誌分發到 ingester。

當 Distributor 收到日誌時,它首先驗證日誌是否符合配置,例如有效標籤、不是較舊的時間戳以及日誌是否太長。

驗證完成後,Distributor 會根據一致性哈希將日誌分發到每個 ingester,以確保平均分配給每個可用的 ingester。

Ingester

Ingester 負責在其文件系統上存儲和索引從 Distributor 收到的日誌,並定期將日誌傳輸到持久性存儲(長期存儲),如 S3。

Ingester 根據配置設置保留策略(自動日誌刪除時間)。

它使用時間序列數據庫以一定的結構格式存儲日誌,這簡化了高效查詢和日誌過期的過程。

Ruler

Ruler 是 Loki 的監控和告警組件,其作用是記錄指標並根據收到的日誌數據觸發告警。它不是直接衡量指標,而是將日誌數據轉換為指標。

Ruler 監控日誌並在檢測到任何問題時發出通知,並通過電子郵件或 Slack 發送通知。

Querier

顧名思義,Querier 負責使用 LogQL 查詢語言從存儲和 ingester 中查詢日誌。它根據用户查詢(如時間戳、標籤等)過濾和聚合日誌。

查詢器緩存之前的查詢,以防止一次又一次地查詢相同的日誌,它只查詢一次具有相同時間戳、標籤和日誌消息的日誌。

Query Frontend

Query Frontend 是一個與用户交互的無狀態組件,它負責處理查詢請求、執行查詢以及通過 Grafana 儀表板可視化日誌。

Query Frontend 將大型查詢拆分為多個較小的查詢,並同時運行所有查詢,這可以防止大型查詢在單個查詢中導致內存問題,並有助於加快執行速度。

Grafana

Grafana 是一個開源工具,可幫助查詢、可視化和監控日誌。我們可以將 Loki 與 Grafana 集成,並在儀表板、圖表等方式可視化日誌數據。

Grafana 使用查詢語言 LogQL 與 Grafana 集成,我們也可以在 Grafana 中編寫 LogQL 查詢來過濾和查詢日誌。

Log Storage

Loki 存儲日誌數據,提高查詢和接收日誌的效率。它將日誌數據壓縮成塊,根據時間進行組織,併為其提供標籤和時間戳。然後,它以鍵值對格式為每個塊創建一個索引,其中塊時間戳和標籤等。

例如,將塊的索引視為一本書的索引。

Chunks 和 Index 可以存儲在各種後端對象存儲或文件系統中。

一旦存儲了塊,它就會為數據創建一個保留期,並根據保留期自動刪除。

如果您使用文件系統作為存儲,則塊和索引的默認存儲路徑是 /var/lib/loki/chunks 和 /var/lib/loki/index

如何在 Loki 中存儲塊和索引的示例

例如,假設您正在使用一個 Web 服務器,該服務器生成一個包含時間戳、HTTP 請求方法、URL 和響應代碼的日誌。

每組日誌條目將被存儲為多個塊,如下面的 JSON 格式:

{
  "timestamp": "2023-11-20T1:02:33.456Z",
  "labels": {
    "method": "GET",
    "url": "/products",
    "status": 200
  },
  "entry": "Request received for /products, responded with 200 OK"
}

塊文件名將採用此格式:

2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk

顧名思義,該塊包含 2023 年 11 月 20 日凌晨 1 點至凌晨 1:15 的日誌。

chunk 創建之後,會為每個 chunk 創建一個 index,index 會存儲 chunk 的時間戳、標籤和位置。如下所示:

{
  "2023-11-20T1:02:33.456Z": {
    "chunk": "2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk",
    "labels": {
      "method": "GET",
      "url": "/products",
      "status": 200
    }
  }
}

如上面示例索引文件所示,它只存儲塊文件名、時間戳和標籤,不會存儲日誌消息。

Grafana Loki 的特點

可擴展性

Loki 可以根據日誌的數量進行擴展,如果日誌量比較大,水平擴展 ingester 模塊即可,因此您不必擔心過多的日誌流量會減慢該過程。

它將日誌分佈在多個攝取器(ingester)之間,以防止在節點故障期間由於流量過大而丟失數據,並且還將日誌重定向到健康的攝取器節點,以防止停機和數據丟失。

效率

由於 Loki 將日誌條目壓縮並存儲為塊,因此即使對於大數據,它也增加了存儲空間並減少了檢索日誌所花費的時間。在索引的幫助下,Loki 可以根據時間戳和標籤輕鬆定位查詢到的日誌。

多租户

Loki 可以同時收集和分析來自各種來源(如 pod、容器、應用程序等)的日誌,因此我們不必為不同的資源配置單獨的日誌代理。

儘管它從各種來源收集日誌,但它會根據來源單獨存儲日誌,例如容器和應用程序的單獨存儲文件。

日誌輪轉

Loki 在存儲塊時為塊分配了保留策略,它會根據保留期自動刪除舊日誌,這有助於節省存儲空間。

如果您不想刪除舊日誌,也可以將日誌存儲在長期對象存儲中,例如 AWS S3 和其他對象存儲。

Grafana Loki 和 EFK Stack 之間的區別

現在,讓我們看看是什麼讓 Grafana Loki 與 EFK Stack 不同。Grafana Loki 和 EFK Stack 之間的區別如下:

Grafana Loki EFK Stack
Loki 收集日誌、存儲日誌,使用 Grafana 可視化日誌 EFK Stack 使用 Elasticsearch 來收集和存儲日誌,使用 Logstash 來解析和處理日誌,使用 Kibana 來可視化日誌
Loki 壓縮日誌並將它們存儲為塊 EFK Stack 將每個日誌條目存儲在 Elasticsearch 的 JSON 文件中
Loki 以其效率和可擴展性而聞名 EKS以其適應各種環境的能力而聞名
水平縮放 垂直縮放
Loki 使用分佈式架構 EFK Stack 使用客户端-服務器架構
資源使用率低 資源使用率高
使用 Grafana 可視化日誌 使用 Kibana 可視化日誌

譯者注:感覺作者這個比較有失偏頗,各位讀者兼聽則明哈

總結

總的來説,Grafana Loki 是一個強大的開源工具,用於收集、存儲、查詢和可視化日誌。

它具有可擴展性、日誌壓縮、多租户支持和自動日誌輪換等功能,可實現有效的監控和故障排除。

我相信這個博客可以讓您更好地瞭解 Grafana Loki 及其功能。

英文原文:https://devopscube.com/grafana-loki-architecture/
中文譯文:https://flashcat.cloud/blog/grafana-loki-architecture/
譯者:巴輝特

本博客出自快貓星雲的小夥伴們,快貓星雲是一家專注在監控/可觀測性領域的初創公司,其團隊是開源項目 Open-Falcon、Nightingale 的創始團隊。如果您想要採購監控/可觀測性相關的產品方案,歡迎 聯繫我們做產品技術交流。

Add a new 评论

Some HTML is okay.