Elasticsearch基础概念

以下是一些关于Elasticsearch的核心概念,了解这些概念会有助于学习Elasticsearch。文章翻译自官方文档,讲解了Cluster、Node、Index等几个Elasticsearch当中的基本概念,描述了Elasticsearch实现高可用高并发的设计原理。


以下是一些关于Elasticsearch的核心概念,了解这些概念会有助于学习Elasticsearch。
贴一份Elasticsearch的中文文档,后来发现的。。。

Near Realtime(NRT)

Elasticsearch是一个近实时的搜索平台,意味着从你创建索引到你搜索到新数据的过程当中,存在一定的延时(通常是一秒钟内)。

Cluster(集群)

一个集群是由一个或以上node(服务器)组成,它们组合在一起保存数据与提供搜索功能。集群用一个唯一的名称,默认是”elasticsearch”。这个名称相当重要,因为node是通过这个集群名称添加到集群,而一个node只能属于一个集群。

Node(服务)

一个node表示一个集群中的服务器,负责保存数据,参与集群中的索引保存,提供搜索。跟集群一样,node有一个名字进行表示,默认是一个在开启时候生成的随机的UUID,也可以使用自定义的名称来代替。node的名字在管理上起着很重要的作用。
通过集群的名称,一个node可以配置到一个集群中。默认情况下,node是属于默认的集群,即”elasticsearch”中,意味着当你启动多个node,而且他们能够互相连接的情况下,他们就形成了一个集群,名字就是”elasticsearch”。
在一个集群中,你可以设置很多数量的node。除此之外,在一个没有node的网络中中,新启动的node会自动添加到”elasticsearch”集群中,形成一个只有单一node的集群。

Index(索引)

索引是有相同特点的文档的集合。例如客户索引,商品品类索引,订单索引。不同索引通过其唯一的名字来区分(索引名必须小写),索引名在Elasticsearch搜索、更新、删除等索引操作的时候会用上。

Type(文档类型)

类型用于区分同一个索引中的不同的文档集合。例如用户类型,文章类型。不过6.0.0之后的版本,一个索引只能含有一个类型,到7.0.0往后的版本中将会移除这个概念。

什么是mapping types

自从第一个Elasticsearch的release版本以来,一个文档只能保存在一个索引,并且只能标记着一个类型(mapping type),例如twitter索引中可能有user类型和tweet类型。
每一个mapping type都有自己的字段,例如user类型有full_name属性。
每一个文档都有一个_type的元属性,其值为对应的类型,搜索的时候会在url中限制搜索的类型。
文档会将_type_id组合生成_uid,让同一个索引,允许存在相同_id的不同类型的文档。

为什么要移除mapping types

最初我们谈论的时候,会将index类比成SQL数据库中的database,而type就类似于table。这是一个错误的对比。在SQL数据库中,table是互相独立的,不同表的列,即使有相同的名字也不会有任何冲突,而mapping type则完全不是这样。
在一个Elasticsearch的索引中,就算是不同的类型,只要拥有相同名字的字段,这都是违背了Lucene的字段本质。以上面的例子,如果user类型和tweet类型都有一个字段叫user_name,那么他们都必须有相同的mapping(定义)。
这样,当你想在同一个索引的不同类型中,创建同一名字,但是不同类型的字段的时候,会导致冲突。
综上所述,在同一个索引的不同实体中,如果存在相同名字的不同字段,都会导致数据离散(sparse data,不知道是不是这样翻译),还有影响Lucene压缩数据的能力。
因此,建议移除mapping types。

替代mapping types

一个索引只建立一个文档类型

定制一个type字段来代替原来的_type字段

方法一的做法限制于集群中分片的数量,你不会想浪费一个实体分片在只有几千个文档的集合上。你可以定制一个type字段来代替_type字段。

没有mapping types的父子关系

这个还没有看

Document(文档)

文档是索引的基本单元。例如一个文档存储一个用户的信息,一个文档存储一个商品信息,另外一个文档存储订单信息。文档的格式JSON格式。
在一个索引/类型中,你可以很多文档,实质上文档是必须和分配一个类型,而不是一个索引?这句没有看懂。

Shards & Replicas(分片和副本)

一个索引能够存储超过一个节点硬件限制的海量数据。例如,一个上百万数据的索引,需要1TB的硬盘空间,单一个节点无法保存,另外单一节点搜索的话速度太慢。为了解决这个问题,Elasticsearch提供了一个功能,将你的索引切分成多个Shards(分片)。在创建索引时候定义分片数目,每一个分片都是完整且独立,可以在任何节点上进行管理。
需要进行分片的两个重要作用:

  • 水平切分你的海量数据
  • 通过分片,你可以并行地进行操作来提高效率
    Elasticsearch管理着分片的分配和在搜索时候归并分片中的文档,过程对使用者来说是完全透明的。
    在网络环境中,为了防止分片/节点如果挂掉而影响系统,Elasticsearch提供了一个功能,为一个分片制作多个副本,称为replica shards或者replicas for short
    副本主要有两个作用:
  • 高可用,因为一个索引的副本会分布在不同的节点中
  • 高并发,因为分布在不同节点的副本可以并行地提供服务
    每一个索引可以切分成不同的分片,一个索引可以制作多个副本(也可以不做副本)。复制的时候会产生一个主分片和一个副本分片。分片数量是在创建索引的时候设置的,索引创建完成之后,只能修改副本的数量,不能修改分片数。
    默认设置下,Elasticsearch是有5个主分片和1份副本,也就是说,在两个节点的情况下,会存在5个主分片和5个副本分片。