探究 | Elasticsearch集羣規模和容量規劃的底層邏輯

0、引言

實戰中經常遇到的問題:

問題 1:請問下大家是如何評估集羣的規模?比如數據量達到百萬,千萬,億萬,分別需要什麼級別的集羣,這要怎麼評估?

ps:自己搭建的測試環境很難達到這一級別。

問題 2

問題 3:我看了很多文章關於 es 集羣規劃的文章,總感覺亂七八糟的,沒有一個統一的規劃思路。如何根據硬件條件和數據量來規劃集羣,設置多少節點,每個節點規劃多少分片和副本?

Elasticsearch 集羣規模和容量規劃:是進行 Elasticsearch 集羣部署前對所需資源類型和數量的規劃。

通過本文,您將瞭解:

  • Elasticsearch 計算資源詳解

  • Elasticsearch 架構、增刪改查操作和資源需求

  • Elasticsearch 集羣規模和容量規劃的方法論

1、Elasticsearch 基礎架構

1.1 自頂向下的架構體系

  • Cluster—協同工作的節點組,以保障 Elasticsearch 的運行。

  • Node—運行 Elasticsearch 軟件的 Java 進程。

  • Index—一組形成邏輯數據存儲的分片的集合。

  • Shard—Lucene 索引,用於存儲和處理 Elasticsearch 索引的一部分。

  • Segment—Lucene 段,存儲了 Lucene 索引的一部分且不可變。

  • Document—條記錄,用以寫入 Elasticsearch 索引並從中檢索數據。

1.2 節點角色劃分及資源使用情況

角色描述存儲內存計算網絡
數據節點存儲和檢索數據極高
主節點管理集羣狀態
Ingest 節點轉換輸入數據
機器學習節點機器學習極高極高
協調節點請求轉發和合並檢索結果

劃重點:對資源利用率拿不準的,多結合業務實際看看這個表格。

2、維繫 Elasticsearch 高性能的資源組成

4 個基本的計算資源 存儲、內存、計算、網絡

2.1 存儲資源

2.1.1 存儲介質

  • 固態硬盤(SSD) 提供最佳“熱”工作負載的性能。

  • 普通磁盤(HDD) 成本低,用於“暖”和“冷”數據存儲。

注意:RAID0 可以提高性能。RAID 是可選的,因爲 Elastic 默認爲 N + 1 分片複製策略。

爲了追求硬件級別的高可用性,可以接受標準性能的 RAID 配置(例如 RAID 1/10/50 等)。

2.1.2 存儲建議

  • 建議直接使用:附加存儲(DAS)、存儲區域網絡(SAN)、超融合存儲(建議最低〜3Gb / s,250Mb / s)

  • 避免使用:網絡附加存儲(NAS)

    例如 SMB,NFS,AFP。使用時可能帶來的性能問題:網絡協議的開銷,延遲大和昂貴的存儲抽象層。

2.2 內存資源

2.2.1 JVM Heap

存儲有關集羣索引、分片、段和 fielddata 數據。

建議:可用 RAM 的 50%,最多最大 30GB RAM,以避免垃圾回收。

官方文檔最大指 32 GB:

https://www.elastic.co/guide/en/elasticsearch/guide/master/heap-sizing.html

2.2.2 操作系統緩存

Elasticsearch 將使用剩餘的可用內存來緩存數據(Lucene 使用), 通過避免在全文檢索、文檔聚合和排序環節的磁盤讀取,極大地提高了性能。

2.3 計算資源

Elasticsearch 如何使用計算資源?

Elasticsearch 處理數據的方式多種多樣,但計算成本較高。

可用的計算資源:線程池、線程隊列。

CPU 內核的數量和性能:決定着計算平均速度和峯值吞吐量。

2.4 網絡資源

Elasticsearch 如何使用網絡?小帶寬是限制 Elasticsearch 的資源。

針對大規模集羣,ingest、搜索和副本複製相關的數據傳輸可能會導致網絡飽和。

在這些情況下,網絡連接可以考慮升級到更高的速度,或者 Elastic 部署可以分爲兩個或多個集羣,然後使用跨集羣(CCS)作爲單個邏輯單元進行搜索。

3、數據增刪改查操作

增、刪、改、查是 Elasticsearch 中的四個基本數據操作。

每個操作都有其自己的資源需求。每個業務用例都利用其中一個操作,實際業務往往會側重其中一個或多個操作。

  • 增:新增索引處理文檔並將其存儲在索引中,以備將來檢索。

  • 刪:從索引中刪除文檔。

  • 改:更新刪除文檔併爲其替換的新文檔建立索引。

  • 查:搜索從一個或多個索引中檢索或聚合一個或多個文檔。

3.1 增/索引數據處理流程

如圖所示,增/索引數據大致的處理流程如下:

  • 1、客戶端發起寫入請求到協調節點;

  • 2、協調節點根據請求類型的不同進行判斷,如果是 Ingest 相關,提交給 Ingest 節點;如果不相關,則計算路由後提交給數據節點;

  • 3、數據節點根據數據類型不同決定是否分詞以索引化數據,最終落地磁盤存儲;同時將副本分發給其他數據節點。

