好奇?!Elasticsearch 25 個必知必會的默認值

題記:

技術交流羣中有小夥伴提及:“es 節點默認1000 個分片的限制”?這引發了我對Elasticsearch 默認值的關注。

我一搜不要緊:聊天記錄中涉及“默認”關鍵詞的討論接近 400 多處。

這些默認值對於架構選型、開發實戰、運維排查性能問題等都有很好的借鑑價值,雖官方文檔都有詳細論述,但散落在各個角度。

處於本能的好奇心,我認爲非常有必要結合自己的實戰經歷梳理出 Elasticsearch 最常用的默認值的適用場景、參數、默認值大小、靜態/動態參數類型、實戰建議等知識點。

沒別的,讓更多人提前建立全局(相對)認知、少走彎路。

0、參數類型以及靜態和動態參數的區別?

0.1參數類型

參數類型分爲:集羣級別參數、索引級別、Maping級別參數等。

0.1.1集羣級別參數

  • 舉例1 :cluster.max_shards_per_node

前綴是:cluster.*,修改針對集羣生效。

  • 舉例2:indices.query.bool.max_clause_count

需要在: elasticsearch.yml 配置文件中設置,重啓 ES 生效。

0.1.2 索引級別參數

  • 舉例:index.number_of_shards

  • 前綴是:index.*,修改針對索引生效。

0.2 區分靜態參數和動態參數

  • Elasticsearch 主分片數在索引創建之後,不可以修改(除非reindex)

index.number_of_shards 是靜態參數。

  • 但副本分片數,可以動態的藉助:update-index-settings API 任意調整。

index.number_of_replicas 是動態參數。

以下內容分別從:集羣層面、索引層面、映射層面、其他常用逐步展開講解。

1、ES 集羣 bool 類型默認支持最大子句個數?

  • 適用場景:N 多子句的bool 組合查詢,實現類似規則過濾的功能。

  • 參數:indices.query.bool.max_clause_count。

  • 參數類型:靜態參數(需要在elasticsearch.yml 中設置)

  • 默認最大值:1024。

  • 限制原因:爲了防止搜索子句過多而佔用過多的CPU和內存,導致集羣性能下降 。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-settings.html

2、ES 集羣數據節點支持默認分片數個數?

  • 適用場景:大數據量的集羣分片選型。

  • 參數:cluster.max_shards_per_node

  • 默認最大值:1000(7.X版本後)。

  • 擴展知識:(1)超大規模集羣會遇到這個問題:

1)每個節點可以存儲的分片數和可用的堆內存大小成正比關係。

2)Elastic 官方博客文章建議:堆內存和分片的配置比例爲1:20,舉例:30GB堆內存,最多可有600個分片。

https://www.elastic.co/guide/en/elasticsearch/reference/7.0/misc-cluster.html#cluster-shard-limit

https://github.com/elastic/kibana/issues/35529

(2)不合理分配可能問題:

1)分片數量過多,寫入放大,導致  bulk queue打滿,拒絕率上升;

2)一定數據量級後,分片數量過少,無法充分利用多節點資源,機器資源不均衡。

3、ES 集羣 index_buffer 默認比例是多少?

  • 適用場景:堆內存中索引緩衝區用於存儲新索引的文檔。填滿後,緩衝區中的文檔將寫入磁盤上的某個段。它在節點上的所有分片之間劃分。

  • 參數:

(1) indices.memory.index_buffer_size

(2) indices.memory.min_index_buffer_size

(3) indices.memory.max_index_buffer_size

  • 參數類型:靜態參數(需要在elasticsearch.yml 中設置)

  • 默認值:

(1)indices.memory.index_buffer_size: 10%

(2)indices.memory.min_index_buffer_size : 48 Mb

  • 使用建議:

(1)必須在集羣中的每個數據節點上進行配置。

(2)寫入優化中首選的優化參數之一,有助於提高寫入性能和穩定性。

https://www.elastic.co/guide/en/elasticsearch/reference/current/indexing-buffer.html

4、ES 默認磁盤使用率 85% 不再支持寫入數據嗎?

  • 適用場景:基於磁盤分配分片的參數之一,控制磁盤的使用率低警戒水位線值。

  • 參數:cluster.routing.allocation.disk.watermark.low/high/flood_stage

  • 默認值

(1)cluster.routing.allocation.disk.watermark.low:85%

(2)cluster.routing.allocation.disk.watermark.high:90%

(3)cluster.routing.allocation.disk.watermark.flood_stage:95%

  • 參數類型:集羣動態參數

  • 使用建議

