文章目录

  • 一、基本介绍
  • 1、ElasticSearch是什么
  • 2、ElasticSearch可以做什么
  • 3、Lucene是什么
  • 4、ELK架构
  • 二、核心概念
  • 1、Cluster(集群)
  • 2、Node(节点)
  • 3、Index(索引)
  • 4、Document(文档)
  • 5、Shards(分片) & Replicas(副本)


一、基本介绍

1、ElasticSearch是什么

Elasticsearch 是一个分布式的 RESTful 风格的分布式可扩展的准实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎。

2、ElasticSearch可以做什么

全文搜索功能(或者说倒排索引,将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配的内容)
分布式的实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
分布式的实时分析搜索引擎
可以通过极其简单配置扩展到上百台服务器实现分布式横向扩容,处理PB级别的结构化或非结构化数据。

3、Lucene是什么

ApacheLucene将写入索引的所有信息组织成一种倒排索引(Inverted Index)的结构之中,该结构是种将词项映射到文档的数据结构。其工作方式与传统的关系数据库不同,大致来说倒排索引是面向词项而不是面向文档的。且Lucene索引之中还存储了很多其他的信息,如词向量等等,每个Lucene都是由多个段构成的,每个段只会被创建一次但会被查询多次,段一旦创建就不会再被修改。多个段会在段合并的阶段合并在一起,何时合并由Lucene的内在机制决定,段合并后数量会变少,但是相应的段本身会变大。段合并的过程是非常消耗I/O的,且与之同时会有些不再使用的信息被清理掉。在Lucene中,将数据转化为倒排索引,将完整串转化为可用于搜索的词项的过程叫做分析。文本分析由分析器(Analyzer)来执行,分析其由分词器(Tokenizer),过滤器(Filter)和字符映射器(Character Mapper)组成,其各个功能显而易见。

4、ELK架构

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

二、核心概念

1、Cluster(集群)

集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。一个集群由一个唯一的名称标识,默认这个唯一标识的名称是"elasticsearch"。这个名称很重要,因为如果节点被设置为按其名称加入集群,那么节点只能是集群的一部分。

确保不要在不同的环境中用相同的集群名称,否则可能导致节点加入到错误的集群中。例如,你可以使用"logging-dev", “logging-test”, "logging-prod"分别用于开发、测试和正式集群的名字。

2、Node(节点)

节点是一个单独的服务器,它是集群的一部分,存储数据,并参与集群的索引和搜索功能。就像集群一样,节点由一个名称来标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不想用默认的节点名,可以定义任何想要的节点名。这个名称对于管理来说很重要,因为你希望识别网络中的哪些服务器对应于你的Elasticsearch集群中的哪些节点。

一个节点可以通过配置集群名称来加入到一个特定的集群中。默认情况下,每个节点都被设置加入到一个名字叫"elasticsearch"的集群中,这就意味着如果你启动了很多个节点,并且假设它们彼此可以互相发现,那么它们将自动形成并加入到一个名为"elasticsearch"的集群中。

一个集群可以有任意数量的节点。此外,如果在你的网络上当前没有运行任何节点,那么此时启动一个节点将默认形成一个单节点的名字叫"elasticsearch"的集群。

3、Index(索引)

索引是具有某种相似特征的文档的集合。例如,你可以有一个顾客数据索引,产品目录索引和订单数据索引。索引有一个名称(必须是小写的)标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。

4、Document(文档)

文档是可以被索引的基本信息单元。文档用JSON表示。
用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。当比较Elasticsearch中的文档和MongoDB中的文档,你会发现两者都可以有不同的结构,但Elasticsearch的文档中,相同字段必须有相同类型。这意味着,所有包含 title 字段的文档, title 字段类型都必须一样,比如 string 。
文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段(multivalued)。每个字段有类型,如文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。字段类型在Elasticsearch中很重要,因为它给出了各种操作(如分析或排序)如何被执行的信息。幸好,这可以自动确定,然而,我们仍然建议使用映射。与关系型数据库不同,文档不需要有固定的结构,每个文档可以有不同的字段,此外,在程序开发期间,不必确定有哪些字段。当然,可以用模式强行规定文档结构。从客户端的角度看,文档是一个JSON对象。每个文档存储在一个索引中并有一个Elasticsearch自动生成的唯一标识符和文档类型。文档需要有对应文档类型的唯一标识符,这意味着在一个索引中,两个不同类型的文档可以有相同的唯一标识符。

5、Shards(分片) & Replicas(副本)

一个索引可能存储大量数据,这些数据可以超过单个节点的硬件限制。例如,一个包含10亿条文档占用1TB磁盘空间的索引可能不适合在单个节点上,或者可能太慢而不能单独处理来自单个节点的搜索请求。

为了解决这个问题,Elasticsearch提供了将你的索引细分为多个碎片(或者叫分片)的能力。在创建索引时,可以简单地定义所需的分片数量。每个分片本身就是一个功能完全独立的“索引”,可以驻留在集群中的任何节点上。

分片之所以重要,主要有两个原因:

它允许你水平地分割/扩展内容卷
它允许你跨分片(可能在多个节点上)分布和并行操作,从而提高性能和吞吐量
在一个网络/云环境中随时都有可能出现故障,强烈推荐你有一个容灾机制。Elasticsearch允许你将一个或者多个索引分片复制到其它地方,这被称之为副本。

复制之所以重要,有两个主要原因:

它提供了在一个shard/node失败是的高可用性。出于这个原因,很重要的一个点是一个副本从来不会被分配到与它复制的原始分片相同节点上。也就是说,副本是放到另外的节点上的。
它允许扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
总而言之,每个索引都可以分割成多个分片。索引也可以被复制零(意味着没有副本)或更多次。一旦被复制,每个索引都将具有主分片(被复制的原始分片)和副本分片(主分片的副本)。在创建索引时,可以为每个索引定义分片和副本的数量。创建索引后,您可以随时动态地更改副本的数量,但不能更改事后分片的数量。

在默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果集群中至少有两个节点,那么索引将有5个主分片和另外5个副本分片(PS:这5个副本分片组成1个完整副本),每个索引总共有10个分片。

下一篇文章教大家如何使用Docker安装Elasticsearch和Kibana。