ES

ElasticSearch理解(一)

Posted by Kanon on March 9, 2018

ElasticSearch是一个基于Lucene的分布式全文搜索引擎。ElasticSearch 的底层是开源库 Lucene,但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。ElasticSearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

ES优点

  1. 全文搜索引擎。有一个score对搜索结果的相关度进行评估。
  2. 搜索速度快,近实时。
  3. 高亮搜索。可以在搜索结果中高亮部分文本片段。
  4. 聚合aggregation。与关系型数据库的GROUP BY类似。
  5. 分布式,具有横向扩展性。但这个分布式对用户却是透明的,你不用去关心索引的分片在结点上如何进行分配,也不用关心聚合搜索时是如何查询并聚合数据的。

集群(cluster)

集群是一系列节点(node)的集合。集群通过名字来区分,默认是叫“elasticsearch”,节点是通过集群的名字来加入的。

节点(node)

每一个节点也通过名字来唯一标识,默认情况下节点在启动时会被分配一个随机的标识。

分片(shard)

  • 当一个index过大,或者基于性能、容灾的考虑时,就需要将index划分成多个分片(shard),并分发到多个机器上
  • 一个分片就是一个Lucene的实例,它本身就是一个完整的搜索引擎
  • 分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。
  • 技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档。
  • 副本(replica)是数据的完整拷贝,副本分片(replica shard、)是某个主分片的拷贝
  • 默认情况下,每一个索引会被划分成5个主分片(primary shard),同时也会有一份完整的副本(replica),也就是共有10个分片。
  • 在索引建立的时候就已经确定了主分片数且不可再修改,但是副本分片数可以随时修改。
  • 在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
  • 如果增加副本分片而节点数目却不变,并不能提高性能,因为每个分片从节点上获得的资源会变少。你需要更多的硬件资源来提升吞吐量。
  • 但是更多的副本分片数提高了数据冗余量:按照上面的节点配置,我们可以在失去2个节点的情况下不丢失任何数据。

映射(mapping)

映射定义了类型中的域,每个域的数据类型,以及Elasticsearh如何处理这些域。   如果在建立文档前未设置映射,则ES会使用动态映射,尝试猜测域类型并自动帮我们建立映射。

GET case/_mapping

索引(index)

  • 在ES中,数据是存储和索引在分片中的,而一个索引仅仅是逻辑上的命名,而类型则允许你在索引中进一步对数据进行逻辑上的划分。
  • 注意理解索引,从动词和名词的角度。
  • 在 Elasticsearch 中, 每个字段的所有数据都是默认被索引的。即每个字段都有为了快速检索设置的专用倒排索引。而且,不像其他多数的数据库,它能在相同的查询中使用所有这些倒排索引,并以惊人的速度返回结果。
  • 默认情况下,一个index会被分成5个primary shard,每个primary shard都有自己的replica shard,这些replica shard合起来刚好是索引的一份完整副本。

文档(document)

一个文档本质上就是一个被序列化为键值对的 JSON 对象。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一ID。

文档三个必须的元数据 :

  • _index:文档在哪存放
  • _type:文档表示的对象类别
  • _id:文档唯一标识

段(Segment)

elasticsearch中的每个分片包含多个segment,每一个segment都是一个倒排索引。在查询的时,会把所有的segment查询结果汇总归并后最为最终的分片查询结果返回。

并发控制

ES本身提供了版本机制,每一个文档都有一个version字段。所有文档的更新或删除 API,都可以接受 version 参数。举个例子,在更新数据时,先读取这个版本号,在更新时指定要更新的版本号,如果最新版本号大于之前读取的版本号,说明有人改过,我们可能就要重新读取数据来修改。
官网文章

集群健康

查询集群健康的命令。也可以在health后面加上具体的索引名称

GET _cluster/health

返回结果

{
  "cluster_name": "elasticsearch",
  "status": "yellow",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 26,
  "active_shards": 26,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 26,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 50
}
  • 绿色:所有主分片和副本分片都正常运行
  • 黄色:所有主分片都正常运行,但不是所有副本分片都正常运行
  • 红色:有主分片没能正常运行

参考

官网:Basic Concepts
Elasticsearch学习总结–原理篇