目录标题

  • 1.合适的分片和副本数
  • ES单机至集群扩容
  • ES Node主分片宕机恢复
  • 配置合适的分片,副本数量
  • 2、路由、分配器
  • 路由
  • 分片分配器
  • even_shard分片分配器
  • balanced分片分配器


1.合适的分片和副本数

       什么是分片:Elasticsearch将数据散步到多个物理Lucene索引上,这些Lucene索引称为分片(shard),而散步这些分片的过程叫做分片处理

       副本:分片的copy备份

       Lucene索引与Elasticsearch索引:一个分片是一个小的Lucene索引,从技术上讲,ES索引与Lucene索引是一样的,差别在于额外的特性上。个人理解ES索引附着于Lucene索引,Lucene索引针对于分片存储,ES索引针对于查询检索。

ES单机至集群扩容

       当单机容器容量满不了需求后,进行集群扩容,我们可以仅仅只增加一台安装ES的服务器,Elasticsearch会重新平衡集群,并且不需要额外的数据开销。因为是直接将部分索引转移到集群的Node点。
       因此ES进行分片处理在某种方面是优秀的,然而在查询的时候是需要付出代价的,这个过程需要在各个分片中获取到文档,然后进行合并,分片越多在合并的时候开销也会越多。

       以下是扩容流程,当然Node集群点再平衡集群时,不一定是一个Node点位全部存储副本或者分片。

索引分配 索引分片_权重

ES Node主分片宕机恢复

       Master Node在检测到一个主分片节点宕机后,会启动平衡恢复,宕机主分片节点对应的副本Node节点,会转正成为Node主分片节点,Matser Node会在剩余的节点中,再创建Node副本,并在剩余节点中平衡分配存储节点。

索引分配 索引分片_索引分配_02

配置合适的分片,副本数量

       上述两小点,简述了ES扩容,以及宕机恢复机制。由上述看,分片副本数量不宜过少,当然也不能过多,过多对查询合并不友好。

节点最大数 = 分片数 * (副本数量+1)

       如果计划使用十个分片,和两个备份,那么最大的节点数应该是三十。即十个主分片一个占一个节点,二十个副本分别占一个节点。

2、路由、分配器

路由

        查询时请求会被发送到所有分片,当我们想删除文档或者新增的时候,ES必须知道文档的具体位置,这个时候路由作用就出来了,相同的路由值会指向同一个分片。路由就是一个存储文档信息的特殊分片。
       一个给定的分片上可以拥有不同路由值的文档,路由可以限制查询时使用的节点数(指定路由查询),但是不同代替过滤功能。

#查询所有路由分片信息
GET _cat/shards/
#查询monday_index索引的路由(分片)分布
GET _cat/shards/monday_index
#查询路由值为0的分片上clients索引的信息
GET clients/_search?routing=0

分片分配器

分片器,以下只简单提以下概念,具体实现有兴趣再深究。
分片分配器承担分片分配职责,Elasticsearch提供even_shard,balanced(默认)。两种分配器。

even_shard分片分配器

       确保每个节点上具有相同数量的分片(默认情况下),同时也能禁止主分片与其副本存储在同一个节点,ES在分配时,会从储存负载最高的节点想存储较低的节点移动分片,直到集群完全平衡,或者无法再移动。只要分片及其副本不在相同的节点上,分配器就认为是正常工作,从不关心来自同一索引的不同分片存放位置(在不在同一节点)。

balanced分片分配器

       基于可控制的权重进行分配,所有因子与其权重的乘积的和大于已定义的阈值,那么这类索引上的分片就需要再分配平衡了。

balanced.shard:默认值 0.45  分片总数权重
balanced.index 默认值0.5 给定索引分片数的权重
balanced.primary  默认值0.05  阈值
balanced.threshold 默认值1.0  特定因子权重