3.2 刪除數據處理流程

如果所示,刪除數據大致處理流程如下:

  • 1、客戶端發出刪除文檔請求到協調節點;

  • 2、協調節點將請求路由給數據節點;

  • 3、數據節點接收到請求後,將數據標記爲 deleted 狀態(注意,此處爲邏輯刪除)

  • 4、待段合併時機,邏輯刪除會變成物理刪除。

3.3 更新數據處理流程

文檔在 Elasticsearch 中是不可變的。當 Elasticsearch 更新文檔時,它將刪除原始文檔併爲新的待更新的文檔建立索引。

這兩步操作在每個 Lucene 分片是原子操作,操作會帶來刪除和索引(索引不調用任何 ingest pipeline 操作)操作的開銷。

Update = Delete + (Index - Ingest Pipeline)

3.4 檢索操作處理流程

“搜索”是信息檢索的通用術語。Elasticsearch 具有多種檢索功能,包括但不限於全文搜索、範圍搜索、腳本搜索和聚合。

搜索速度和吞吐量受許多因素影響,包括集羣的配置、索引、查詢和硬件。

實際的容量規劃取決於應用上述優化配置後的大量測試實踐結果。

Elasticsearch 檢索可以細化分爲:scatter(分散)、 search(檢索)、gather(收集)、merge(合併)四個階段。

  • scatter:將結果分發給各個相關的分片;

  • search:在各個分片執行檢索;

  • gather:數據節點將檢索結果彙集到協調節點;

  • merge:協調節點將數據結果進行合併,返回給客戶端。

3.5 用例場景

Elasticsearch 有一些常規的使用模式。大致可分類如下:

  • 寫/索引(Index)密集型的業務場景:Logging, Metrics, Security, APM

  • 檢索(search)密集型的業務場景:App Search, Site Search, Analytics

  • 更新(update)密集型的業務場景:Caching, Systems of Record

  • 混合(hybrid)業務場景:支持多種操作的混合用例 Transactions Search

4、Elasticsearch 索引化流程

4.0 概述

以下過程適用於 ingest 節點處理數據流程。

  • Json 數據轉換——結構化或非結構化數據,轉換爲 json 落地存儲。

  • 數據索引化——數據以不同數據類型進行處理和索引。

  • 數據壓縮——提高存儲效率。

  • 副本複製——提高容錯能力和搜索吞吐量。

4.1 Json 轉換

結構化或非結構化數據轉換成 json 格式,可通過_source 控制是否展示。

4.2 數據索引化

第一:數據結構 Elasticsearch 索引各種數據結構中的值。每種數據類型 有自己的存儲特性。

第二:多種索引方法 某些值可以通過多種方式索引。字符串值通常是索引兩次(藉助 fields 實現)。

  • 一次作爲聚合的 keyword 類型;

  • 一次作爲文本用於全文搜索的 text 類型。

4.3 數據壓縮

Elasticsearch 可以使用兩種不同的壓縮算法之一來壓縮數據:LZ4(默認)和 DEFLATE。

與 LZ4 相比,DEFLATE 節省了多達 15%的額外空間,但以增加的計算時間爲代價。

通常,Elasticsearch 可以將數據壓縮 20 – 30%。

4.4 副本分片拷貝

第一:存儲 Elasticsearch 可以在數據節點之間複製分片一次或多次,以提高容錯能力和搜索吞吐量。

每個副本分片都是其主分片的完整副本。

第二:索引和搜索吞吐量

  • 日誌記錄和指標用例場景(Logging and metrics)通常具有一個副本分片,這是確保出現故障的最小數量, 同時最大程度地減少了寫入次數。

  • 搜索用例通常具有更多的副本分片以提高搜索吞吐率。

4.5 完整示例

5、集羣規模和容量規劃預估方法

容量規劃——預估集羣中每個節點的分片數、內存及存儲資源。

吞吐量規劃——以預期的延遲和吞吐量估算處理預期操作所需的內存,計算和網絡資源。

5.1 數據量預估

第一,問自己幾個問題:

  • 您每天將索引多少原始數據(GB)?

  • 您將保留數據多少天?

  • 每天增量數據是多少?

  • 您將強制執行多少個副本分片?

  • 您將爲每個數據節點分配多少內存?

  • 您的內存:數據比率是多少?

第二,預留存儲以備錯誤。(Elastic 官方推薦經驗值)

  • 預留 15%警戒磁盤水位空間。

  • 爲錯誤餘量和後臺活動預留+ 5%。

  • 保留等效的數據節點以處理故障。

第三,容量預估計算方法如下:

  • 總數據量(GB) = 原始數據量(GB) /每天 X 保留天數 X 淨膨脹係數 X (副本 + 1)

  • 磁盤存儲(GB) = 總數據量(GB)* ( 1 + 0.15 + 0.05)

  • 數據節點 = 向上取證(磁盤存儲(GB)/ 每個數據節點的內存量 / 內存:數據比率)+ 1

