(一)Elasticsearch的简介和基本概念

547 阅读7分钟

1. Elasticsearch简介

1.1 举例入门介绍

  1. 你运行一个在线网上商店,让你的客户能够搜索你销售的产品。在这种情况下,你可以使用Elasticsearch存储整个产品目录和库存,并为其提供搜索和自动填充建议。
  2. 你要收集日志或事务数据,并且你想分析和挖掘此数据以查找趋势,统计信息,摘要或异常。在这种情况下,你可以使用Logstash(Elasticsearch / Logstash / Kibana堆栈的一部分)来收集,聚合和解析数据,然后将Logstash将此数据提供给Elasticsearch。一旦数据在Elasticsearch中,你可以运行搜索和聚合来挖掘你感兴趣的任何信息。
  3. 你运行一个价格提醒平台,让价格优惠的客户指定一个规则,如“我有兴趣购买一个特定的电子小工具,如果小工具的价格在下个月内任何供应商的价格低于$ X,我想收到通知” 。在这种情况下,你可以检索供应商价格,推动他们进入弹性搜索,并使用其反向搜索(Percolator)功能来匹配价格变动与客户查询,并最终一旦发现匹配,将警报给客户。
  4. 你有分析/商业智能需求,并希望快速调查,分析,可视化和询问大量数据的特殊问题(考虑数百万或数十亿条记录)。在这种情况下,你可以使用Elasticsearch存储数据,然后使用Kibana(Elasticsearch / Logstash / Kibana堆栈的一部分)构建自定义仪表板,以便可视化对你重要的数据的方面。此外,你可以使用Elasticsearch聚合功能对你的数据执行复杂的商业智能查询。

1.2 官方介绍

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,是建立在全文搜索引擎 Apache Lucene基础上的一个搜索引擎。当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,每一个字段都编入索引,使其可以被搜索。
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

1.3 大白话介绍

Elasticsearch是一个基于文档的NoSQL数据库,是一个分布式、RESTful风格的搜索和数据分析引擎,同时也是Elastic Stack的核心,集中存储数据。Elasticsearch、Logstash、Kibana经常被用作日志分析系统,俗称ELK。

  • 说白了就是一个数据库,在数据搜索这点非常快(但是插入更新较慢),还可以进行分词,所以非常适合做搜索。例如商城的商品搜索等。
  • 它是NoSQL数据库,数据格式可以随便造。
  • Elasticsearch还为我们提供了丰富的RESTful风格的API,写代码的成本极低。
  • 它支持分布式,高性能(搜索快),高可用(某些节点宕机可以接着用),可伸缩(可以方便的增加节点,解决物理内存上线问题),适合分布式系统开发。

2. Elasticsearch的基本概念

为了快速了解Elasticsearch,我们可以与mysql几个概念做对比:

Mysql数据库行(Row)列(Columns)
Elasticsearch索引(Index)类型(type)文档(Docments)字段(Fields)

2.1 集群(Cluster)

集群,对外提供索引和搜索的服务,包含一个或多个节点。每个节点属于哪个集群是通过集群名称来决定的(默认名称是elasticsearch),集群名称搞错了后果很严重。

命名建议是研发、测试环境、准生产、生产环境用不同的名称增加区分度,例如研发使用es-dev,测试使用es-test,准生产使用es-stg,生产环境使用es-pro这样的名字来区分。

如果是中小型应用,集群可以只有一个节点。

Elasticsearch集群结构

2.2 节点(Node)

单独一个Elasticsearch服务器实例称为一个node,node是集群的一部分。一个node只能加入一个Elasticsearch集群当中,集群提供完整的数据存储,索引和搜索的功能,它下面的每个node分摊上述功能。

每个node有独立的名称,node名称特别重要,Elasticsearch集群是通过node名称进行管理和通信的。

2.3 分片(Shard)

分片,是单个Lucene索引。由于单台机器的存储容量是有限的(如1TB),而Elasticsearch索引的数据可能特别大(PB级别,并且30GB/天的写入量)。

单台机器无法存储全部数据,就需要将索引中的数据切分为多个shard,分布在多台服务器上存储。利用shard可以很好地进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升集群整体的吞吐量和性能。

shard在使用时比较简单,只需要在创建索引时指定shard的数量即可,剩下的都交给Elasticsearch来完成,只是创建索引时一旦指定shard数量,后期就不能再更改了。

2.4 副本(Replica)

在这里插入图片描述

完全拷贝shard的内容,shard与replica的关系可以是一对多,同一个shard可以有一个或多个replica,并且同一个shard下的replica数据完全一样,replica作为shard的数据拷贝,承担以下三个任务:

  1. shard故障或宕机时,其中一个replica可以升级成shard。
  2. replica保证数据不丢失(冗余机制),保证高可用。
  3. replica可以分担搜索请求,提升整个集群的吞吐量和性能。

shard的全称叫primary shard,replica全称叫replica shard,primary shard数量在创建索引时指定,后期不能修改,replica shard后期可以修改。

默认每个索引的primary shard值为5,replica shard值为1,含义是5个primary shard,5个replica shard,共10个shard。

2.5 索引(Index)

索引,具有相同结构的文档集合,类似于关系型数据库的数据库实例(6.0版本type废弃后,于是索引的概念下降到等同于数据库表的级别)。

一个集群里可以定义多个索引,如客户信息索引、商品分类索引、商品索引、订单索引、评论索引等等,分别定义自己的数据结构。

索引命名要求全部使用小写,建立索引、搜索、更新、删除操作都需要用到索引名称。

2.6 类型(Type)

类型,原本是在索引内进行的逻辑细分,但后来发现企业研发为了增强可阅读性和可维护性,制订的规范约束,同一个索引下很少还会再使用type进行逻辑拆分,因而在6.0版本之后,此定义废弃。

2.7 文档(Docments)

说说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档(ES最小的数据存储单元),用JSON作为文档序列化的格式,比如下面这条用户数据:

{
    "name" :     "John",
    "sex" :      "Male",
    "age" :      25,
    "birthDate": "1990/05/01",
    "about" :    "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala...的字段等。

在Elasticsearch里这就是一个文档,这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。

namesex等等就是Filed,由于结构是Json,所以value值就很方便放任意类型,这就是NoSQL的好处。

2.8 映射 & 字段(Mapping & Field)

Elasticsearch 是使用 JSON 作为文档序列化格式,映射就是定义了文档结构包含的许多字段。

一个映射定义了字段类型,每个字段的数据类型,以及字段被 Elasticsearch 处理的方式,映射还用于设置关联到类型上的元数据。