带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (1)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (1)


3.5.5.Shard allocation


创作人:毛夏军

审稿人:刘帅

 

什么是分片分配 (shard allocation)

 

分片分配 (shard allocation),是指在索引创建、副本增减、节点增减、分片重平衡等,将索引分片落实到实际的物理节点的过程,分片分配可以分为,集群级分配和索引级分配两种,集群级分配常见的包括

 

l 要求热索引的分片不要去往低配机器,

l 商品、订单索引的分片不要分配到同一个节点等。

 

将分片分布到不同的节点,一方面是为了提高系统的可用性,如当集群中一台机器宕机,使得该节点上的分片不可用时,分布在其他机器上的分片,能通过重新选举继续工作 (但是仍要保证同一分片的主从副本不全在宕机节点上) ;

 

另一方面是为了提高系统的容量和读写性能,如通过增加节点横向扩容,将集群中部分分片

Rebalance 到新节点,既可以利用新节点的存储容量,提升索引存储容量,迁移过来的分片,可以利用新节点增加的算力提供服务。

 

总结一下分片分配过程,有两个基本要素:

 

l 分片:来自集群内的全部索引,包括主分片和副本分片

l 节点:组成集群的各个 Elasticsearch 进程,能够通过一定的标识来识别个体或划分成组

 

那么,集群内的各节点是如何被识别和标记的呢?

 

节点属性 (node attributes)


节点属性 (node attributes),包括内置属性和自定义属性两种。

 

Elasticsearch 会将常见用于区分不同机器的标记,如主机名 (_host)、IP 地址 (_ip)、节点

名称 (_name) 等作为内置属性,供分片分配时区分节点的标记使用,具体包括:

 

l _name:节点名称,即在 elasticsearch.yml 中定义的 node.name 属性

l _host_ip、_publish_ip、_ip:节点的 IP 地址,一般情况下使用 _ip 即可,具体含义可以查阅官方帮助文档

l _host:主机名

l _id:集群为节点自动分配的唯一标识符,手动调控时使用较少

l _tier:节点的数据角色,比如存储冷热数据的 data_cold、data_hot 等,可以在 elasticsearch.yml 中指定 node.roles 属性

 

内置属性可以用来区分不同节点,但是对于将节点划分成组来说不是很便利,比如我们希望将索引分配到高配节点。如果使用内置属性,比如 _ip 的话,需要在索引设置 index.routing.allocation.include._ip 中,指定多个机器的 IP 地址,在集群增删高配节点的情况下,需要同时调整对应索引的分片分配设置,显得不太便捷。

 

我们很自然的希望除了内置属性之外,还可以根据机器配置的高低、是否同属于一个网段等情况来标记节点,方便我们将不同类型的节点划分为一个个组,继而将索引的分配配置到节点组,这样在集群增删节点时,只要节点配置了对应的组,集群就会根据对应组的节点变化自动的将分片重新调整,而不需要我们再手动的同步每一个索引的分配设置。

 

自定义节点属性解决的便是这个问题,我们可以通过:

 

l 在 elasticsearch.yml 中新增配置项,如 node.attr.zone=zone1

l 或在启动命令中增加变量,如bin/elasticsearch -Enode.attr.zone=zone1

 

来为节点增加自定义属性。

 

小结


分布式架构为我们带来了众多容量、性能和可用性方面的优势,但是相应的也提高了保障难度,

因为分片在集群自动分配的情况下不一定能达到我们期望的"平衡"状态,需要我们对分片分配机制有较高的掌握程度来调控集群内分片的分配状况,比如主从副本不分布在同一物理节点、解决节点数据倾斜导致新分片集中于某几台负载较低节点的热点问题等。

 

调控分片分配

 

Elasticsearch 集群中 master 节点的一项重要功能,就是决定分片如何以最佳的方式,均衡分布到集群内的各个节点上。除了自动分配之外,我们也可以从粗粒度的集群维度和细粒度的索引维度,手动调控分片在各节点的分配。

 

集群维度 (cluster level) 的分片分配,是将所有分片纳入一起考虑,不会单独考虑某个索引的分片分配情况。

 

举个例子:我们有两个索引,每个索引包含两个分片,将分片分配到两个节点组成的集群。


状态一:

 

同一个索引的全部分片分配到同一个节点

 

{
  "node_1": ["index_1_shard_1", "index_1_shard_2"],
  "node_2": ["index_2_shard_1", "index_2_shard_2"]
}

状态二 :

 

同索引的分片均匀分配到各节点

 

{
  "node_1": ["index_1_shard_1", "index_2_shard_2"],
   "node_2": ["index_2_shard_1", "index_1_shard_2"]
}

从集群维度,都可以被认为是"平衡"状态,但是从实际角度看,只有状态二是我们期望的平衡状态。因为如果 index_1 和 index_2 负载不均,在状态一下,很可能导致集群内节点负载不均,使得服务整体表现不能达到预期。

 

要达到我们期望的状态二,就可以使用索引维度 (index level) 的分片分配控制方法,比如通过index.routing.allocation.total_shards_per_node 参数控制每个节点的分片数量为 1 ,就可以达到我们的目的了。

 


《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.5.Shard allocation (2) https://developer.aliyun.com/article/1228684


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
存储 监控 前端开发
带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (2)
带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (2)
143 0
|
运维 Java 索引
带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (3)
带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (3)
125 0
|
存储 消息中间件 NoSQL
带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (4)
带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (4)
126 0
|
存储 分布式计算 监控
带你读《Elastic Stack 实战手册》之56:——3.5.15.Snapshot (下)
带你读《Elastic Stack 实战手册》之56:——3.5.15.Snapshot (下)
166 0
|
索引
带你读《Elastic Stack 实战手册》之56:——3.5.15.Snapshot (中)
带你读《Elastic Stack 实战手册》之56:——3.5.15.Snapshot (中)
132 0
|
存储 API
带你读《Elastic Stack 实战手册》之56:——3.5.15.Snapshot (上)
带你读《Elastic Stack 实战手册》之56:——3.5.15.Snapshot (上)
157 0
|
机器学习/深度学习 运维 数据可视化
带你读《Elastic Stack 实战手册》之58:——3.5.16.2.Getting started(上)
带你读《Elastic Stack 实战手册》之58:——3.5.16.2.Getting started(上)
110 0
|
机器学习/深度学习 数据建模 索引
带你读《Elastic Stack 实战手册》之58:——3.5.16.2.Getting started(中)
带你读《Elastic Stack 实战手册》之58:——3.5.16.2.Getting started(中)
108 0
|
机器学习/深度学习
带你读《Elastic Stack 实战手册》之58:——3.5.16.2.Getting started(下)
带你读《Elastic Stack 实战手册》之58:——3.5.16.2.Getting started(下)
|
Shell iOS开发 Docker
带你读《Elastic Stack 实战手册》之52:——3.5.11.Uptime (中)
带你读《Elastic Stack 实战手册》之52:——3.5.11.Uptime (中)
115 0
下一篇
无影云桌面