• 欢迎来到本博客,希望可以y一起学习与分享

Elasticsearch(二)– 基本概念及核心配置文件详解

Java benz 3年前 (2018-10-24) 101次浏览 0个评论 扫描二维码
文章目录[隐藏]

配置文件

config/elasticsearch.yml 主配置文件
config/jvm.options jvm参数配置文件
cofnig/log4j2.properties 日志配置文件

基本概念

接近实时(NRT)

  • Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是 1 秒)。

集群(cluster)

  • 代表一个集群,集群中有多个节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

索引(index)

  • ElasticSearch将它的数据存储在一个或多个索引(index)中。用SQL领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档,并通过ElasticSearch内部使用Lucene将数据写入索引或从索引中检索数据。

文档(document)

  • 文档(document)是ElasticSearch中的主要实体。对所有使用ElasticSearch的案例来说,他们最终都可以归结为对文档的搜索。文档由字段构成。

映射(mapping)

  • 所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤,这种行为叫做映射(mapping)。一般由用户自己定义规则。

类型(type)

  • 每个文档都有与之对应的类型(type)定义。这允许用户在一个索引中存储多种文档类型,并为不同文档提供类型提供不同的映射。

分片(shards)

  • 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。5.X默认不能通过配置文件定义分片

副本(replicas)

  • 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

数据恢复(recovery)

  • 代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
  • GET /_cat/health?v   #可以看到集群状态

数据源(River)

  • 代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的,river这个功能将会在后面的文件中重点说到。

网关(gateway)

  • 代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

自动发现(discovery.zen)

  • 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
  • 5.X关闭广播,需要自定义

通信(Transport)

  • 代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
  • 节点间通信端口默认:9300-9400

分片和复制(shards and replicas)

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点可能没有这样大的磁盘空间来存储或者单个节点处理搜索请求,响应会太慢。

为了解决这个问题,Elasticsearch提供了将索引划分成多片的能力,这些片叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引” 可以被放置到集群中的任何节点上。

分片之所以重要,主要有两方面的原因:

  • 允许你水平分割/扩展你的内容容量
  • 允许你在分片(位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量
    至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

在一个网络/云的环境里,失败随时都可能发生。在某个分片/节点因为某些原因处于离线状态或者消失的情况下,故障转移机制是非常有用且强烈推荐的。为此, Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。

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

  • 在分片/节点失败的情况下,复制提供了高可用性。复制分片不与原/主要分片置于同一节点上是非常重要的。因为搜索可以在所有的复制上并行运行,复制可以扩展你的搜索量/吞吐量
  • 总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(即没有复制) 或多次。一旦复制了,每个索引就有了主分片(作为复制源的分片)和复制分片(主分片的拷贝)。
  • 分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你不能再改变分片的数量。
  • 5.X默认5:1   5个主分片,1个复制分片

默认情况下,Elasticsearch中的每个索引分配5个主分片和1个复制。这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样每个索引总共就有10个分片。

Shard & Replicas原理

1、分片的本质(副本也属于分片)

当我们对数据进行索引时,其索引本身就是一个或多个物理分片的集合名称。 Shard(或replicas)是底层的工作单元,并且只保存的全部数据中的一部分。一个分片底层就是一个Lucene实例,所以一个分片就是有一个完整的搜索引擎。

Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时,Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。并且副本的数量可以在服务运行时动态修改,但是分片已经创建(并进行数据的索引)则不能进行修改。那么主分片的个数设置就特别的重要,下面是主分片的存储数据的能力(当然我们还需要结合使用的硬件,文档的大小和复杂程度,索引和查询文档的方式以及你期望的响应时长等因素考虑):

LUCENE-5843标准,一个分片最大可以存储: 2,147,483,519 (= Integer.MAX_VALUE – 128) 文档可以使用 _cat/shards API进行查看。

 

Es中默认5个分片1个副本,可以使用elasticsearch.yml进行配置,也可以使用api进行配置:

那么肯定会有很多的疑问,为了避免单节点故障,我们肯定会在生产中使用集群配置,那当集群节点性能瓶颈需要增加机器时,会不会对运行的集群服务及数据产生影响,内部数据怎么进行平均分配。当集群中某节点故障,会不会造成数据丢失,怎么进行恢复。

2、节点扩容(提升性能)

当服务为单节点时,使用head等插件查看集群为yellow状态,这是因为没有为分片设置副本。主分片的数目在索引创建时就已经确定。这个数目定义了这个索引能够 存储 的最大数据量。在集群环境中,当服务性能遇到瓶颈时,已经不能再修改分片数量,那么只能用通过增加节点数和副本数以提高性能。

1)、 若服务为的每个节点上拥有多个分片还没有达到一个节点一个分片,那种可以使用增加集群节点的方式将每个节点的分片数再进行分配,那么每个节点上拥有的分片数会减少,每个分片拥有的cpu、内存等资源就会增加,以提高性能。