(1)85%:禁止寫入;90%:索引分片遷移到其他可用節點;95%:索引只讀。

(2)磁盤使用率也是監控的一個核心指標之一。

5、ES 集羣 默認的 gc 方式?

  • 適用場景:寫入到可搜索的最小時間間隔(單位s)。

  • 默認參數:

-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
  • 使用建議

(1)官方建議:

目前,我們仍然認爲CMS垃圾收集器是大多數部署的最佳選擇,但是自ES 6.5.0(如果在JDK 11或更高版本上運行)以來,我們現在也支持G1GC。

https://github.com/elastic/elasticsearch/issues/44321

(2)配置位置:jvm.options, 優化參考 wood 大叔建議:更改爲

-XX:+UseG1GC
-XX:MaxGCPauseMillis=50

其中 -XX:MaxGCPauseMillis 是控制預期的最高GC時長,默認值爲 200ms ,如果線上業務特性對於GC停頓非常敏感,可以適當設置低一些。但是 這個值如果設置過小,可能會帶來比較高的cpu消耗。

G1 對於集羣正常運作的情況下減輕 G1 停頓對服務時延的影響還是很有效的,但是如果是 GC 導致集羣卡死,那麼很有可能換G1 也無法根本上解決問題。通常都是集羣的數據模型或者 Query 需要優化。

https://elasticsearch.cn/question/4589

6、ES 索引默認主分片分片大小?

  • 適用場景:數據存儲。

  • 參數:index.number_of_shards

  • 參數類型:靜態參數。

  • 默認值:1(7.X版本,早期版本是5);單索引最大支持分片數:1024。

  • 使用建議:

(1)只能在創建索引時設置此值。

(2)單索引1024個最大分片數的限制是一項安全限制,可防止因資源分配問題導致集羣不穩定。

(3)可通過在每個節點上指定export ES_JAVA_OPTS =“-Des.index.max_number_of_shards = 128”系統屬性來修改此限制。

7、ES 索引默認壓縮算法是?

  • 適用場景:寫入數據壓縮。

  • 參數:index.codec

  • 參數類型:靜態參數。

  • 默認值:LZ4

  • 使用建議:

(1)可以將其設置爲best_compression,它使用DEFLATE以獲得更高的壓縮率,但代價是存儲字段的性能較慢。

(2)不追求壓縮效率,追求磁盤佔用比低的用戶推薦 best_compression 壓縮。

8、ES 索引默認副本分片數?

  • 適用場景:確保業務數據的高可用性。

  • 參數:index.number_of_replicas

  • 參數類型:動態參數

  • 默認值:1

  • 使用建議:

根據業務需要合理設置副本,基於數據安全性考慮,建議副本至少設置1。

9、ES 索引默認的刷新頻率?

  • 適用場景:寫入到可搜索的最小時間間隔(單位s)。

  • 參數:index.refresh_interval

  • 參數類型:動態參數。

  • 默認最小值:1s。

  • 使用建議:對於實時性要求不高且想優化寫入的業務場景,建議根據業務實際調大刷新頻率。

10、ES 索引 terms 默認最大支持的長度是?

  • 適用場景:Terms query。

  • 參數:index.max_terms_count

  • 參數類型:動態參數

  • 默認最大值:65536

  • 使用建議:一般不會超過此最大值。

11、ES 索引默認分頁返回最大條數?

  • 適用場景:搜索的深度翻頁。

  • 參數:index.max_result_window

  • 參數類型:動態參數。

  • 默認最大值:10000。

  • 使用建議:

(1)深度翻頁的機制,決定了越往後越慢。除非特殊業務需求,不建議修改默認值,可以參考百度和google的實現。

(2)全部數據遍歷推薦scroll API。僅支持向後翻頁推薦:Search After API。

12、ES 索引默認管道有必要設置嗎?

  • 適用場景:索引默認寫入數據環節加上 ETL 操作。

  • 參數:index.default_pipeline

  • 參數類型:動態參數

  • 默認值:自定義管道

  • 使用建議:

(1)結合實際業務需要,一些基礎需要ETL的功能建議加上。

(2)如果不加index.default_pipeline也可以,update_by_query + 自定義 pipeline 結合也能實現。不過(1)是更周全、簡練的方案。

13、ES 索引 Mapping 默認支持最大字段數?

  • 使用場景:防止索引Maping 橫向無限增大,導致內存泄露等異常。

  • 參數:index.mapping.total_fields.limit

  • 參數類型:動態參數

  • 默認最大值:1000

  • 使用建議;不建議修改

