Elasticsearch索引分片的数量及大小分配策略
文章目錄
- 1、分片的基本認(rèn)知
- 2、分片創(chuàng)建策略
- 3、分片分配的基本策略
- 4、分片的數(shù)量分配多少
- 5、分片的大小決策
- 6、重要的配置
- 6.1 自定義屬性
- 6.2 索引級(jí)配置
- 6.3 集群級(jí)配置
- 7、索引分片分配:Index Shard Allocation
- 7.1 分片均衡策略:shard rebalance
- 7.2 延遲分配策略(默認(rèn)1m):
- 7.3 分片過(guò)濾:即(Shard allocation filtering,控制那個(gè)分片分配給哪個(gè)節(jié)點(diǎn))。
- 7.4 分片分配感知策略:Shard Allocation Awareness
- 7.5 強(qiáng)制感知策略:Forced awareness
1、分片的基本認(rèn)知
Shard即數(shù)據(jù)分片,是ES的數(shù)據(jù)載體。在ES中數(shù)據(jù)分為primary shard(主分片)和replica shard(副本分片),每一個(gè)primary承載單個(gè)索引的一部分?jǐn)?shù)據(jù),分布于各個(gè)節(jié)點(diǎn),replica為某個(gè)primary的副本,即備份。分片分配的原則是盡量均勻的分配在集群中的各個(gè)節(jié)點(diǎn),以最大程度降低部分shard在出現(xiàn)意外時(shí)對(duì)整個(gè)集群乃至服務(wù)造成的影響。
每個(gè)分片就是一個(gè)Lucene的實(shí)例,具有完整的功能。
2、分片創(chuàng)建策略
分片產(chǎn)生的目的是為了實(shí)現(xiàn)分布式,而分布式的好處之一就是實(shí)現(xiàn)“高可用性”(還包括高性能如提高吞吐量等會(huì)再后面內(nèi)容展開(kāi)講),分片的分配策略極大程度上都是圍繞如何提高可用性而來(lái)的,如分片分配感知、強(qiáng)制感知等。
互聯(lián)網(wǎng)開(kāi)發(fā)沒(méi)有“銀彈”,分片的數(shù)量分配也沒(méi)有適用于所有場(chǎng)景的最佳值,創(chuàng)建分片策略的最佳方法是使用您在生產(chǎn)中看到的相同查詢和索引負(fù)載在生產(chǎn)硬件上對(duì)生產(chǎn)數(shù)據(jù)進(jìn)行基準(zhǔn)測(cè)試。分片的分配策略主要從兩個(gè)指標(biāo)來(lái)衡量:即數(shù)量和單個(gè)分片的大小。
3、分片分配的基本策略
- ES使用數(shù)據(jù)分片(shard)來(lái)提高服務(wù)的可用性,將數(shù)據(jù)分散保存在不同的節(jié)點(diǎn)上以降低當(dāng)單個(gè)節(jié)點(diǎn)發(fā)生故障時(shí)對(duì)數(shù)據(jù)完整性的影響,同時(shí)使用副本(repiica)來(lái)保證數(shù)據(jù)的完整性。關(guān)于分片的默認(rèn)分配策略,在7.x之前,默認(rèn)5個(gè)primary shard,每個(gè)primary shard默認(rèn)分配一個(gè)replica,即5主1副,而7.x之后,默認(rèn)1主1副
- ES在分配單個(gè)索引的分片時(shí)會(huì)將每個(gè)分片盡可能分配到更多的節(jié)點(diǎn)上。但是,實(shí)際情況取決于集群擁有的分片和索引的數(shù)量以及它們的大小,不一定總是能均勻地分布。
- Paimary只能在索引創(chuàng)建時(shí)配置數(shù)量,而replica可以在任何時(shí)間分配,并且primary支持讀和寫(xiě)操作,而replica只支持客戶端的讀取操作,數(shù)據(jù)由es自動(dòng)管理,從primary同步。
- ES不允許Primary和它的Replica放在同一個(gè)節(jié)點(diǎn)中,并且同一個(gè)節(jié)點(diǎn)不接受完全相同的兩個(gè)Replica
- 同一個(gè)節(jié)點(diǎn)允許多個(gè)索引的分片同時(shí)存在。
4、分片的數(shù)量分配多少
- 避免分片過(guò)多:大多數(shù)搜索會(huì)命中多個(gè)分片。每個(gè)分片在單個(gè) CPU 線程上運(yùn)行搜索。雖然分片可以運(yùn)行多個(gè)并發(fā)搜索,但跨大量分片的搜索會(huì)耗盡節(jié)點(diǎn)的搜索線程池。這會(huì)導(dǎo)致低吞吐量和緩慢的搜索速度。
- 分片越少越好:每個(gè)分片都使用內(nèi)存和 CPU 資源。在大多數(shù)情況下,一小組大分片比許多小分片使用更少的資源。
5、分片的大小決策
- 分片的合理容量:10GB-50GB。雖然不是硬性限制,但 10GB 到 50GB 之間的分片往往效果很好。根據(jù)網(wǎng)絡(luò)和用例,也許可以使用更大的分片。在索引的生命周期管理中,一般設(shè)置50GB為單個(gè)索引的最大閾值。
- 堆內(nèi)存容量和分片數(shù)量的關(guān)聯(lián):小于20分片/每GB堆內(nèi)存,一個(gè)節(jié)點(diǎn)可以容納的分片數(shù)量與節(jié)點(diǎn)的堆內(nèi)存成正比。例如,一個(gè)擁有 30GB 堆內(nèi)存的節(jié)點(diǎn)最多應(yīng)該有 600 個(gè)分片。如果節(jié)點(diǎn)超過(guò)每 GB 20 個(gè)分片,考慮添加另一個(gè)節(jié)點(diǎn)。
查詢當(dāng)前節(jié)點(diǎn)堆內(nèi)存大小:
GET _cat/nodes?v=true&h=heap.current- 避免重負(fù)載節(jié)點(diǎn):如果分配給特定節(jié)點(diǎn)的分片過(guò)多,會(huì)造成當(dāng)前節(jié)點(diǎn)為重負(fù)載節(jié)點(diǎn)
6、重要的配置
6.1 自定義屬性
node.attr.{attribute}如何查看節(jié)點(diǎn)屬性?
GET _cat/nodeattrs?v6.2 索引級(jí)配置
- index.routing.allocation.include.{attribute}:表示索引可以分配在包含多個(gè)值中其中一個(gè)的節(jié)點(diǎn)上。
- index.routing.allocation.require.{attribute}:表示索引要分配在包含索引指定值的節(jié)點(diǎn)上(通常一般設(shè)置一個(gè)值)。
- index.routing.allocation.exclude.{attribute}:表示索引只能分配在不包含所有指定值的節(jié)點(diǎn)上。
6.3 集群級(jí)配置
elasticsearch修改集群范圍設(shè)置提供兩種方式,
- persistent:永久性修改,persistent相關(guān)的修改保存在了/path.data/cluster.name/nodes/0/_state/global-n.st,如果想刪除設(shè)置,刪除此文件即可。
- transient:集群重啟后失效。
7、索引分片分配:Index Shard Allocation
7.1 分片均衡策略:shard rebalance
當(dāng)集群在每個(gè)節(jié)點(diǎn)上具有相同數(shù)量的分片而沒(méi)有集中在任何節(jié)點(diǎn)上的任何索引的分片時(shí),集群是平衡的。Elasticsearch 運(yùn)行一個(gè)稱為rebalancing 的自動(dòng)過(guò)程,它在集群中的節(jié)點(diǎn)之間移動(dòng)分片以改善其平衡。重新平衡遵循所有其他分片分配規(guī)則,例如分配過(guò)濾和強(qiáng)制意識(shí),這可能會(huì)阻止它完全平衡集群。在這種情況下,重新平衡會(huì)努力在您配置的規(guī)則內(nèi)實(shí)現(xiàn)最平衡的集群。如果您使用數(shù)據(jù)層然后 Elasticsearch 會(huì)自動(dòng)應(yīng)用分配過(guò)濾規(guī)則將每個(gè)分片放置在適當(dāng)?shù)膶又?。這些規(guī)則意味著平衡器在每一層內(nèi)獨(dú)立工作。
cluster.routing.rebalance.enable
(動(dòng)態(tài)) 為特定類型的分片啟用或禁用重新平衡:
- all -(默認(rèn))允許對(duì)所有類型的分片進(jìn)行分片平衡。
- primaries - 只允許主分片的分片平衡。
- replicas - 僅允許對(duì)副本分片進(jìn)行分片平衡。
- none - 任何索引都不允許進(jìn)行任何類型的分片平衡。
cluster.routing.allocation.allow_rebalance
(動(dòng)態(tài)) 指定何時(shí)允許分片重新平衡:
- always - 始終允許重新平衡。
- indices_primaries_active - 僅當(dāng)集群中的所有主節(jié)點(diǎn)都已分配時(shí)。
- indices_all_active -(默認(rèn))僅當(dāng)集群中的所有分片(主分片和副本)都被分配時(shí)。
7.2 延遲分配策略(默認(rèn)1m):
當(dāng)節(jié)點(diǎn)出于任何原因(有意或無(wú)意)離開(kāi)集群時(shí),主節(jié)點(diǎn)會(huì)做出以下反應(yīng)
- 將副本分片提升為主分片以替換節(jié)點(diǎn)上的任何主分片。
- 分配副本分片以替換丟失的副本(假設(shè)有足夠的節(jié)點(diǎn))。
- 在其余節(jié)點(diǎn)之間均勻地重新平衡分片。
這些操作旨在通過(guò)確保盡快完全復(fù)制每個(gè)分片來(lái)保護(hù)集群免受數(shù)據(jù)丟失。即使我們?cè)诠?jié)點(diǎn)級(jí)別和集群級(jí)別限制并發(fā)恢復(fù) ,這種“分片洗牌”仍然會(huì)給集群帶來(lái)很多額外的負(fù)載,如果丟失的節(jié)點(diǎn)可能很快就會(huì)返回,這可能是不必要的
7.3 分片過(guò)濾:即(Shard allocation filtering,控制那個(gè)分片分配給哪個(gè)節(jié)點(diǎn))。
- index.routing.allocation.include.{attribute}:表示索引可以分配在包含多個(gè)值中其中一個(gè)的至少節(jié)點(diǎn)上。
- index.routing.allocation.require.{attribute}:表示索引要分配在包含索引指定值的節(jié)點(diǎn)上(通常一般設(shè)置一個(gè)值)。
- index.routing.allocation.exclude.{attribute}:表示索引只能分配在不包含所有指定值的節(jié)點(diǎn)上。
7.4 分片分配感知策略:Shard Allocation Awareness
Shard Allocation Awareness的設(shè)計(jì)初衷是為了提高服務(wù)的可用性,通過(guò)自定義節(jié)點(diǎn)屬性作為感知屬性,讓 Elasticsearch 在分配分片時(shí)將物理硬件配置考慮在內(nèi)。如果 Elasticsearch 知道哪些節(jié)點(diǎn)位于同一物理服務(wù)器上、同一機(jī)架中或同一區(qū)域中,則它可以分離主副本分片,以最大程度地降低在發(fā)生故障時(shí)丟失數(shù)據(jù)的風(fēng)險(xiǎn)。
啟用分片感知策略
配置節(jié)點(diǎn)屬性
node.attr.rack_id: rack1通過(guò)以下設(shè)置告訴主節(jié)點(diǎn)在分配分片的時(shí)候需要考慮哪些屬性。這些信息會(huì)保存在每個(gè)候選節(jié)點(diǎn)的集群狀態(tài)信息中
PUT _cluster/settings {"persistent": {"cluster.routing.allocation.awareness.attributes": "rack_id"} }7.5 強(qiáng)制感知策略:Forced awareness
默認(rèn)情況下,如果一個(gè)區(qū)域發(fā)生故障,Elasticsearch 會(huì)將所有故障的副本分片分配給其他區(qū)域。但是剩余區(qū)域可能沒(méi)有足夠的性能冗余來(lái)承載這些分片。
為了防止在發(fā)生故障時(shí)單個(gè)位置過(guò)載,您可以設(shè)置為cluster.routing.allocation.awareness.force不分配副本,直到另一個(gè)位置的節(jié)點(diǎn)可用。
部署強(qiáng)制感知策略
設(shè)置強(qiáng)制感知策略,告訴主節(jié)點(diǎn)當(dāng)前通過(guò)某個(gè)屬性來(lái)劃分區(qū)域,并且告知區(qū)域有哪些值
cluster.routing.allocation.awareness.attributes: zone cluster.routing.allocation.awareness.force.zone.values: zone1,zone2總結(jié)
以上是生活随笔為你收集整理的Elasticsearch索引分片的数量及大小分配策略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电子电路课程设计——8位数字抢答器设计论
- 下一篇: 医保找什么单位报销