官方文档-分片分配和集群路由

对应7.2官方文档路径:Modules » Shard allocation and cluster-level routing
官方地址如下:
https://www.elastic.co/guide/en/elasticsearch/reference/7.2/modules-cluster.html

分片分配和集群路由

主节点的一个重要角色就是决定哪个分片分配到哪个节点,移动分片到不同节点目的是为了平衡集群。
以下设置可以控制分片分配过程:

集群级别分片分配:一些控制分配和平衡的设置
基于磁盘的分片分配:阐述es如何考虑可用磁盘空间以及相关设置
分片分配感知和强制感知:控制分片如何在不同机架或者区域分配
集群级分片分配过滤:允许某些节点或某些节点组从分配中排除,以便将其停用
除此以外,还有一些其他混杂的集群级别设置

这部分的设置都是动态设置,可以在活动的集群上使用用集群设置更新api动态更新。

1. 集群级别分片分配

分片分配是将分片分配到节点的过程,可能发生在初始化恢复,副本分配,重新平衡,节点的添加和移除的过程中。

分片分配设置

以下动态设置可以用来控制分片分配和恢复:

cluster.routing.allocation.enable

启用或者禁用某些种类分片的分配:
all(默认):允许全部种类分片分配
primaries:只允许主分片分配
new_primaries:允许新建的索引的主分片分配
none:不允许任何分片分配

cluster.routing.allocation.node_concurrent_incoming_recoveries

在一个node上允许同时恢复多少个shard,默认2

cluster.routing.allocation.node_concurrent_outgoing_recoveries

一个node上允许同时进行多少个shard recovery outgoing,比如这个node上,有一个primary shard,现在要将replica shard分配给其他的node,那么就是outgoing shard recovery。默认值也是2

cluster.routing.allocation.node_concurrent_recoveries

同时设置上面两个值

cluster.routing.allocation.node_initial_primaries_recoveries

在如果replica shard recovery通过网络传输来分配,那么一个未被分配的primary shard会在node重启之后使用本地磁盘上的数据,这个过程因为是使用本地的数据,因此会比较快,默认值是4

cluster.routing.allocation.same_shard.host

默认值是false,如果设置为true,那么就不允许将一个primary shard和replica shard分配到同一个物理机上,也许这个物理机上启动了多个es实例。

分片重新平衡设置

以下动态设置可用于控制整个群集中的分片重新平衡:

cluster.routing.rebalance.enable

all(默认):允许对所有类型的shard进行rebalance过程
primaries:仅仅允许对primary shard进行rebalance过程
replicas:仅仅允许对replica shard进行rebalance
none:不允许对任何shard进行rebalance

cluster.routing.allocation.allow_rebalance

always:任何时候都允许rebalance
indices_primaries_active:仅在分配了集群中的所有主分片时,才能rebalance
indices_all_active(默认):仅允许所有的主副分片都被分配之后,才能rebalance

cluster.routing.allocation.cluster_concurrent_rebalance

允许控制多少个shard rebalance的操作同时运行,默认是2

分片平衡探索

//todo

2. 基于磁盘的分片分配

默认85%不再分配分片,90%将移走分片,95%触发read_only

3. 分片分配感知(不强制 or 强制)

你可以使用自定义节点属性作为感知属性,以使es在分配分片时考虑你的物理硬件配置。如果es知道哪些节点在同一个物理服务器上,同一个机架或者同一个区域,他可以分发主/副分片到不同地方,以最大程度减少发生故障时丢失全部分片的风险。
当分片分配感知通过cluster.routing.allocation.awareness.attributes设置生效时,分片将仅分配给具有设置了特殊感知属性值的节点。如果设置了多个感知属性,es将分别考虑他们。
分配感知属性可以在yml文件中设置,或者通过cluster-update-settings api动态更新。
es倾向于在同一位置(相同感知属性值)的分片上进行search,get请求,使用本地shards将会比跨机架和区域边界更快。
注:属性值的数量决定了每个位置分配了多少个分片副本。如果每个位置中的节点数量不平衡,并且有很多副本,则副本分片可能未分配。

