Elasticsearch分片原理

ES集群的基本概念

Cluster

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的

Shards主分片

代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改,这里和索引分片的算法有关,因为是通过取模算法去判断分到哪,如果改变了 就无法正常查询之前的索引

replicas分片副本

代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

Recovery

代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

ES为什么要实现集群

ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。同时提高容错性和高可用性

ES集群核心原理分析

分片存储规则

1、每个索引会被分成多个分片shards进行存储,默认创建索引是分配5个分片进行存储(需要注意的是es7.0默认索引分片数调整为1了

)。每个分片都会分布式部署在多个不同的节点上进行部署,该分片成为primary shards.

注意:索引的主分片primary shards定义好后,后面不能做修改。  

2、为了实现高可用数据的高可用,主分片可以有对应的备分片replics shards,replic shards分片承载了负责容错、以及请求的负载均衡.

注意: 每一个主分片为了实现高可用,都会有自己对应的备分片,他们之间的关系可以是一对多,主分片对应的备分片不能存放同一台服务器上(单台ES没有备用分片的)。主分片primary shards可以和其他replics shards存放在同一个node节点上。

在往主分片服务器存放数据时候,会对应实时同步到备用分片服务器,但是查询时候,所有(主、备)都进行查询:

Node1 :P1+P2+R3组成了完整的数据

实例演示:

下面是一个已经搭建好的集群.版本为ES7.6.0

创建一个索引

PUT /testindex

查询该索引

GET /testindex

7以下的版本这里会是5和1  这里是7.6.0版本所以是1 1

number_of_shards 相当于主分片数量 代表将索引分成几个分片 5就代表索引会分成5个分片

number_of_replicas 这里相当于是副分片的总数,和上面不同的是这里的1代表所有的副分片组成一份副本的意思.比如有5个主分片,

这里就是5个副分片组成1分总副分片,如果这里是2 代表会有10个副分片组成2份总的副分片.

修改分片数

分片数一般通过修改elasticsearch.yml文件中配置默认值

这里我们修改副分片数量为2

PUT testindex/_settings
{
  "index" : {
    "number_of_replicas" : 2
  }
}

然后查询索引分片信息

GET /testindex/_search_shards

可以看到上图 testindex索引主分片有1个 副分片变为2个 (这里只是针对testindex来说,如果建立其他的索引分片初始还是会变成默认值)

我们接下来尝试修改主分片数量

PUT testindex/_settings
{
  "index" : {
    "number_of_shards" : 3
  }
}

报错,证明索引创建后无法修改分片数

创建索引时指定分片数量

要修改分片数只能在索引创建的时候进行修改

PUT test
{
  "settings" : {
    "index" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 2
    }
  }
}

GET /test/_settings  创建并修改成功

执行 GET /test/_search_shards

可以发现 shards信息中一共有3个主索引 6个副索引

这里我简化了shards节点数据 画图表示

抽象成下图

每个节点上都有一份完整的数据 即使其他两个节点宕机也不会影响查询

数据路由 

当客户端发起创建document的时候,es需要确定这个document放在该index哪个shard上。这个过程就是数据路由。

路由算法:shard = hash(routing) % number_of_primary_shards

这里的routing指的就是document的id

如果number_of_primary_shards在查询的时候取余发生的变化,无法获取到该数据

已知主分片数量为3,

路由算法: shard = hash(routing) % 主分片数量3

分片位置 p1 =  1% 3 , p2 =2%3 , p0=3%3

使用

GET test/_search_shards?routing=1

可以查看具体数据路由到哪个分片上面

如上 id为1的文档会路由到2号分片上

发布了229 篇原创文章 · 获赞 49 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/baiyan3212/article/details/104339578
今日推荐