ElasticSearch - 分片的概念

概念


要理解分片是什么, 首先要理解其他的一些相关概念和关系.

Cluster (集群)

集群是一个或以上的 node 的集合, 集群有一个唯一的名称作为id (默认是elasticsearch), 一个只有通过集群名称才能加入. 所以, 要避免在不同环境使用相同的集群名称, 否则 node 可能会加入错的集群.

Node

node 是一个独立的服务器( es 实例 ), 作为集群的一部分, 进行数据保存/参与集群的索引和搜索过程. 和集群一样, 一个 node 有自己的id. 默认是分配了一个 Universally Unique IDentifier (UUID) 作为 name, 你也可以自定义名称. node 可以通过集群名称配置加入特定的集群, 如果在网络中启动一些nodes, 他们可以互相发现, 并自动组成和加入一个集群, 默认名称是elasticsearch.

index

一个 index 索引是相似属性的文档的集合.

Type

一个index中, 可以定义一个以上的type. type 是index的一个逻辑目录/分区, 我们可以储存不同的文档类型到同一个 index 并拥有不同的文档类型.

Document

文档是被索引的单元, 是es世界的实体. 说到底, es的使用场景最后都是关于搜索文档.

Shards & Replicas


一个index可能会存储大量数据, 可能超过一个node的硬件限制. 为了解决这个问题, es 把 index (Index 是一个逻辑的命名空间) 分割成多了多个块, 称为 shard (分片). 当你创建一个index时, 可以定义分片的数量.

分片有两个重要作用:

  • 允许你水平分割/拓展的你的容量
  • 允许你分发和并行化操作, 跨越多个shard(可能在不同node上), 因此可以提升性能和吞吐量.

shard 的分发机制和 document 是如何聚合回搜索请求完全由es管理, 并且是对用户透明的.
在分布式环境下, 故障转移机制以防某个 shard 或者 node 下线或者消失. 出于这个目的, es 允许你有一个或多个索引shard 的副本, 也称为 replica shards 或者 replicas.

Replication 有两个很重要的原因:

  • 提供高可用以防某个shard/node失效. 因此, replica 是不会分配到和复制源 original/primary shard 相同的node上.
  • 它允许拓展搜索的容量和吞吐量, 因为搜索可以并行的在所有replicas中并行.

总之, 每一个index可以被分割到多个shard, 一个index能被冗余多次, 一旦被复制, 每一个index将有主分片和复制分片, 每一个index被创建时, 可以制定shards和replicas, index创建后, 可以随时动态改变复制数, 但不能改变分片数. 集群中的最大节点数 Max number of nodes = Number of shards * (number of replicas +1), 即主分片数 * (1 + 副本数). 默认的, 每个index 被分配了5个主分片和1个备份, 如果集群有两个node, 那么index将会有5个主分片和另外5个冗余分片, 一共10个分片.

每个shard都是一个lucene index. 每个lucene index将都有一个最大数目的文档, 根据 LUCENE-5843 , 这个限制数是 2,147,483,519 (= Integer.MAX_VALUE - 128) 个文档, 可以通过 _cat/shards api 监控这个数目.

分片和路由


另一篇博客将介绍路由相关内容.

参考


https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html
http://udn.yyuap.com/doc/mastering-elasticsearch/chapter-4/41_README.html