Tips:騰訊雲 在 2019 4 月的 meetup 分享中建議:磁盤容量大小 = 原始數據大小 * 3.38。

5.2 分片預估

第一,問自己幾個問題:

  • 您將創建多少索引?

  • 您將配置多少個主和副本分片?

  • 您將在什麼時間間隔旋轉索引?

  • 您將保留索引多長時間?

  • 您將爲每個數據節點分配多少內存?

第二,經驗值(Elastic 官方推薦)

  • 每 GB JVM 堆內存支持的分片數不超過 20 個。

  • 每個分片大小不要超過 50GB。推薦閱讀:https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster

Tips:

  • 將小的每日索引整合爲每週或每月的索引,以減少分片數。

  • 將大型(> 50GB)每日索引分拆分成小時索引或增加主分片的數量。

第三,分片預估方法如下:

  1. 總分片數 = 索引個數 X 主分片數 * (副本分片數 +1)X 保留間隔

  2. 總數據節點個數 = 向上取整(總分片數 / (20 X 每個節點內存大小))

5.3 搜索吞吐量預估

搜索用例場景除了考慮搜索容量外,還要考慮如下目標:

  • 搜索響應時間;

  • 搜索吞吐量。

這些目標可能需要更多的內存和計算資源。

第一:問自己幾個問題

  • 您期望每秒的峯值搜索量是多少?

  • 您期望平均搜索響應時間是多少毫秒?

  • 您期望的數據節點上幾核 CPU,每核有多少個線程?

第二:方法論 與其確定資源將如何影響搜索速度,不如通過在計劃的固定硬件上進行測量,可以將搜索速度作爲一個常數,

然後確定集羣中要處理峯值搜索吞吐量需要多少個核。

最終目標是防止線程池排隊的增長速度超過了 CPU 的處理能力。

如果計算資源不足,搜索請求可能會被拒絕掉。

第三:吞吐量預估方法

  • 峯值線程數 = 向上取整(每秒峯值檢索請求數 _ 每個請求的平均響應時間(毫秒)/1000)

  • 線程隊列大小 = 向上取整((每個節點的物理 cpu 核數 _ 每核的線程數 * 3 / 2)+ 1)

  • 總數據節點個數 = 向上取整(峯值線程數 / 線程隊列大小)

5.4 冷熱集羣架構

Elasticsearch 可以使用分片分配感知(shard allocation awareness)在特定硬件上分配分片。

索引密集型業務場景通常使用它在熱節點、暖節點和冷(Frozen)節點上存儲索引,

然後根據業務需要進行數據遷移(熱節點->暖節點->冷節點),以完成數據的刪除和存檔需要。

這是優化集羣性能的最經濟方法之一,在容量規劃期間,先確定每一類節點的數據規模,然後進行組合。

冷熱集羣架構推薦:

節點類型存儲目標建議磁盤類型內存/磁盤比率
熱節點搜索優化SSD DAS / SAN(> 200Gb / s)1:30
暖節點存儲優化HDD DAS / SAN(〜100Gb / s)1:160
冷節點歸檔優化最便宜的 DAS / SAN(<100Gb / s)1:1000+

5.5 集羣節點角色劃分

Elasticsearch 節點執行一個或多個角色。通常,當集羣規模大時,每個節點分配一個具體角色很有意義。

您可以針對每個角色優化硬件,並防止節點爭奪資源。

同 2.2 章節。不再贅述。

6 小結

集羣規模和容量規劃的底層邏輯涉及到:

  • Elasticsearch 的基礎架構

  • 維繫 Elasticsearch 高效運轉的計算資源(CPU、內存、磁盤、網絡)

  • Elasticsearch 增刪改查的業務流程及資源耗費情況

  • Elasticsearch 數據索引化的核心流程 基於以上四點的整合,纔有了:集羣規模和容量規劃預估方法。

評估所需資源需要執行以下步驟:

步驟1:確定集羣的節點類型;

步驟2:對於不同節點類型(熱,暖,冷),確定以下規模的最大值:

  • 數據量

  • 分片數量

  • 索引吞吐量

  • 搜索吞吐量

步驟3:合併每一類型節點所需資源大小 注意:在任何專用節點上做出決策-主節點、協調節點、機器學習節點、路由節點。

:這是 Elastic 官方 2019 年 11 月份的視頻 內容的詳細梳理。

推薦過一遍視頻:

https://www.elastic.co/cn/webinars/elasticsearch-sizing-and-capacity-planning

微信公衆號回覆:容量規劃 下載 PPT

推薦:

Elastic中國開發者大會2019乾貨分享

重磅 | 死磕Elasticsearch方法論認知清單(2019國慶更新版)

https://elastic.blog.csdn.net/


更短時間更快習得更多幹貨!

發佈了365 篇原創文章 · 獲贊 2846 · 訪問量 341萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章