2)、可以增加副本数量以增加分片的数量,但是增加副本的同时,需要增加节点的数量。否则处理数据的分片(lucene实例)增加,但是会同时去争抢相同多个资源(cpu、内存、io等),那么性能也是一样的。当然其缺点就是增加了更多的冗余数据。动态增加副本的方式如下:

3、节点故障

副本与分片不能在同一node上,否则当某一节点故障后,数据就会丢失。这样当某一节点故障,集群中的其他节点有该故障分片的副本,则数据不会丢失,再进行数据的重新分配,并均衡节点的数据。

当故障节点恢复时,首先会尝试去重用它们,同时仅从主分片复制发生了修改的数据文件,在进行数据的调整。

elasticsearch 的存储结构

HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

为什么要介绍HTTP请求方法,因为Resultful API是基于HTTP请求方法的,而elasticsearch 基于RESTful web接口,所以,HTTP请求方法的get、post、put、delete,代表了elasticsearch 的增删改查。

倒排索引

ElasticSearch 是一个搜索引擎,也可以看做是一个分布式的数据库(经常被当做一个文档型的NoSQL数据库在使用),它可以大量的存储数据,并建立索引,以便在极短时间从海量数据中找到目标数据。

它和传统数据库很大的一个区别在于它建立索引的能力,这里有一个重要的概念——倒排索引

倒排索引可以很大的提高检索的速度,下面举一个例子,来说明一下倒排索引是什么,以及这种方式相比于传统数据库为什么会提高索引的速度。

在 ElasticSearch 中,一条记录被称之为一个文档,文档中有 id、type、version、source(文档主要数据存储在这里)等字段。

这里假设 文档A 的source字段中有一个关键字 content 的值是一条文本:

I love study.

文档B 的source字段中有一个关键字 content 的值是另一条文本:


And study make me happy.

现在输入我们想要检索的关键字:“study happy”

可以想象,在传统数据库中,会用一条类似这样的 sql 语句在数据库表中挨条查找符合要求的记录:

假如表中存有 1000w 条记录,那么这条 sql 将会依次检索这1000w 条记录,所要消耗的时间随着记录数增多而提高。这种方式在应对海量数据的时候,便有些力不从心。

那么我们可不可以换一种检索的方式呢?

既然我们要在 文档(记录) 中查找指定的 单词(关键字),最终查找的是 单词(关键字) 在某一个文档中存不存在,存在于哪一个文档中。那么我们可以反过来直接根据 单词(关键字) 建立一个索引表,通过检索关键字直接找到所有包含关键字的文档,这便是 倒排索引

先拿以上例子说明一下传统数据库存储的方式:

再拿以上例子说明如何建立倒排索引:

文档 A 和 B 中的两个文本,“I love study.” 和 “And study make me happy.”,可以建立如下索引表:


当我们检索关键字 “study happy” 的时候,可以直接找到 study 在文档A和文档B中都存在,happy 只在 文档B 中存在。相比传统数据库的检索方式,这种方式更加直接和高效,特别在数据量极大的情况下。


倒排索引系统还可以记录除此之外的更多信息,下表还记录了单词频率信息(TF)即这个单词在某个文档中出现的次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。如记录的频率信息格式为:(1,<23>,4),1:是文件名;<23>:表示该单词在文件中出现的位置(<、>是小于和大于号);4:表示该单词在文件中出现的次数。

更多的详情就不一一叙述。

倒排索引待解决的问题

1、大小写转换问题,如python和PYTHON应该为一词。

2、词干抽取,looking和look应该处理为一词。

3、分词,如:“屏蔽系统”应该分词为“屏蔽”、“系统”还是应该为“屏蔽系统”。

4、倒排索引文件过大–压缩编码。

elasticsearch . yml 详解


文章 Elasticsearch(二)– 基本概念及核心配置文件详解 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!