集群級別的分片分配和路由設(shè)置
分片分配是將分片分配給節(jié)點(diǎn)的過程摹恨。這可能發(fā)生在初始恢復(fù)、副本分配、重新平衡或添加或刪除節(jié)點(diǎn)時(shí)埂材。
主節(jié)點(diǎn)的主要作用之一是決定將哪些分片分配給哪些節(jié)點(diǎn)亦歉,并在需要重新平衡集群時(shí)移動(dòng)分片之間的節(jié)點(diǎn)恤浪。
有許多設(shè)置可用于控制分片分配過程:
- 集群級別的分片分配設(shè)置控制分配和重新平衡操作。
- 基于磁盤的分片分配設(shè)置解釋了Elasticsearch如何考慮可用磁盤空間肴楷,以及相關(guān)的設(shè)置水由。
- 分片分配感知和強(qiáng)制感知控制分片如何分布在不同的機(jī)架或可用性區(qū)域。
- 集群級別的分片分配過濾允許排除某些節(jié)點(diǎn)或節(jié)點(diǎn)組赛蔫,以便它們可以被停用砂客。
除了這些,還有一些其他雜項(xiàng)的集群級別的設(shè)置呵恢。
集群級別的分片分配設(shè)置
您可以使用以下設(shè)置來控制分片分配和恢復(fù):
-
cluster.routing.allocation.enable
(動(dòng)態(tài))啟用或禁用特定類型分片的分配:- all -(默認(rèn))允許為所有類型的分片分配鞠值。
- primaries - 僅允許為主分片分配。
- new_primaries - 僅允許為新索引的主分片分配渗钉。
- none - 不允許任何索引的任何類型的分片分配彤恶。
此設(shè)置不影響重新啟動(dòng)節(jié)點(diǎn)時(shí)本地主分片的恢復(fù)钞钙。重新啟動(dòng)節(jié)點(diǎn)如果有未分配的主分片的副本將立即進(jìn)行恢復(fù),假設(shè)其分配ID與集群狀態(tài)中的活動(dòng)分配ID之一匹配声离。
-
cluster.routing.allocation.node_concurrent_incoming_recoveries
(動(dòng)態(tài))在節(jié)點(diǎn)上允許發(fā)生多少并發(fā)的傳入分片恢復(fù)芒炼。傳入恢復(fù)是目標(biāo)分片(很可能是副本,除非分片正在重定位)分配在節(jié)點(diǎn)上的情況术徊。默認(rèn)為2本刽。 -
cluster.routing.allocation.node_concurrent_outgoing_recoveries
(動(dòng)態(tài))在節(jié)點(diǎn)上允許發(fā)生多少并發(fā)的傳出分片恢復(fù)。傳出恢復(fù)是源分片(很可能是主分片弧关,除非分片正在重定位)分配在節(jié)點(diǎn)上的情況盅安。默認(rèn)為2。 -
cluster.routing.allocation.node_concurrent_recoveries
(動(dòng)態(tài))設(shè)置cluster.routing.allocation.node_concurrent_incoming_recoveries
和cluster.routing.allocation.node_concurrent_outgoing_recoveries
的快捷方式世囊。默認(rèn)為2别瞭。 -
cluster.routing.allocation.node_initial_primaries_recoveries
(動(dòng)態(tài))在副本的恢復(fù)發(fā)生在網(wǎng)絡(luò)上傳輸時(shí),重新啟動(dòng)節(jié)點(diǎn)后未分配的主分片的恢復(fù)使用來自本地磁盤的數(shù)據(jù)株憾。這些應(yīng)該很快蝙寨,因此可以在同一節(jié)點(diǎn)上并行進(jìn)行更多的初始主分片恢復(fù)。默認(rèn)為4嗤瞎。 -
cluster.routing.allocation.same_shard.host
(動(dòng)態(tài))如果為true墙歪,則禁止將同一主機(jī)上具有相同網(wǎng)絡(luò)地址的不同節(jié)點(diǎn)分配為分片的多個(gè)副本,即它們具有相同的網(wǎng)絡(luò)地址贝奇。默認(rèn)為false虹菲,這意味著有時(shí)可能將分片的副本分配給同一主機(jī)上的節(jié)點(diǎn)。此設(shè)置僅在每個(gè)主機(jī)上運(yùn)行多個(gè)節(jié)點(diǎn)時(shí)才相關(guān)掉瞳。
分片再平衡設(shè)置
當(dāng)集群在每個(gè)節(jié)點(diǎn)上有相等數(shù)量的分片毕源,所有節(jié)點(diǎn)需要相等的資源,而不在任何節(jié)點(diǎn)上集中任何索引的分片時(shí)陕习,集群就是平衡的霎褐。Elasticsearch運(yùn)行一個(gè)名為再平衡的自動(dòng)過程,它在集群中的節(jié)點(diǎn)之間移動(dòng)分片该镣,以改善其平衡冻璃。再平衡遵循所有其他分片分配規(guī)則,如分配過濾和強(qiáng)制感知损合,這可能會(huì)阻止它完全平衡集群省艳。在這種情況下,再平衡會(huì)努力在您配置的規(guī)則內(nèi)實(shí)現(xiàn)盡可能平衡的集群嫁审。如果您使用數(shù)據(jù)層次跋炕,則Elasticsearch會(huì)自動(dòng)應(yīng)用分配過濾規(guī)則,將每個(gè)分片放置在適當(dāng)?shù)膶哟沃型辆印_@些規(guī)則意味著均衡器在每個(gè)層次內(nèi)獨(dú)立工作。
您可以使用以下設(shè)置來控制集群中分片的再平衡:
-
cluster.routing.rebalance.enable
(動(dòng)態(tài))啟用或禁用特定類型分片的再平衡:- all -(默認(rèn))允許所有類型的分片進(jìn)行平衡。
- primaries - 僅允許對主分片進(jìn)行平衡擦耀。
- replicas - 僅允許對副本分片進(jìn)行平衡棉圈。
- none - 不允許任何索引的任何類型的分片進(jìn)行平衡。
-
cluster.routing.allocation.allow_rebalance
(動(dòng)態(tài))指定何時(shí)允許分片再平衡:- always - 始終允許再平衡眷蜓。
- indices_primaries_active - 僅在集群中分配了所有主分片時(shí)分瘾。
- indices_all_active -(默認(rèn))僅在集群中分配了所有分片(主分片和副本)時(shí)。
-
cluster.routing.allocation.cluster_concurrent_rebalance
(動(dòng)態(tài))定義在整個(gè)集群中允許多少并發(fā)分片再平衡吁系。默認(rèn)為2德召。請注意,此設(shè)置僅控制由于集群中的不平衡而導(dǎo)致的并發(fā)分片重定位的數(shù)量汽纤。此設(shè)置不限制由于分配過濾或強(qiáng)制感知而進(jìn)行的分片重定位上岗。 -
cluster.routing.allocation.type
選擇用于計(jì)算集群平衡的算法。默認(rèn)為desired_balance蕴坪,它選擇所需平衡分配器肴掷。此分配器運(yùn)行一個(gè)后臺(tái)任務(wù),計(jì)算集群中分片的所需平衡背传。一旦此后臺(tái)任務(wù)完成呆瞻,Elasticsearch就會(huì)將分片移動(dòng)到其所需的位置。
[8.8] 在8.8中棄用径玖。平衡分配器類型已棄用痴脾,不再推薦。也可以設(shè)置為balanced梳星,以選擇傳統(tǒng)的平衡分配器赞赖。這個(gè)分配器是Elasticsearch在8.6.0之前版本中的默認(rèn)分配器。它在前臺(tái)運(yùn)行丰泊,阻止主節(jié)點(diǎn)并行進(jìn)行其他工作薯定。它通過選擇一小部分立即改善集群平衡的分片移動(dòng),并在這些分片移動(dòng)完成后再次運(yùn)行并選擇另外一些分片移動(dòng)來工作瞳购。由于此分配器僅基于集群的當(dāng)前狀態(tài)做出決策话侄,因此在平衡集群時(shí),它有時(shí)會(huì)多次移動(dòng)分片学赛。
分片平衡啟發(fā)式設(shè)置
再平衡通過為每個(gè)節(jié)點(diǎn)計(jì)算其分片分配的權(quán)重年堆,然后在節(jié)點(diǎn)之間移動(dòng)分片以減小較重節(jié)點(diǎn)的權(quán)重并增加較輕節(jié)點(diǎn)的權(quán)重來實(shí)現(xiàn)。當(dāng)沒有可能的分片移動(dòng)可以將任何節(jié)點(diǎn)的權(quán)重與任何其他節(jié)點(diǎn)的權(quán)重之間的差異大于可配置的閾值時(shí)盏浇,集群就是平衡的变丧。
節(jié)點(diǎn)的權(quán)重取決于它持有的分片數(shù)量,以及這些分片的總估計(jì)資源使用量绢掰,以磁盤上的分片大小和支持向分片寫入流量所需的線程數(shù)量表示痒蓬。當(dāng)數(shù)據(jù)流的分片在滾動(dòng)時(shí)童擎,Elasticsearch在創(chuàng)建時(shí)估算了它們的資源使用情況。新分片的估計(jì)磁盤大小是數(shù)據(jù)流中其他分片的平均大小攻晒。新分片的估計(jì)寫入負(fù)載是數(shù)據(jù)流中最近分片的實(shí)際寫入負(fù)載的加權(quán)平均值顾复。不屬于數(shù)據(jù)流寫入索引的分片的估計(jì)寫入負(fù)載為零。
以下設(shè)置控制Elasticsearch如何將這些值組合成每個(gè)節(jié)點(diǎn)權(quán)重的整體度量鲁捏。
-
cluster.routing.allocation.balance.shard
(浮點(diǎn)數(shù)芯砸,動(dòng)態(tài))定義分配給每個(gè)節(jié)點(diǎn)的總分片數(shù)量的權(quán)重因子。默認(rèn)為0.45f给梅。提高此值會(huì)增加Elasticsearch均衡節(jié)點(diǎn)之間總分片數(shù)量的傾向假丧,超過其他平衡變量。 -
cluster.routing.allocation.balance.index
(浮點(diǎn)數(shù)动羽,動(dòng)態(tài))定義分配給每個(gè)節(jié)點(diǎn)的每個(gè)索引的分片數(shù)量的權(quán)重因子包帚。默認(rèn)為0.55f。提高此值會(huì)增加Elasticsearch均衡節(jié)點(diǎn)之間每個(gè)索引的分片數(shù)量的傾向曹质,超過其他平衡變量婴噩。 -
cluster.routing.allocation.balance.disk_usage
(浮點(diǎn)數(shù),動(dòng)態(tài))定義根據(jù)預(yù)測的字節(jié)大小平衡分片的權(quán)重因子羽德。默認(rèn)為2e-11f几莽。提高此值會(huì)增加Elasticsearch均衡節(jié)點(diǎn)之間總磁盤使用量的傾向,超過其他平衡變量宅静。 -
cluster.routing.allocation.balance.write_load
(浮點(diǎn)數(shù)章蚣,動(dòng)態(tài))定義每個(gè)分片的寫入負(fù)載的權(quán)重因子,以估計(jì)所需的索引線程數(shù)量表示姨夹。默認(rèn)為10.
基于磁盤的分片分配設(shè)置編輯
基于磁盤的分片分配器確保所有節(jié)點(diǎn)具有足夠的磁盤空間纤垂,而無需執(zhí)行比必要更多的分片移動(dòng)。它根據(jù)一對稱為低水位線和高水位線的閾值來分配分片磷账。其主要目標(biāo)是確保沒有節(jié)點(diǎn)超過高水位線峭沦,或者至少任何此類超出是暫時(shí)的。如果某個(gè)節(jié)點(diǎn)超過高水位線逃糟,Elasticsearch 將通過將其一些分片移動(dòng)到群集中的其他節(jié)點(diǎn)來解決這個(gè)問題吼鱼。
節(jié)點(diǎn)不時(shí)暫時(shí)超過高水位線是正常的。
分片分配器還通過禁止將更多分片分配給超過低水位線的節(jié)點(diǎn)來努力保持節(jié)點(diǎn)遠(yuǎn)離高水位線绰咽。重要的是菇肃,如果所有節(jié)點(diǎn)都超過了低水位線,那么將無法分配新的分片取募,Elasticsearch 將無法在節(jié)點(diǎn)之間移動(dòng)任何分片琐谤,以使磁盤使用率保持在高水位線以下。您必須確保群集總體上具有足夠的磁盤空間玩敏,并且始終有一些節(jié)點(diǎn)低于低水位線斗忌。
由基于磁盤的分片分配器觸發(fā)的分片移動(dòng)還必須符合所有其他分片分配規(guī)則质礼,例如分配過濾和強(qiáng)制感知。如果這些規(guī)則太嚴(yán)格织阳,它們還可能阻止用于保持節(jié)點(diǎn)磁盤使用量受控制的分片移動(dòng)几苍。如果您使用數(shù)據(jù)層,則 Elasticsearch 會(huì)自動(dòng)配置分配過濾規(guī)則陈哑,將分片放置在適當(dāng)?shù)膶又校@意味著基于磁盤的分片分配器在每個(gè)層內(nèi)部獨(dú)立工作伸眶。
如果某個(gè)節(jié)點(diǎn)的磁盤填滿得比 Elasticsearch 能夠?qū)⒎制苿?dòng)到其他位置更快惊窖,那么磁盤可能會(huì)完全填滿。為防止這種情況厘贼,作為最后的手段界酒,一旦磁盤使用量達(dá)到洪水階段水印,Elasticsearch 將阻止對受影響節(jié)點(diǎn)上具有分片的索引進(jìn)行寫入嘴秸。它還將繼續(xù)將分片移動(dòng)到群集中的其他節(jié)點(diǎn)毁欣。當(dāng)受影響節(jié)點(diǎn)上的磁盤使用量降到高水位線以下時(shí),Elasticsearch 將自動(dòng)移除寫入阻止岳掐。請參閱解決持續(xù)水印錯(cuò)誤以解決持久性水印錯(cuò)誤凭疮。
群集中的節(jié)點(diǎn)使用的磁盤空間量可能差異很大是正常的。群集的平衡僅取決于每個(gè)節(jié)點(diǎn)上的分片數(shù)量以及這些分片所屬的索引串述。它既不考慮這些分片的大小执解,也不考慮每個(gè)節(jié)點(diǎn)上的可用磁盤空間,原因如下:
磁盤使用會(huì)隨時(shí)間變化纲酗。平衡每個(gè)節(jié)點(diǎn)的磁盤使用量將需要更多的分片移動(dòng)衰腌,甚至可能浪費(fèi)之前的移動(dòng)。移動(dòng)分片會(huì)消耗 I/O 和網(wǎng)絡(luò)帶寬等資源觅赊,并可能從文件系統(tǒng)緩存中驅(qū)逐數(shù)據(jù)右蕊。最好將這些資源用于處理您的搜索和盡可能處理索引。
每個(gè)節(jié)點(diǎn)上的磁盤使用相等的群集通常性能不比磁盤使用不均勻的群集好吮螺,只要沒有磁盤過滿饶囚。
您可以使用以下設(shè)置來控制基于磁盤的分配:
cluster.routing.allocation.disk.threshold_enabled
(動(dòng)態(tài))默認(rèn)為 true。設(shè)置為 false 以禁用磁盤分配決策者规脸。禁用后坯约,它還將刪除任何現(xiàn)有的 index.blocks.read_only_allow_delete 索引塊。
cluster.routing.allocation.disk.watermark.low logo cloud
(動(dòng)態(tài))控制磁盤使用的低水位線莫鸭。默認(rèn)為 85%闹丐,這意味著 Elasticsearch 不會(huì)將分片分配給磁盤使用率超過 85% 的節(jié)點(diǎn)。它還可以設(shè)置為比率值被因,例如 0.85卿拴。也可以設(shè)置為絕對字節(jié)值(如 500mb)衫仑,以防止 Elasticsearch 在可用空間低于指定量時(shí)分配分片。此設(shè)置對于新創(chuàng)建的索引的主分片沒有影響堕花,但會(huì)阻止其副本的分配文狱。
cluster.routing.allocation.disk.watermark.low.max_headroom
(動(dòng)態(tài))控制低水位線的最大余地(在百分比/比率值的情況下)。當(dāng) cluster.routing.allocation.disk.watermark.low 沒有明確設(shè)置時(shí)缘挽,默認(rèn)為 200GB瞄崇。這限制所需的可用空間量。
cluster.routing.allocation.disk.watermark.high logo cloud
(動(dòng)態(tài))控制高水位線壕曼。默認(rèn)為 90%苏研,這意味著 Elasticsearch 將嘗試將分片從磁盤使用率超過 90% 的節(jié)點(diǎn)中重新定位。它還可以設(shè)置為比率值腮郊,例如 0.9摹蘑。也可以設(shè)置為絕對字節(jié)值(類似于低水位線),以在節(jié)點(diǎn)的可用空間低于指定量時(shí)重新定位分片轧飞。此設(shè)置影響所有分配的分片衅鹿,無論之前是否分配。
cluster.routing.allocation.disk.watermark.high.max_headroom
(動(dòng)態(tài))控制高水位線的最大余地(在百分比/比率值的情況下)过咬。當(dāng) cluster.routing.allocation.disk.watermark.high 沒有明確設(shè)置時(shí)大渤,默認(rèn)為 150GB。這限制所需的可用空間量掸绞。
cluster.routing.allocation.disk.watermark.enable_for_single_data_node
(靜態(tài))在早期版本中兼犯,單數(shù)據(jù)節(jié)點(diǎn)群集在進(jìn)行分配決策
時(shí)默認(rèn)情況下會(huì)忽略磁盤水印。自 7.14 版本以來集漾,已棄用此行為切黔,并已在 8.0 版本中刪除。此設(shè)置的唯一有效值現(xiàn)在是 true具篇。該設(shè)置將在將來的版本中刪除纬霞。
cluster.routing.allocation.disk.watermark.flood_stage logo cloud
(動(dòng)態(tài))控制洪水階段水印,默認(rèn)為 95%驱显。Elasticsearch 在每個(gè)節(jié)點(diǎn)上分配了一個(gè)或多個(gè)分片的每個(gè)索引上強(qiáng)制執(zhí)行只讀索引塊(index.blocks.read_only_allow_delete)舶衬,并且至少有一個(gè)磁盤超過了洪水階段韧献。此設(shè)置是防止節(jié)點(diǎn)耗盡磁盤空間的最后手段置谦。當(dāng)磁盤利用率降到高水位線以下時(shí)纠脾,索引塊會(huì)自動(dòng)釋放。與低水位線和高水位線值類似栓霜,它還可以設(shè)置為比率值翠桦,例如 0.95,或絕對字節(jié)值。
重置 my-index-000001 索引上的只讀索引塊的示例:
PUT /my-index-000001/_settings
{
"index.blocks.read_only_allow_delete": null
}
# 或者使用 curl
curl -X PUT "localhost:9200/my-index-000001/_settings" -H 'Content-Type: application/json' -d '{
"index.blocks.read_only_allow_delete": null
}'
集群路由分配磁盤水印洪水階段最大余地
(動(dòng)態(tài))控制洪水階段水印的最大余地(在百分比/比率值的情況下)销凑。當(dāng) cluster.routing.allocation.disk.watermark.flood_stage 沒有明確設(shè)置時(shí)丛晌,默認(rèn)為 100GB。這限制所需的可用空間量斗幼。
您不能在 cluster.routing.allocation.disk.watermark.low澎蛛、cluster.routing.allocation.disk.watermark.high 和 cluster.routing.allocation.disk.watermark.flood_stage 設(shè)置中混合使用百分比/比率值和字節(jié)值。要么所有值都設(shè)置為百分比/比率值蜕窿,要么所有值都設(shè)置為字節(jié)值谋逻。此強(qiáng)制執(zhí)行是為了 Elasticsearch 可以驗(yàn)證這些設(shè)置在內(nèi)部是一致的,確保低磁盤閾值小于高磁盤閾值桐经,高磁盤閾值小于洪水階段閾值斤贰。max headroom 值也進(jìn)行了類似的比較檢查。
(動(dòng)態(tài))控制專用凍結(jié)節(jié)點(diǎn)的洪水階段水印次询,默認(rèn)為 95%。
(動(dòng)態(tài))控制專用凍結(jié)節(jié)點(diǎn)的洪水階段水印的最大余地(在百分比/比率值的情況下)瓷叫。當(dāng) cluster.routing.allocation.disk.watermark.flood_stage.frozen 沒有明確設(shè)置時(shí)屯吊,默認(rèn)為 20GB。這限制專用凍結(jié)節(jié)點(diǎn)上所需的可用空間量摹菠。
(動(dòng)態(tài))Elasticsearch 應(yīng)該多久檢查一次集群中每個(gè)節(jié)點(diǎn)的磁盤使用情況盒卸。默認(rèn)為 30s。
百分比值是指已用磁盤空間次氨,而字節(jié)值是指空閑磁盤空間蔽介。這可能會(huì)令人困惑,因?yàn)樗嵉沽烁吆偷偷暮x煮寡。例如虹蓄,將低水位線設(shè)置為 10GB,將高水位線設(shè)置為 5GB 是有意義的幸撕,但反過來則不是薇组。
將低水位線更新為至少有 100GB 空閑,將高水位線更新為至少有 50GB 空閑坐儿,將洪水階段水印更新為至少有 10GB 空閑律胀,并且每分鐘更新一次有關(guān)群集的信息的示例:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
}
# 或者使用 curl
curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d '{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
}'
關(guān)于水印的最大余地設(shè)置,請注意這僅適用于水印設(shè)置為百分比/比率的情況貌矿。max headroom 值的目的是限制在達(dá)到相應(yīng)水印之前所需的空閑磁盤空間炭菌。這對于具有較大磁盤的服務(wù)器特別有用,其中百分比/比率水印可能轉(zhuǎn)換為大量的免費(fèi)磁盤空間需求逛漫,而 max headroom 可以用于限制所需的免費(fèi)磁盤空間量黑低。例如,讓我們以洪水水印的默認(rèn)設(shè)置為例酌毡。它的默認(rèn)值是 95%投储,而洪水最大余地設(shè)置的默認(rèn)值是 100GB第练。這意味著:
對于較小的磁盤,例如 100GB玛荞,洪水水印將在達(dá)到 95% 時(shí)觸發(fā)娇掏,即在 5GB 的空閑空間時(shí)觸發(fā),因?yàn)?5GB 小于 100GB 的最大余地值勋眯。
對于較大的磁盤婴梧,例如 100TB,洪水水印將在 100GB 的空閑空間時(shí)觸發(fā)客蹋。這是因?yàn)?95% 的洪水水印單獨(dú)將需要 5TB 的免費(fèi)磁盤空間塞蹭,但該值被最大余地設(shè)置限制為 100GB。
最后讶坯,如果其相應(yīng)的水印設(shè)置沒有明確設(shè)置(因此番电,它們具有默認(rèn)的百分比值),則 max headroom 設(shè)置才具有其默認(rèn)值辆琅。如果水印被明確設(shè)置漱办,那么 max headroom 設(shè)置就不具有默認(rèn)值,并且如果需要婉烟,則需要明確設(shè)置娩井。
Shard allocation awareness(分片分配感知)
您可以使用自定義節(jié)點(diǎn)屬性作為感知屬性,以使Elasticsearch在分配分片時(shí)考慮到您的物理硬件配置似袁。如果Elasticsearch知道哪些節(jié)點(diǎn)位于同一物理服務(wù)器洞辣、同一機(jī)架或同一區(qū)域,它可以分發(fā)主分片及其副本分片昙衅,以最小化在發(fā)生故障時(shí)丟失所有分片副本的風(fēng)險(xiǎn)扬霜。
當(dāng)使用動(dòng)態(tài)的 cluster.routing.allocation.awareness.attributes
設(shè)置啟用分片分配感知時(shí),分片僅分配給為指定感知屬性設(shè)置了值的節(jié)點(diǎn)而涉。如果使用多個(gè)感知屬性畜挥,Elasticsearch在分配分片時(shí)會(huì)分別考慮每個(gè)屬性。
屬性值的數(shù)量確定在每個(gè)位置分配多少個(gè)分片副本婴谱。如果每個(gè)位置的節(jié)點(diǎn)數(shù)量不平衡蟹但,并且有很多副本,可能會(huì)導(dǎo)致副本分片無法分配谭羔。
啟用分片分配感知
要啟用分片分配感知:
- 使用自定義節(jié)點(diǎn)屬性指定每個(gè)節(jié)點(diǎn)的位置华糖。例如,如果您希望Elasticsearch在不同的機(jī)架上分發(fā)分片瘟裸,則可以在每個(gè)節(jié)點(diǎn)的
elasticsearch.yml
配置文件中設(shè)置一個(gè)名為rack_id
的感知屬性客叉。
node.attr.rack_id: rack_one
您還可以在啟動(dòng)節(jié)點(diǎn)時(shí)設(shè)置自定義屬性:
./bin/elasticsearch -Enode.attr.rack_id=rack_one
- 通過在每個(gè)主節(jié)點(diǎn)的
elasticsearch.yml
配置文件中設(shè)置cluster.routing.allocation.awareness.attributes
,告訴Elasticsearch在分配分片時(shí)考慮一個(gè)或多個(gè)感知屬性。
cluster.routing.allocation.awareness.attributes: rack_id
將多個(gè)屬性指定為逗號分隔的列表兼搏。
您還可以使用 cluster-update-settings
API 設(shè)置或更新群集的感知屬性卵慰。
使用此示例配置,如果您啟動(dòng)兩個(gè)節(jié)點(diǎn)佛呻,并將 node.attr.rack_id
設(shè)置為 rack_one
裳朋,然后創(chuàng)建一個(gè)具有 5 個(gè)主分片和每個(gè)主分片 1 個(gè)副本的索引,所有主分片和副本將分配到這兩個(gè)節(jié)點(diǎn)上吓著。
如果添加兩個(gè) node.attr.rack_id
設(shè)置為 rack_two
的節(jié)點(diǎn)鲤嫡,Elasticsearch將移動(dòng)分片到新節(jié)點(diǎn),確保(如果可能)相同分片的兩個(gè)副本不在同一機(jī)架上绑莺。
如果 rack_two
失敗并導(dǎo)致兩個(gè)節(jié)點(diǎn)都宕機(jī)暖眼,默認(rèn)情況下,Elasticsearch將丟失的分片副本分配給 rack_one
中的節(jié)點(diǎn)纺裁。為了防止在相同位置分配特定分片的多個(gè)副本诫肠,您可以啟用強(qiáng)制感知。
強(qiáng)制感知
默認(rèn)情況下欺缘,如果一個(gè)位置失敗栋豫,Elasticsearch會(huì)將所有缺失的副本分片分配給其余位置。盡管您可能在所有位置上有足夠的資源來托管主分片和副本分片浪南,但是單個(gè)位置可能無法托管所有分片。
為了防止在發(fā)生故障時(shí)使單個(gè)位置超負(fù)荷漱受,您可以設(shè)置 cluster.routing.allocation.awareness.force
络凿,以便在其他位置的節(jié)點(diǎn)可用之前不分配任何副本。
例如昂羡,如果您有一個(gè)名為 zone
的感知屬性絮记,并配置了位于 zone1
和 zone2
的節(jié)點(diǎn),您可以使用強(qiáng)制感知來防止 Elasticsearch 在僅有一個(gè)區(qū)域可用時(shí)分配副本:
cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: zone1,zone2
指定感知屬性的所有可能值虐先。
使用此示例配置怨愤,如果您啟動(dòng)兩個(gè)節(jié)點(diǎn),并將 node.attr.zone
設(shè)置為 zone1
蛹批,然后創(chuàng)建一個(gè)具有 5 個(gè)分片和每個(gè)分片 1 個(gè)副本的索引撰洗,Elasticsearch將創(chuàng)建該索引并分配 5 個(gè)主分片,但不分配副本腐芍。只有在具有 node.attr.zone
設(shè)置為 zone2
的節(jié)點(diǎn)可用時(shí)差导,才會(huì)分配副本。
集群級別的分片分配過濾
您可以使用集群級別的分片分配過濾來控制Elasticsearch從任何索引分配分片的位置猪勇。這些集群范圍的過濾器與每個(gè)索引的分配過濾器和分配感知一起應(yīng)用设褐。
分片分配過濾器可以基于自定義節(jié)點(diǎn)屬性或內(nèi)置的 _name、_host_ip、_publish_ip助析、_ip犀被、_host、_id 和 _tier 屬性外冀。
cluster.routing.allocation
設(shè)置是動(dòng)態(tài)的寡键,允許將活動(dòng)索引從一組節(jié)點(diǎn)移動(dòng)到另一組節(jié)點(diǎn)。僅當(dāng)可以在不違反其他路由約束的情況下進(jìn)行重新定位分片時(shí)锥惋,才會(huì)重新定位分片昌腰,例如永不在同一節(jié)點(diǎn)上分配主分片和副本分片。
集群級別的分片分配過濾的最常見用例是當(dāng)您想要停用節(jié)點(diǎn)時(shí)膀跌。為了在關(guān)閉節(jié)點(diǎn)之前將分片移出節(jié)點(diǎn)遭商,您可以創(chuàng)建一個(gè)通過其IP地址排除該節(jié)點(diǎn)的過濾器:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.exclude._ip": "10.0.0.1"
}
}
集群路由設(shè)置
-
cluster.routing.allocation.include.{attribute}
(動(dòng)態(tài))將分片分配給其{attribute}
具有逗號分隔值之一的節(jié)點(diǎn)。 -
cluster.routing.allocation.require.{attribute}
(動(dòng)態(tài))僅將分片分配給其{attribute}
具有逗號分隔值的所有節(jié)點(diǎn)捅伤。 -
cluster.routing.allocation.exclude.{attribute}
(動(dòng)態(tài))不要將分片分配給其{attribute}
具有逗號分隔值之一的節(jié)點(diǎn)劫流。
集群分配設(shè)置支持以下內(nèi)置屬性:
_name | Match nodes by node name |
---|---|
_host_ip | Match nodes by host IP address (IP associated with hostname) |
_publish_ip | Match nodes by publish IP address |
_ip | Match either _host_ip or _publish_ip |
_host | Match nodes by hostname |
_id | Match nodes by node id |
_tier | Match nodes by the node’s data tier role |
_tier 過濾基于節(jié)點(diǎn)角色。只有一部分角色是數(shù)據(jù)層角色丛忆,而通用數(shù)據(jù)角色將與任何層過濾匹配祠汇。有一部分角色是數(shù)據(jù)層角色,但通用數(shù)據(jù)角色將與任何層過濾匹配熄诡。
在指定屬性值時(shí)可很,您可以使用通配符,例如:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.exclude._ip": "192.168.2.*"
}
}