開(kāi)源Elasticsearch FAQ
本文列舉了一些開(kāi)源Elasticsearch(ES)相關(guān)的常見(jiàn)問(wèn)題,例如,如何配置索引線程池大小,如何重新分配索引分片,如何批量刪除索引等。
常見(jiàn)問(wèn)題概覽
如何配置索引線程池大小?
在YML參數(shù)配置中,指定thread_pool.write.queue_size參數(shù)的大小即可。具體操作步驟,請(qǐng)參見(jiàn)配置YML參數(shù)。
對(duì)于6.x以下版本的Elasticsearch集群,需要使用thread_pool.index.queue_size參數(shù)。
出現(xiàn)內(nèi)存溢出OOM(OutOfMemory)的錯(cuò)誤,如何處理?
通過(guò)以下命令清理緩存,然后觀察具體原因,根據(jù)原因升配集群或調(diào)整業(yè)務(wù)。
curl -u elastic:<password> -XPOST "localhost:9200/<index_name>/_cache/clear?pretty"
變量名 | 說(shuō)明 |
| 阿里云Elasticsearch實(shí)例的密碼,為您在創(chuàng)建Elasticsearch實(shí)例時(shí)設(shè)置的密碼,或初始化Kibana時(shí)指定的密碼。 |
| 索引名稱。 |
如何手動(dòng)對(duì)shard進(jìn)行操作?
使用reroute API,或通過(guò)Cerebro進(jìn)行操作。具體操作步驟,請(qǐng)參見(jiàn)Cluster reroute API和Cerebro。
Elasticsearch的緩存清除策略有哪些?
Elasticsearch支持以下三種緩存清除策略:
清除全部緩存
curl localhost:9200/_cache/clear?pretty
清除單一索引緩存
curl localhost:9200/<index_name>/_cache/clear?pretty
清除多索引緩存
curl localhost:9200/<index_name1>,<index_name2>,<index_name3>/_cache/clear?pretty
如何重新分配索引分片(reroute)?
當(dāng)出現(xiàn)分片丟失、分片錯(cuò)誤等分片問(wèn)題時(shí),您可以執(zhí)行以下命令進(jìn)行reroute操作。
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
"commands" : [ {
"move" :
{
"index" : "test", "shard" : 0,
"from_node" : "node1", "to_node" : "node2"
}
},
{
"allocate" : {
"index" : "test", "shard" : 1, "node" : "node3"
}
}
]
}'
索引查詢時(shí),提示statusCode: 500
的錯(cuò)誤,如何處理?
建議您通過(guò)第三方插件進(jìn)行查詢(例如Cerebro):
查詢正常:說(shuō)明該錯(cuò)誤大概率是由于索引名稱不規(guī)范引起的。規(guī)范的索引名稱只包含英文、下劃線和數(shù)字,您可以通過(guò)修改索引名稱來(lái)修復(fù)此問(wèn)題。
查詢不正常:說(shuō)明索引或集群本身存在問(wèn)題。請(qǐng)確保集群中存在該索引,且集群處于正常狀態(tài)。
如何修改自動(dòng)創(chuàng)建索引auto_create_index
參數(shù)?
執(zhí)行以下命令修改。
PUT /_cluster/settings
{
"persistent" : {
"action": {
"auto_create_index": "false"
}
}
}
auto_create_index
參數(shù)的默認(rèn)值為false,表示不允許自動(dòng)創(chuàng)建索引。一般建議您不要調(diào)整該值,否則會(huì)引起索引太多、索引Mapping和Setting不符合預(yù)期等問(wèn)題。
OSS快照大概需要多久?
在集群的分片數(shù)、內(nèi)存、磁盤和CPU等正常的情況下,80 GB的索引數(shù)據(jù)進(jìn)行OSS快照,大約需要30分鐘。
創(chuàng)建索引時(shí),如何設(shè)置分片數(shù)?
建議您將單個(gè)分片存儲(chǔ)索引數(shù)據(jù)的大小控制在30 GB以內(nèi),不要超過(guò)50 GB,否則會(huì)極大降低查詢性能。根據(jù)上述建議,最終分片數(shù)量 = 數(shù)據(jù)總量/30 GB。
適當(dāng)提升分片數(shù)量可以提升建立索引的速度。分片數(shù)過(guò)多或過(guò)少,都會(huì)降低查詢速度,具體說(shuō)明如下:
分片數(shù)過(guò)多會(huì)導(dǎo)致需要打開(kāi)的文件比較多。由于分片是存儲(chǔ)在不同機(jī)器上的,因此分片數(shù)越多,各個(gè)節(jié)點(diǎn)之間的交互也就越多,導(dǎo)致查詢效率降低。
分片數(shù)過(guò)少會(huì)導(dǎo)致單個(gè)分片索引過(guò)大,降低整體的查詢效率。
自建Elasticsearch遷移數(shù)據(jù),使用elasticsearch-repository-oss插件遇到如下問(wèn)題,如何解決?
問(wèn)題:ERROR: This plugin was built with an older plugin structure. Contact the plugin author to remove the intermediate "elasticsearch" directory within the plugin zip
。
解決方案:將elasticsearch改名為elasticsearch-repository-oss, 然后復(fù)制到plugins目錄下。
如何調(diào)整Kibana可視化展示數(shù)據(jù)的時(shí)區(qū)?
您可以在Kibana中,通過(guò)轉(zhuǎn)換時(shí)區(qū)來(lái)調(diào)整服務(wù)器時(shí)間,如下圖(以6.7.0版本為例)。選擇時(shí)區(qū)如下圖所示。
Elasticsearch的Term查詢適用于哪種類型的數(shù)據(jù)?
Term為單詞級(jí)別的查詢,這些查詢通常用于結(jié)構(gòu)化的數(shù)據(jù),例如number、date、keyword等,而不是text。
全?文本查詢之前要先對(duì)文本內(nèi)容進(jìn)行分詞,而單詞級(jí)別的查詢直接在相應(yīng)字段的反向索引中精確查找,單詞級(jí)別的查詢一般用于數(shù)值、日期等類型的字段上。
使用ES的別名(aliases)功能需要注意哪些問(wèn)題?
需要將別名里索引的分片控制在1024個(gè)以內(nèi)。
在查詢過(guò)程中,出現(xiàn)報(bào)錯(cuò)too_many_buckets_exception
,如何處理?
報(bào)錯(cuò):"type": "too_many_buckets_exception", "reason": "Trying to create too many buckets. Must be less than or equal to: [10000] but was [10001]
問(wèn)題分析與解決方案:請(qǐng)參見(jiàn)控制聚合中創(chuàng)建的桶數(shù)。除了調(diào)整業(yè)務(wù)聚合的size大小,您還可以參見(jiàn)Increasing max_buckets for specific Visualizations來(lái)處理。
如何批量刪除索引?
默認(rèn)情況下,Elasticsearch不允許批量刪除索引,需要通過(guò)以下命令手動(dòng)開(kāi)啟。開(kāi)啟后,您可以通過(guò)通配符進(jìn)行批量刪除操作。
PUT /_cluster/settings
{
"persistent": {
"action.destructive_requires_name": false
}
}
script.painless.regex.enabled參數(shù)能否修改?
此參數(shù)默認(rèn)值是false,不建議修改。如果要在painless腳本中使用正則表達(dá)式,需要在elasticsearch.yml中設(shè)置script.painless.regex.enabled參數(shù)為true。由于正則表達(dá)式會(huì)消耗大量資源,官方不建議使用,因此沒(méi)有打開(kāi)此參數(shù)。
如何修改Elasticsearch的mapping、主分片和副本分片數(shù)量?
已經(jīng)創(chuàng)建的索引修改mapping,建議通過(guò)reindex重建索引。
說(shuō)明mapping中支持的字段類型,請(qǐng)參見(jiàn)Data field type。
已經(jīng)創(chuàng)建的索引無(wú)法修改主分片,建議通過(guò)reindex重建索引修改。
說(shuō)明建議您在創(chuàng)建索引前規(guī)劃好分片數(shù),減少后期調(diào)整。
已經(jīng)創(chuàng)建的索引修改副本數(shù),可以參考以下命令修改:
PUT test/_settings { "number_of_replicas": 0 }
ES如何設(shè)置存儲(chǔ)某個(gè)字段?
除_source
字段,默認(rèn)情況下,ES不會(huì)單獨(dú)存儲(chǔ)字段值。如果需要獨(dú)立存儲(chǔ)某些字段,可以在索引的映射中將字段的store屬性設(shè)置為true。
ES的_source
字段包含原始JSON文檔,提供了從原始文檔檢索任何字段的能力。通常不推薦開(kāi)啟字段存儲(chǔ),以免增加磁盤空間的使用。
以存儲(chǔ)my_field
字段為例:
PUT / my_index {
"mappings": {
"properties": {
"my_field": {
"type": "text",
"store": true
}
}
}
}
ES如何設(shè)置某個(gè)字段是否可以參與聚合?
字段是否可以聚合通常取決于字段的類型和是否有相關(guān)的字段數(shù)據(jù)(doc_values或fielddata)可用。
數(shù)字字段、日期字段和keyword類型字段,默認(rèn)使用doc_values,默認(rèn)情況下可以聚合。
說(shuō)明doc_values是專為排序、聚合和腳本操作優(yōu)化的列存儲(chǔ)格式。
text類型字段,默認(rèn)情況下不支持聚合。如果您需要對(duì)text字段進(jìn)行聚合,必須在映射中啟用fielddata。
說(shuō)明開(kāi)啟fielddata會(huì)顯著增加內(nèi)存使用,因?yàn)樗鼤?huì)把所有的文本數(shù)據(jù)加載到內(nèi)存中。
PUT /my_index{ "mappings": { "properties": { "my_text_field": { "type": "text", "fielddata": true } } } }
如果您不希望某個(gè)字段參與聚合,可以根據(jù)您的應(yīng)用邏輯選擇以下任一方式:
通過(guò)設(shè)置enabled屬性為false來(lái)排除整個(gè)對(duì)象字段。
選擇不將非聚合字段包含在文檔中。