ElasticSearch模块Cluster

本文深入解析了Elasticsearch中索引碎片分配的机制,包括集群碎片分配、相关配置参数及自定义分片分布规则。通过设置如cluster.routing.allocation.enable等参数,实现对分片的灵活控制。此外,介绍了如何利用shardallocationawareness自定义分片分布规则,以及如何应用forcedawareness和shardallocationfiltering进行更精细的分片控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.   shard allocation

集群碎片分配是指将索引碎片分配到其他节点的过程,如下情况:集群故障恢复、副本分配、索引动态均衡(节点增加或者减少后自动进行)都会执行索引碎片的重新分配。

如下对相关配置进行介绍:

cluster.routing.allocation.allow_rebalance

设置根据集群中机器的状态来重新分配分片,可以设置为可以设置为always, indices_primaries_active和indices_all_active,默认是设置成indices_all_active来减少集群初始启动时机器之间的交互。

cluster.routing.allocation.cluster_concurrent_rebalance 

设置在集群中最大允许同时进行分片分布的个数,默认为2,也就是说整个集群最多有两个分片在进行重新分布。

cluster.routing.allocation.node_initial_primaries_recoveries:

设置node级别上初始化数据恢复过程中并发的主分片数量,大多情况下是local gateway,这个过程会很快,因此可以在不增加负载的情况下处理更多的主分片。

cluster.routing.allocation.node_concurrent_recoveries 

设置在节点中最大允许同时进行分片分布的个数,默认为2

cluster.routing.allocation.enable:

指定哪些分片可以参与重新分配。选项有:all(default), primaries(主分片), new_primaries(新增加的主分片), none.

cluster.routing.allocation.disable_allocation 

使主要分片或副本的分布失效。要知道,如果主分片不存在(那个节点挂了)那么其副本仍然会被提升为主分片,这个设置只有在动态地使用集群更新设置api调用时才生效。

cluster.routing.allocation.disable_replica_allocation 

使副本分布失效。和上一个设置一样,只有动态地使用集群更新设置api调用时才生效。

cluster.routing.allocation.same_shard.host

是否启用对同一分片在同一个主机上出现多个分配实例的检测。默认false。这个选项只有在同一个node上启动多个es实例的情况下才有意义。

indices.recovery.concurrent_stream

当从一个点(peer)恢复分片时当前节点最多允许的文件读取流的个数,默认为5

2.   shard allocation awareness

自定义分片分布规则,可以通过设置分片的分布规则来人为地影响分片的分布,下面是个例子:

假设我们有几个机架。当我们启动一个节点,我们可以设置一个叫rack_id(其它名字也可以)的属性,例如下面设置:

node.rack_id:rack_one 

上面这个例子设置了一个属性叫rack_id,它的值为rack_one。现在,我们要设置rack_id作为分片分布规则的一个属性(在所有节点都要设置)。

cluster.routing.allocation.awareness.attributes:rack_id 

上面设置意味着rack_id会用来作为分片分布的依据。例如:我们启动两个node.rack_id设置rack_one的节点,然后建立一个5个分片,一个副本的索引。这个索引就会完全分布在这两个节点上。如果再启动另外两个节点,node.rack_id设置成rack_two,分片会重新分布,但是一个分片和它的副本不会分配到同样rack_id值的节点上。可以为分片分布规则设置多个属性,例如:

cluster.routing.allocation.awareness.attributes:rack_id,zone 

注意:当设置了分片分布属性时,如果集群中的节点没有设置其中任何一个属性,那么分片就不会分布到这个节点中。

3.   forced awareness

强制分布规则,更多的时候,我们不想更多的副本被分布到相同分布规则属性值的一群节点上,那么,我们可以强制分片规则为一个指定的值。

例如,我们有一个分片规则属性叫zone,并且我们知道有两个zone,zone1和zone2.下面是设置:

cluster.routing.allocation.awareness.force.zone.values:zone1,zone2 

cluster.routing.allocation.awareness.attributes:zone 

现在我们启动两个node.zone设置成zone1的节点,然后创建一个5个分片,一个副本的索引。索引建立完成后只有5个分片(没有副本),只有当我们启动node.zone设置成zone2的节点时,副本才会分配到那节点上。

4.   shard allocation filtering

分片分布过滤,允许通过include/exclude过滤器来控制分片的分布。这些过滤器可以设置在索引级别上或集群级别上。下面是个索引级别上的例子:

假如我们有四个节点,每个节点都有一个叫tag(可以是任何名字)的属性。每个节点都指定一个tag的值。如:节点一设置成node.tag: value1,节点二设置成node.tag: value2,如此类推。我们可以创建一个索引然后只把它分布到tag值为value1和value2的节点中,可以通过设置

index.routing.allocation.include.tag为value1,value2达到这样的效果,如:

curl-XPUT localhost:9200/test/_settings -d '{     

   "index.routing.allocation.include.tag" :"value1,value2"     

}' 

与此相反,通过设置index.routing.allocation.exclude.tag为value3,我们也可以创建一个索引让其分布在除了tag设置为value3的所有节点中,如:

curl-XPUT localhost:9200/test/_settings -d '{     

   "index.routing.allocation.exclude.tag" :"value3"     

}' 

index.routing.allocation.require.tag可以设置必须满足的一些规则才能分配,是must all的关系,而inclued 是 any的关系。

include,exclude,require可以支持简单的通配符,例如value*。

另外有一个特殊的属性_ip可以匹配节点的ip,_host可以匹配主机名称也可以匹配ip,_name可以匹配nodename,_id可以匹配node id。

显然,一个节点可能拥有多个属性值,所有属性的名字和值都在配置文件中配置。如,下面是多个节点的配置:

node.group1:group1_value1  

node.group2:group2_value4 

同样的方法,include和exclude也可以设置多个值,如:

curl-XPUT localhost:9200/test/_settings -d '{     

   "index.routing.allocation.include.group1" :"xxx"     

   "index.routing.allocation.include.group2" :"yyy",     

   "index.routing.allocation.exclude.group3" :"zzz",     

}' 

上面的设置可以通过索引更新的api实时更新到索引上,允许实时移动索引分片。

集群范围的过滤器也可以定义,可以通过集群更新api实时更新到集群上。这些设置可以用来做让一些节点退出集群的操作。下面是通过ip地址去掉一个节点的操作:

curl-XPUT localhost:9200/_cluster/settings -d '{     

    "transient" : {     

       "cluster.routing.allocation.exclude._ip" :"10.0.0.1"     

    }     

}'  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值