Cortex 是什麼#

Cortex 是 Prometheus 長期儲存(Long-Term Storage)的另一個重要選項,目前是 CNCF 的 Incubating Project。它最早由 Tom Wilkie(當時任職於 Weaveworks,現為 Grafana CTO)與 Prometheus 作者 Julius Volz 共同發起,2016 年首次公開時專案名稱是「Project Frankenstein」,2018 年由 Weaveworks 捐給 CNCF 並更名為 Cortex。

主打功能包括:

  • 長期儲存:資料先暫存在 Block Storage,再上傳至 Object Storage,支援 AWS S3、Google Cloud Storage、Azure Blob Storage、OpenStack Swift。
  • 快速查詢:資料分散在多台機器上,搭配並行查詢與快取機制提升查詢速度。
  • 單一資料源:可整合多個 Prometheus 的資料,讓使用者透過單一 Endpoint 查詢全部資料。
  • 水平擴展:透過增加機器即可提升吞吐量與儲存容量。

高可用性與 Hash Ring#

要讓 Cortex 在節點故障時仍能維持服務、且資料不會遺失,必須把資料複製到多台機器上。但「資料怎麼分散」、「節點增減時是否要大規模搬資料」是個關鍵問題,這就會用到 Consistent Hashing 這一類的演算法來確保資料平均分配並能容忍節點動態變化。

Hash Ring 是 Consistent Hashing 的一種實作,可以在節點變更時最小化資料搬遷,藉此維持查詢效能。在 Cortex 中,Hash Ring 的狀態需要儲存在一個 Key-Value Store 中,可選用:

  • Consul
  • Etcd
  • Gossip 協定的 memberlist

在 Lab 的 multi-instance 範例中,會額外建立 Consul,正是為了存放 Hash Ring 狀態。

Lab 摘要#

範例 09-cortex 提供兩種啟動模式。

單一 Cortex 實例#

docker-compose up -d

服務:

  • Prometheus:http://localhost:9090
  • Grafana:http://localhost:3000,預設 admin/admin

關閉:

docker-compose down

多實例 Cortex#

docker-compose up -d -f docker-compose.multi.yml

關閉:

docker-compose down -f docker-compose.multi.yml

Lab 達成的目標:

  • 建立 Cortex,供 Grafana 查詢、供 Prometheus Remote Write。
  • 多實例情境額外建立 Consul 作為 Hash Ring 的 Key-Value Store。
  • Grafana 將 Cortex 當成 Prometheus 類型的 Data Source 使用。

Cortex 與 Mimir 的關係#

從架構設計來看,Cortex 與 Mimir 有非常多相似之處——兩者都使用 Hash Ring 維持高可用、主打的功能也大致重疊。原因是 Tom Wilkie 在 2018 年加入 Grafana Labs 後,Grafana Labs 大量投入 Cortex 開發,並將其用於 Loki、Tempo 等產品。後續因為越來越多公司基於 Cortex 開發商業產品但回饋稀少,Grafana Labs 才決定脫離 Cortex 自行發展全新的 Mimir。

即便如此,Cortex 在開源社群仍維持一定的活躍度,依然是長期儲存方案的重要選項,許多既有部署也持續使用。

小結#

Cortex 是一個高可用、高可擴展、支援多種儲存後端的 Prometheus 長期儲存方案,發展歷史悠久。雖然它與 Mimir 在架構上有很多重疊,選哪個工具最終仍取決於需求與既有部署狀況——「沒有最好,只有最適合」。

原文出處#

  • 原書/iThome:https://ithelp.ithome.com.tw/articles/10325948