ElasticSearch学习笔记-基础介绍

ElasticSearch学习笔记-基础介绍_第1张图片

 

什么是ElasticSearch

ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。

它被用作全文检索、结构化搜索、分析以及这三个功能的组合:

  • Wikipedia_使用 Elasticsearch 提供带有高亮片段的全文搜索,还有 search-as-you-type 和 did-you-mean 的建议。

  • 卫报使用 Elasticsearch 将网络社交数据结合到访客日志中,为它的编辑们提供公众对于新文章的实时反馈。

  • Stack Overflow_将地理位置查询融入全文检索中去,并且使用 more-like-this 接口去查找相关的问题和回答。

  • GitHub_使用 Elasticsearch 对1300亿行代码进行查询。

除了搜索,结合Kibana、Logstash、Beats开源产品,Elastic Stack(简称ELK)还被广泛运用在大数据近实时分析领域,包括:日志分析、指标监控、信息安全等。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,通过使用机器学习,自动识别异常状况。

ElasticSearch是基于Restful WebApi,使用Java语言开发的搜索引擎库类,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。其客户端在Java、C#、PHP、Python等许多语言中都是可用的。

所以,ElasticSearch具备两个优势:

  • 天生支持分布式,可水平扩展;

  • 提供了Restful接口,降低全文检索的学习曲线,因为Restful接口,所以可以被任何编程语言调用;

为什么不是直接使用Lucene

ElasticSearch是基于Lucene的,那么为什么不是直接使用Lucene呢?

Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库。

但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。

ElasticSearch的主要功能及应用场景

我们在哪些场景下可以使用ES呢?

主要功能
  • 1)海量数据的分布式存储以及集群管理,达到了服务与数据的高可用以及水平扩展;

  • 2)近实时搜索,性能卓越。对结构化、全文、地理位置等类型数据的处理;

  • 3)海量数据的近实时分析(聚合功能)

应用场景
  • 1)网站搜索、垂直搜索、代码搜索;

  • 2)日志管理与分析、安全指标监控、应用性能监控、Web抓取舆情分析;

ElasticSearch的基础概念

我们还需对比结构化数据库,看看ES的基础概念,为我们后面学习作铺垫。

  • Near Realtime(NRT) 近实时。数据提交索引后,立马就可以搜索到。

  • Cluster 集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。

  • Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群。

  • Index 索引: 一个索引是一个文档的集合(等同于solr中的集合)。每个索引有唯一的名字,通过这个名字来操作它。一个集群中可以有任意多个索引。

  • Type 类型:指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。从6.0.0 版本起已废弃,一个索引中只存放一类数据。

  • Document 文档:被索引的一条数据,索引的基本信息单元,以JSON格式来表示。

  • Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。

  • Replication 备份: 一个分片可以有多个备份(副本)

文档

ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位。例如:

  • 日志文件中的日志项;

  • 一张唱片的详细信息;

  • 一篇文章中的具体内容;

在ElasticSearch中,文档会被序列化成Json格式:

  • Json对象是由字段组成的;

  • 每个字段都有对应的字段类型(如:字符串、数值、日期类型等);

每个文档都有一个唯一的ID(Unique ID)

  • 可以自己指定此ID;

  • 也可以通过ElasticSearch自动生成;

我们可以将文档理解成关系型数据库中的一条数据记录,一条记录包含了一系列的字段。

Json文档的格式不需要预先定义

  • 字段的类型可以指定或者由ElasticSearch自动推算;

  • Json支持数组、支持嵌套;

每一个文档中都包含有一份元数据,元数据的作用主要是用来标注文档的相关信息,如:

  • _index:文档所属的索引名;

  • _type:文档所属的类型名(从7.0开始,每一个索引只能创建一个Type:_doc,在此之前一个索引是可以设置多个Type的);

  • _id:文档的Unqie Id;

  • _source:文档的原始Json数据;

  • _version:文档的版本信息;

  • _score:文档的相关性算分;

索引(Index)

索引指的就是一类文档的集合,相当于文档的容器。

  • 索引体现了逻辑空间的概念,每个索引都有自己的Mapping定义,用来定义所包含的文档的字段名和字段类型;

  • 索引中的数据(文档)分散在Shard(分片)上,Shard体现了物理空间的概念;

集群

ElasticSearch集群实际上是一个分布式系统,而分布式系统需要具备两个特性:

  • 高可用性

    • 服务可用性:允许有节点停止服务;

    • 数据可用性:部分节点丢失,不会丢失数据;

  • 可扩展性

    • 随着请求量的不断提升,数据量的不断增长,系统可以将数据分布到其他节点,实现水平扩展;

ElasticSearch的集群通过不同的名字来进行区分,默认名字“elasticsearch”;可以通过配置文件修改或者命令行修改:-E cluster.name=test一个集群中可以有一个或者多个节点。

节点

节点是什么?

  • 节点是一个ElasticSearch的实例,其本质就是一个Java进程;

  • 一台机器上可以运行多个ElasticSearch实例,但是建议在生产环境中一台机器上只运行一个ElasticSearch实例;

每个节点都有名字,可以通过配置文件进行配置,也可以通过命令行进行指定,如:**-E node.name=node1**

每个节点在启动之后,会被分配一个UID,保存在data目录下;

Master-Eligible【有资格、胜任者】 Node与Master Node的说明:

  • 每个节点启动之后,默认就是一个Master Eligible节点,当然可以在配置文件中将其禁止,node.master:false

  • Master-Eligible Node可以参加选主流程,成为Master Node;

  • 当第一个节点启动时,它会将其选举为Master Node;

  • 每个节点都保存了集群状态,但只有Master Node才能修改集群的状态,包括如下:

    • 所有的节点信息;

    • 所有的索引和其相关的Mapping与Setting信息;

    • 分片的路由信息;

Data Node与Coordinating【协调、整合】 Node的说明:

  • Data Node:可以保存数据的节点,负责保存分片数据,在数据扩展上起到至关重要的作用;

  • Coordinating Node:它通过接受Rest Client的请求,会将请求分发到合适的节点,最终将结果汇集到一起,再返回给Client;

  • 每个节点都默认起到Coordinating Node的职责;

Hot Node(热节点)与Warm Node(冷节点)的说明:

  • Hot Node:有更好配置的节点,其有更好的资源配置,如磁盘吞吐、CPU速度;

  • Warm Node:资源配置较低的节点;

Machine Learning Node:负责机器学习的节点,常用来做异常检测;

分片
Primary Shard(主分片)

可以解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点之上。

一个主分片是一个运行的Lucene的实例;

注意:

  • 一个节点对应一个ES实例;

  • 一个节点可以有多个index(索引);

  • 一个index可以有多个shard(分片);

  • 一个分片是一个lucene index(此处的index是lucene自己的概念,与ES的index不是一回事);

主分片数是在索引创建时指定,后续不允许修改,除非Reindex;

Replica Shard(副本)

可以解决数据高可用的问题,它是主分片的拷贝。

  • 副本分片数可以动态调整;

  • 增加副本数,在一定程度上可以提高服务的可用性;

分片的设定

对于生产环境中分片的设定,需要提前做好容量规划,因为主分片数是在索引创建时预先设定的,后续无法修改。

  • 分片数设置过小

    • 导致后续无法增加节点进行水平扩展。

    • 导致分片的数据量太大,数据在重新分配时耗时;

  • 分片数设置过大

    • 影响搜索结果的相关性打分,影响统计结果的准确性;

    • 单个节点上过多的分片,会导致资源浪费,同时也会影响性能;

你可能感兴趣的:(elasticsearch,学习,笔记)