启用分片分配感知

  1. 使用自定义节点属性指定每个节点的位置。例如,你想让es分配分片在不同的机架,你可以在每个节点的yml文件中定义一个感知属性叫做rack_id:
node.attr.rack_id: rack_one

你也可以在启动节点的时候设置自定义属性:

./bin/elasticsearch -Enode.attr.rack_id=rack_one
  1. 通过设置每个有资格成为主节点的yml配置文件:添加cluster.routing.allocation.awareness.attributes设置,告诉es在分配分片的时候考虑一个或者多个感知属性:
cluster.routing.allocation.awareness.attributes: rack_id

注:多个属性以逗号分割填写
你也可以通过cluster-update-settings api设置或者更新集群感知属性。

使用以上例子的配置,如果你启动两个node.attr.rack_idrack_one的节点,并创建一个5个主分片一个副本的索引,则全部的主分片和副本将分配到这两个节点。
如果你再添加两个node.attr.rack_idrack_two的节点,es将移动分片到新的节点。来保证没有分片和其副本在同一个rack里面(如果可以做到的话)。
当rack_two的节点都挂掉,默认es将分配丢失的分片副本到rack_one。为了避免某一特定分片的副本分配到相同的区域,你可以使用强制感知。

强制感知

默认的,如果一个区域失败了,es将分配所有丢失的副本到尚存的区域。也许你拥有充足的跨区域资源来持有你的全部主分片和副本分片,但是一个区域也许不能持有全部的分片。
为了避免发生故障时某一个区域过载,你可以设置cluster.routing.allocation.awareness.force,这样直到其他的区域可用才会分配副本。
例如,你有一个感知属性zone,配置了节点分别为zone1,zone2,你可以用强制感知来避免es在只有一个zone区域可用时分配副本。

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

为感知属性指定所有可能的值:
通过以上的例子,当你启动两个node.attr.zone为zone1的节点,并创建一个5分片1副本的索引,es将创建索引并分配5个主分片,但是副本不会分配,除非有一个node.attr.zone为zone2的节点可用。

4. 集群级别分片分配过滤

你可以使用集群级别分片分配过滤控制es将任何索引的分片分配到哪里,这个集群级别的过滤可以和每个索引分配过滤和分配感知配合使用。
分片分配过滤可以基于自定义节点属性或者内置的属性_name,_ip或者_host。
cluster.routing.allocation设置是动态的,允许将活动的索引从一组节点移动到另一组节点。分片只有在不打破其他路由规则的前提条件下才可以移动,例如不能将主副分片移动到同一个节点。
最常用的集群级别分片分配过滤就是当你想下线一个节点的时候,将分片从此节点一走后停止这个节点,可以使用如下api通过ip过滤此节点:

PUT _cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
  }
}

集群路由设置

cluster.routing.allocation.include.{attribute}
将分片分配给attribute属性至少匹配一个逗号分隔中的值的节点。
cluster.routing.allocation.require.{attribute}
仅将分片分配给attribute属性具有所有逗号分隔后的值的节点。
cluster.routing.allocation.exclude.{attribute}
禁止将分片分配给attribute属性具有任何一个逗号分隔后的值的节点。

集群分配设置支持一下内置属性

_name :通过节点名字匹配
_ip :通过ip地址匹配(与hostname相关联的ip)
_host :通过hostname匹配
你可以使用通配符描述属性值,例如:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._ip": "192.168.2.*"
  }
}

5. 其他集群设置

cluster.blocks.read_only
将整个群集设为只读(索引不接受写操作),不允许修改元数据(创建或删除索引)。
cluster.blocks.read_only_allow_delete
与cluster.blocks.read_only索引相同,但允许删除索引以释放资源
cluster.max_shards_per_node
控制每个数据节点在集群中允许的分片数量
……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容