題記:
技術交流羣中有小夥伴說起:「es 節點默認1000 個分片的限制」?這引起了我對Elasticsearch 默認值的關注。html
我一搜沒關係:聊天記錄中涉及「默認」關鍵詞的討論接近 400 多處。node
這些默認值對於架構選型、開發實戰、運維排查性能問題等都有很好的借鑑價值,雖官方文檔都有詳細論述,但散落在各個角度。git
處於本能的好奇心,我認爲很是有必要結合本身的實戰經歷梳理出 Elasticsearch 最經常使用的默認值的適用場景、參數、默認值大小、靜態/動態參數類型、實戰建議等知識點。github
沒別的,讓更多人提早創建全局(相對)認知、少走彎路。redis
0、參數類型以及靜態和動態參數的區別?
0.1參數類型
參數類型分爲:集羣級別參數、索引級別、Maping級別參數等。算法
0.1.1集羣級別參數
舉例1 :cluster.max_shards_per_node
前綴是:cluster.*,修改針對集羣生效。api
舉例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 是動態參數。app
如下內容分別從:集羣層面、索引層面、映射層面、其餘經常使用逐步展開講解。
一、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
二、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)必定數據量級後,分片數量過少,沒法充分利用多節點資源,機器資源不均衡。
三、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
四、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)磁盤使用率也是監控的一個核心指標之一。
五、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
六、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」系統屬性來修改此限制。
七、ES 索引默認壓縮算法是?
適用場景:寫入數據壓縮。
參數:index.codec
參數類型:靜態參數。
默認值:LZ4
使用建議:
(1)能夠將其設置爲best_compression,它使用DEFLATE以得到更高的壓縮率,但代價是存儲字段的性能較慢。
(2)不追求壓縮效率,追求磁盤佔用比低的用戶推薦 best_compression 壓縮。
八、ES 索引默認副本分片數?
適用場景:確保業務數據的高可用性。
參數:index.number_of_replicas
參數類型:動態參數
默認值:1
使用建議:
根據業務須要合理設置副本,基於數據安全性考慮,建議副本至少設置1。
九、ES 索引默認的刷新頻率?
適用場景:寫入到可搜索的最小時間間隔(單位s)。
參數:index.refresh_interval
參數類型:動態參數。
默認最小值:1s。
使用建議:對於實時性要求不高且想優化寫入的業務場景,建議根據業務實際調大刷新頻率。
十、ES 索引 terms 默認最大支持的長度是?
適用場景:Terms query。
參數:index.max_terms_count
參數類型:動態參數
默認最大值:65536
使用建議:通常不會超過此最大值。
十一、ES 索引默認分頁返回最大條數?
適用場景:搜索的深度翻頁。
參數:index.max_result_window
參數類型:動態參數。
默認最大值:10000。
使用建議:
(1)深度翻頁的機制,決定了越日後越慢。除非特殊業務需求,不建議修改默認值,能夠參考百度和google的實現。
(2)所有數據遍歷推薦scroll API。僅支持向後翻頁推薦:Search After API。
十二、ES 索引默認管道有必要設置嗎?
適用場景:索引默認寫入數據環節加上 ETL 操做。
參數:index.default_pipeline
參數類型:動態參數
默認值:自定義管道
使用建議:
(1)結合實際業務須要,一些基礎須要ETL的功能建議加上。
(2)若是不加index.default_pipeline也能夠,update_by_query + 自定義 pipeline 結合也能實現。不過(1)是更周全、簡練的方案。
1三、ES 索引 Mapping 默認支持最大字段數?
使用場景:防止索引Maping 橫向無限增大,致使內存泄露等異常。
參數:index.mapping.total_fields.limit
參數類型:動態參數
默認最大值:1000
使用建議;不建議修改
1四、ES 索引 Mapping字段默認的最大深度?
使用場景:防止索引Maping 縱向無限增大,致使異常。
參數:index.mapping.depth.limit
參數類型:動態參數
默認最大值:20
使用建議;不建議修改
計算依據:例如,若是全部字段都在根對象級別定義,則深度爲1。若是有一個對象映射,則深度爲2,依此類推。默認值爲20。
1五、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類型。
1六、ES 索引動態Mapping條件下,匹配的字符串默認匹配的是?
適用場景:不提早設置Mapping精準字段的場景。
默認類型:text + keyword類型。
實戰舉例以下:
{
"my_index_0001" : {
"mappings" : {
"properties" : {
"cont" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
實際建議:建議結合業務須要,提早精準設置Mapping,並優化數據建模。
1七、ES 默認的評分機制是?
默認值:BM 25
除非業務須要,不然不建議修改。https://www.elastic.co/guide/en/elasticsearch/reference/current/similarity.html
1八、ES keyword類型默認支持的字符數是多少?
1)ES5.X版本之後,keyword支持的最大長度爲32766個UTF-8字符,text對字符長度沒有限制。
2)設置ignore_above後,超過給定長度後的數據將不被索引,沒法經過term精確匹配檢索返回結果。
https://blog.csdn.net/laoyang360/article/details/78207980
1九、爲何說,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
2一、ES客戶端請求的節點默認是?
若是不明確指定協調節點,默認請求的節點充當協調節點的角色。
每一個節點都隱式地是一個協調節點。協調節點:須要具備足夠的內存和CPU才能處理收集階段。
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
2二、ES 默認分詞器?
適用場景:不明確指定分詞器的場景。
默認類型:analyzer 分詞器。
實戰舉例以下:
POST /_analyze
{
"text": "屹立在東方之林",
"analyzer": "standard"
}
切分結果:
屹
立
在
東
方
之
林
實戰建議:_analyze API 在解決分詞問題中的做用巨大!
2三、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"
}
}
}
}
2四、ES 默認堆內存大小?
默認值:2gB,建議必定結合實際機器環境修改。
ES 建議獨立機器環境部署,不和其餘進程:如logstash,hadoop,redis等共享機器資源。
JVM設置建議:min(31GB, 機器內存的一半)
2五、ES JDK 什麼版本開始默認自帶的?
7.0 版本。7.0 版本以後開始默認捆綁了 JDK(安裝包裏自帶JDK),所以咱們能夠不單獨安裝 JDK。
小結
沒有別的,我就是好奇!
大而全的建議參考官方文檔,上述25個默認值都是死磕Elasticsearch交流羣中提到的實戰問題。