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.ymlLab 達成的目標:
- 建立 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