ES shards分片管理
點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了?。?!
分片(shard)-- 分片是單個(gè)Lucene實(shí)例,這是Elasticsearch管理的比較底層的功能。一個(gè)索引可以存儲(chǔ)很大的數(shù)據(jù),這些空間可能超過(guò)一個(gè)節(jié)點(diǎn)的物理存儲(chǔ)限制。為了解決這一問(wèn)題,Elasticsearch將索引分解成多個(gè)分片。每個(gè)分片是一個(gè)全功能的、獨(dú)立的單元,可以托管在集群中的任何數(shù)據(jù)節(jié)點(diǎn)。主分片(primary shard)-- 每個(gè)文檔都存儲(chǔ)在一個(gè)分片中,當(dāng)你存儲(chǔ)一個(gè)文檔的時(shí)候,系統(tǒng)會(huì)首先存儲(chǔ)在主分片中,然后會(huì)復(fù)制導(dǎo)不同的副本中。默認(rèn)情況下,一個(gè)索引有5個(gè)主分片??梢允孪榷ㄖ品制瑪?shù)量,當(dāng)分片一旦建立,則分片的數(shù)據(jù)不能修改。副本分片(replica shard)-- 每一給分片有零個(gè)或多個(gè)副本。副本主要是主分片的復(fù)制,其中有兩個(gè)目的:增加高可用性:當(dāng)主分片故障的時(shí)候,可以從副本分片中選擇一個(gè)作為主分片。
提高性能:當(dāng)查詢的時(shí)候可以到主分片或者副本分片中進(jìn)行查詢,提高查詢速度。
默認(rèn)情況下,一個(gè)主分片配有一個(gè)副本,但副本的數(shù)量可以在后面動(dòng)態(tài)的配置增加。副本分片必須部署在不同的節(jié)點(diǎn)上,不能部署在和主分片相同的節(jié)點(diǎn)上,這個(gè)是由Elasticsearch自動(dòng)控制,并且副本不要和主分片部署在同一主機(jī)上,否則在極端情況下會(huì)存在索引數(shù)據(jù)丟失的情況,這個(gè)是由Elasticsearch參數(shù)來(lái)控制的(cluster.routing.allocation.same_shard.host: true)。
每個(gè)索引和每個(gè)分片都需要一些內(nèi)存和 CPU 資源。在大多數(shù)情況下,一小組大分片比許多小分片使用更少的資源。較大的分片在失敗后需要更長(zhǎng)的時(shí)間才能恢復(fù)。當(dāng)一個(gè)節(jié)點(diǎn)發(fā)生故障時(shí),Elasticsearch 會(huì)在數(shù)據(jù)層的剩余節(jié)點(diǎn)之間重新平衡該節(jié)點(diǎn)的分片。此恢復(fù)過(guò)程通常涉及通過(guò)網(wǎng)絡(luò)復(fù)制分片內(nèi)容,因此 100GB 分片的恢復(fù)時(shí)間是 50GB 分片的兩倍。相比之下,小分片會(huì)帶來(lái)更多的開銷并且搜索效率較低。搜索 50 個(gè) 1GB 分片將比搜索包含相同數(shù)據(jù)的單個(gè) 50GB 分片占用更多的資源。分片大小沒(méi)有硬性限制,但經(jīng)驗(yàn)表明 10GB 到 50GB 之間的分片通常適用于日志和時(shí)間序列數(shù)據(jù)。根據(jù)實(shí)際的網(wǎng)絡(luò)和用例,可能能夠使用更大的分片。2. 每 GB 堆內(nèi)存 20 個(gè)或更少的分片。數(shù)據(jù)節(jié)點(diǎn)可以容納的分片數(shù)量與節(jié)點(diǎn)的堆內(nèi)存成正比。例如,具有 30GB 堆內(nèi)存的節(jié)點(diǎn)最多應(yīng)該有 600 個(gè)分片。分片數(shù)越低于此限制越好。如果發(fā)現(xiàn)數(shù)據(jù)節(jié)點(diǎn)超過(guò)每 GB 20 個(gè)分片,請(qǐng)考慮添加另一個(gè)節(jié)點(diǎn)。3.1 避免使用非常大的分片,因?yàn)檫@會(huì)對(duì)群集從故障中恢復(fù)的能力產(chǎn)生負(fù)面影響。對(duì)分片的大小沒(méi)有固定的限制,但是通常情況下很多場(chǎng)景限制在 50GB 的分片大小以內(nèi)。3.2 分片數(shù)不是越多越好,每個(gè)分片都需要占用資源,數(shù)據(jù)量小的索引分配盡量少的分片。3.3 如果擔(dān)心數(shù)據(jù)的快速增長(zhǎng), 建議根據(jù)這條限制: ElasticSearch推薦的最大JVM堆空間 是 30~32G, 所以把分片最大容量限制為 30GB, 然后再對(duì)分片數(shù)量做合理估算。例如, 如果的單個(gè)索引數(shù)據(jù)能達(dá)到 200GB, 則最多分配7到8個(gè)分片,一個(gè)數(shù)據(jù)節(jié)點(diǎn)可承載600個(gè)分片。3.4 當(dāng)數(shù)據(jù)量可以合理預(yù)測(cè)并且變化緩慢時(shí),具有固定時(shí)間間隔的基于時(shí)間的索引很有效。
1. 在非高峰時(shí)段強(qiáng)制合并如果不再寫入索引,則可以使用強(qiáng)制合并 API將較小的段合并為較大的段。這可以減少分片開銷并提高搜索速度。但是,強(qiáng)制合并是資源密集型的。所以最好在非高峰時(shí)間運(yùn)行強(qiáng)制合并。
強(qiáng)制合并指定索引
POST index_name/_forcemerge
強(qiáng)制合并多個(gè)索引
POST / index_name1,index_name2 / _forcemerge
強(qiáng)制合并所有索引
POST /_forcemerge
*僅在完成寫入索引后才應(yīng)針對(duì)索引調(diào)用強(qiáng)制合并。強(qiáng)制合并會(huì)導(dǎo)致生成非常大 (>5GB) 的段,如果您繼續(xù)寫入這樣的索引,那么自動(dòng)合并策略將永遠(yuǎn)不會(huì)考慮這些段以進(jìn)行未來(lái)的合并,直到它們主要由已刪除的文檔組成。這可能會(huì)導(dǎo)致非常大的段保留在索引中,從而導(dǎo)致磁盤使用量增加和搜索性能變差。如果不再寫入索引,則可以使用收縮索引 API來(lái)減少其分片數(shù)。如果啟用了 Elasticsearch 安全功能,則您必須具有索引的manage 索引權(quán)限。*索引的所有主分片必須駐留在同一節(jié)點(diǎn)上。*索引必須具有g(shù)reen 健康狀態(tài)。收縮索引 API 允許將現(xiàn)有索引收縮為具有更少主分片的新索引。目標(biāo)索引中請(qǐng)求的主分片數(shù)必須是源索引中分片數(shù)的一個(gè)因子。例如,具有 8主分片的索引可以縮小為4,2或者1主分片或具有15主分片的索引可以縮小為5,3或1。如果索引中的分片數(shù)量是素?cái)?shù),則只能將其縮小為單個(gè)主分片。在收縮之前,索引中每個(gè)分片的(主或副本)副本必須存在于同一節(jié)點(diǎn)上。建議收縮前關(guān)閉副本,收縮完成后再開啟副本,提高收縮速率。原索引test_20220125,5個(gè)主分片,一個(gè)副本,分片分布在es04和es03節(jié)點(diǎn)。關(guān)閉索引test_20220125副本,設(shè)置索引為只讀,將分片分配到es03節(jié)點(diǎn)。
curl -H "Content-Type: application/json" -XPUT -u elastic:qwer123 -s http://***.***.43.138:9200/test_20220125/_settings -d
{
"settings": {
"index.number_of_replicas": 0,
"index.routing.allocation.require._name": "es03",
"index.blocks.write": true
}
}
1)創(chuàng)建一個(gè)與源索引具有相同定義但主分片數(shù)量較少的新目標(biāo)索引。如果文件系統(tǒng)不支持硬鏈接,那么所有段都被復(fù)制到新索引中,這是一個(gè)更耗時(shí)的過(guò)程。另外,如果使用多個(gè)數(shù)據(jù)路徑,不同數(shù)據(jù)路徑上的分片需要完整的段副本文件,如果它們不在同一個(gè)磁盤上,因?yàn)橛叉溄硬荒芸绱疟P工作。
3)恢復(fù)目標(biāo)索引,就好像它是剛剛重新打開的已關(guān)閉索引一樣。將索引test_20220125收縮成索引test_20220208,因原索引主分片數(shù)為5,所以目標(biāo)索引主分片只能設(shè)置為1,并開啟目標(biāo)索引副本運(yùn)行讀寫。
curl -H "Content-Type: application/json" -XPOST -u elastic:qwer123 -s http://***.***.43.138:9200/test_20220125/_shrink/test_20220208 -d
{
"settings": {
"index.routing.allocation.require._name": null,
"index.blocks.write": null,
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression"
}
}
參數(shù)best_compression僅在對(duì)索引進(jìn)行新寫入時(shí)才會(huì)生效,例如在將分片強(qiáng)制合并到單個(gè)段時(shí)。
a. 監(jiān)控收縮過(guò)程
_cat recovery 可以使用API監(jiān)控收縮過(guò)程,或者通過(guò)將 參數(shù)設(shè)置為 ,使用cluster healthAPI等待所有主分片分配完畢 。wait_for_statusyellow_shrink一旦目標(biāo)索引被添加到集群狀態(tài),API 就會(huì)在分配任何分片之前返回。此時(shí),所有分片都處于狀態(tài)unassigned。如果出于任何原因,無(wú)法在收縮節(jié)點(diǎn)上分配目標(biāo)索引,則其主分片將保留 unassigned,直到可以在該節(jié)點(diǎn)上分配為止。分配主分片后,它會(huì)移動(dòng)到 state initializing,然后收縮過(guò)程開始。收縮操作完成后,分片將變?yōu)閍ctive. 此時(shí),Elasticsearch 將嘗試分配任何副本,并可能決定將主分片重新定位到另一個(gè)節(jié)點(diǎn)。(測(cè)試環(huán)境索引數(shù)據(jù)量小,收縮速度很快,并未監(jiān)測(cè)到這個(gè)數(shù)據(jù))b. 刪除原索引
curl -XDELETE -u elastic:qwer123 -s http://***.***.43.138:9200/test_20220125?pretty
使用reindex API將具有相似映射的索引組合成一個(gè)大索引。對(duì)于時(shí)間序列數(shù)據(jù),您可以將較短時(shí)間段的索引重新索引為涵蓋較長(zhǎng)時(shí)間段的新索引。例如,可以將2月的每日索引重新new_index_20220208_1和new_index_20220208_2編入每月new_index_20220208索引。重新索引后,刪除原索引。原索引new_index_20220208_1和new_index_20220208_2信息。將索引new_index_20220208_1和new_index_20220208_2合并為new_index_20220208。
curl -H "Content-Type: application/json" -XPOST -u elastic:qwer123 -s http://***.***.43.139:9200/_reindex -d
{
"source": {
"index": "new_index_20220208_*"
},
"dest": {
"index": "new_index_20220208"
}
}
刪除原索引new_index_20220208_1和new_index_20220208_2。
curl -XDELETE -u elastic:qwer123 -s http://***.***.43.138:9200/new_index_20220208_1?pretty
curl -XDELETE -u elastic:qwer123 -s http://***.***.43.138:9200/new_index_20220208_2?pretty
this action would add [x] total shards, but this cluster currently has [y]/[z] maximum shards open;
此錯(cuò)誤表示添加索引操作將超出集群最大分片數(shù)限制。可以通過(guò)參數(shù)cluster.max_shards_per_node調(diào)整集群最大開放分片數(shù)。最大分片數(shù)=cluster.max_shards_per_node*數(shù)據(jù)節(jié)點(diǎn)數(shù)。
curl -H "Content-Type: application/json" -XPUT -u elastic:qwer123 -s http://***.***.43.139:9200/_cluster/settings -d
{
"persistent" : {
"cluster.max_shards_per_node": 1200
}
}
本文來(lái)源:IT那活兒(上海新炬王翦團(tuán)隊(duì))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129637.html