14、ES 索引 Mapping字段默認的最大深度?

  • 使用場景:防止索引Maping 縱向無限增大,導致異常。

  • 參數:index.mapping.depth.limit

  • 參數類型:動態參數

  • 默認最大值:20

  • 使用建議;不建議修改

  • 計算依據:例如,如果所有字段都在根對象級別定義,則深度爲1。如果有一個對象映射,則深度爲2,依此類推。默認值爲20。

15、ES  索引 Mapping nested 默認支持大小?

  • 適用場景:nested 類型選型。

  • 參數:

(1)index.mapping.nested_fields.limit

一個索引最大支持的nested類型個數

(2)index.mapping.nested_objects.limit

一個nested類型支持的最大對象數

  • 參數類型:動態參數(已驗證)

  • 默認值:

(1)index.mapping.nested_fields.limit : 50

(2)index.mapping.nested_objects.limit : 10000

  • 使用建議:

(1)nested 的可能的性能問題不容小覷。

nested本質:每個嵌套對象都被索引爲一個單獨的Lucene文檔。如果我們爲包含100個用戶對象的單個文檔建立索引,則將創建101個Lucene文檔。

(2) nested 較 父子文檔不同之處:

如果子文檔頻繁更新,建議使用父子文檔。

如果子文檔不頻繁更新,查詢頻繁建議  nested類型。

16、ES 索引動態Mapping條件下,匹配的字符串默認匹配的是?

  • 適用場景:不提前設置Mapping精準字段的場景。

  • 默認類型:text + keyword類型。

  • 實戰舉例如下:

{
  "my_index_0001" : {
    "mappings" : {
      "properties" : {
        "cont" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}
  • 實際建議:建議結合業務需要,提前精準設置Mapping,並優化數據建模。

17、ES 默認的評分機制是?

  • 默認值:BM 25

  • 除非業務需要,否則不建議修改。https://www.elastic.co/guide/en/elasticsearch/reference/current/similarity.html

18、ES keyword類型默認支持的字符數是多少?

1)ES5.X版本以後,keyword支持的最大長度爲32766個UTF-8字符,text對字符長度沒有限制。

2)設置ignore_above後,超過給定長度後的數據將不被索引,無法通過term精確匹配檢索返回結果。

https://blog.csdn.net/laoyang360/article/details/78207980

19、爲什麼說,ES 默認不適用別名,不算入門ES?

一句話概括:別名可以零停機改造(經典技巧,無縫切換)。https://www.elastic.co/guide/en/elasticsearch/reference/6.8/indices-aliases.html

20、ES 集羣節點默認屬性值?

  • 默認:候選主節點、數據節點、Ingest節點、協調節點、機器學習節點(如果付費)的角色。

  • 建議:集羣規模到達一定量級後,一定要獨立設置專有的主節點、協調節點、數據節點。角色劃分清楚。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html

21、ES客戶端請求的節點默認是?

  • 如果不明確指定協調節點,默認請求的節點充當協調節點的角色。

  • 每個節點都隱式地是一個協調節點。協調節點:需要具有足夠的內存和CPU才能處理收集階段。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html

22、ES 默認分詞器?

  • 適用場景:不明確指定分詞器的場景。

  • 默認類型:analyzer 分詞器。

  • 實戰舉例如下:

POST /_analyze
{
  "text": "屹立在東方之林",
  "analyzer": "standard"
}

切分結果:

屹
立
在
東
方
之
林
  • 實戰建議:_analyze API 在解決分詞問題中的作用巨大!

23、ES 聚合默認UTC時間,可以修改嗎?

  • 可以聚合時候修改,設置時區 time_zone即可解決。

  • "+08:00": 代表東8區。

GET my_index/_search?size=0
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field":     "date",
        "calendar_interval":  "day",
        "time_zone": "+08:00"
      }
    }
  }
}

24、ES 默認堆內存大小?

  • 默認值:2gB,建議一定結合實際機器環境修改。

  • ES 建議獨立機器環境部署,不和其他進程:如logstash,hadoop,redis等共享機器資源。

  • JVM設置建議:min(31GB, 機器內存的一半)

25、ES JDK 什麼版本開始默認自帶的?

7.0 版本。7.0 版本之後開始默認捆綁了 JDK(安裝包裏自帶JDK),因此我們可以不單獨安裝 JDK。

小結

沒有別的,我就是好奇!

大而全的建議參考官方文檔,上述25個默認值都是死磕Elasticsearch交流羣中提到的實戰問題。

您的實戰中有遇到默認值的困惑,歡迎留言交流。

索引(動態/靜態)設置參考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

中國通過 Elastic 認證人數最多的圈子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章