Elasticsearch系列(一):Elasticsearch介绍及安装

Elasticsearch是什么

Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎。ES还是一个分布式文档数据库,其中每个字段都可以是被索引的数据而且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级别的数据。他可以在很短的时间内存储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。

ES具有高可用性和可扩展性。可以购买性能更强的服务器来完成,称为垂直拓展或者向上扩展,或增加更多的服务器来完成,称为水平扩展和向外扩展。

ES可以用来作什么?

  • 当你开一家网店,你想让客户搜索关键字就能找到你的商品,你可以用ES来存储你的整个产品信息和库存目录,为客户提供精准的搜索。
  • 一般我们也可以拿他来做日志收集(经典的比如说ELK),我们就可以把日志数据存储到Elasticsearch中。你可以搜索和汇总这些数据,来找到你想要的信息。
  • 对于我们来说,最熟悉的莫过于GitHub了,它的搜索是基于ES构建的。它有40~50个索引库,分别用于索引网站需要跟踪的各种数据。虽然只索引项目的主分支,但是数据量依旧很庞大,包括近20亿个索引文档,30TB的索引文件。

Elasticsearch的优点

  • 横向可拓展性:只需要增加一台服务器,做一点的配置,启动一下ES进程就能并入集群。
  • 分片机制提供更好的分布性:同一个索引分成多个分片,这种方式可以提升处理效率。
  • 高可用:提供复制机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用的节点上。
  • 使用简单:只需要一条命令就可以下载文件,然后很快就能搭建一个站内搜索引擎。

全文搜索

全文搜索是指计算机搜索程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,搜索引擎就根据事先建立的索引进行查找,并将查找的结果反馈给用户。这个过程类似于通过字典中的搜索字查询字的过程。

Lucene是目前全球使用最广的全文搜索引擎开源库。

倒排索引

概念:

  1. 倒排索引来源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性的个记录的地址。由于不是由记录来确定属性值,而是由属性值来确认记录的位置,因此称为倒排索引。
  2. 倒排索引中的索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。
  3. 搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度、位置。
    假设我们有两篇文章1和文章2.
    文章1的内容为:Ru lives in Foshan, But I live in Hangzhou.
    文章2的内容为:We all once lived in Nanchang.

取得关键词:
由于Lucene是基于关键词索引和查询的,首先我们需要获取到这两篇文章的关键词,通常有以下处理措施

  1. 我们现在有个使文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词是连在一起的,所以需要特殊的分词处理(常用的中文分词插件ik_smart)。
  2. 文章中的”in“,“once”,"but"等词没有什么实际意义,中文中的”的“”是“也无具体意义,这些不代表概念的词是可以过滤掉的。
  3. 用户通常希望查”He“时能把”he“和”HE“的文章也找出来,所以需要统一大小写。
  4. 用户通常希望查”live“时能把”lives“和”lived“的文章也找出来,所以需要把”lives“,”lived“还原成”live“。
  5. 文章中的标点符号通常不表示某种概念,也可以过滤掉。
    在lucene中以上措施由Analyzer类完成。经过上面的处理后,得到如下的结果:
    文章1的关键词:[ru][live][foshan][i][live][hangzhou]
    文章2的关键词:[we][live][nanchang]

建立倒排索引:
有了关键词后,我们就可以建立倒排索引了。上面的对应关系时:”文章号“对”文章中所有的关键词“。倒排索引把这个关系倒过来,变成:”关键字“对”拥有该关键词的所有文章号“。文章1和文章2经过倒排索引后的关系如下图:

关键词文章号
foshan1
hangzhou2
i1
live1,2
ru1
we2

通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现的次数和位置,通常有两种位置:

  • 字符位置:即该记录词是文章中第几个字符(优点是显示并定位关键词快)。
  • 关键词位置:即记录该词是文章中第几个关键词(优点是节约索引空间、词组查询快),Lucene中记录的就是这种位置。
    加上了”出现频率“和”出现位置“信息后的索引结构如下图(关键字是按字符顺序排列的,二元搜索算法):
关键词文章号(出现频率)出现位置
foshan1 [1]3
hangzhou2[1]6
i1[1]4
live1[2] , 2[1]{[2,5],[2]}
ru1[1]1
we2[1]1

实现:
实现时,Lucene将上面三列分别作为词典文件、频率文件、位置文件保存。其中词典文件不仅保存了每个关键字,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。
Lucene中还使用了field的概念,用于表达信息所在位置,在建索引中,该field信息也记录在词典文件中,每个关键字都有一个field信息,因为每个关键字一定属于一个或多个field。

压缩算法:
为了减少索引文件的大小,Lucene对索引还是用了压缩技术。

应用场景:
下面我们可以通过对索引的查询来解释一下为什么要建立索引。
假设我们要查询单词“live”,Lucene先对词典二元查找、找到该词,通过指针指向频率文件读出所有文章号,然后返回结果。词典通常非常小,因此,整个过程的时间是毫秒级别的。
而用普通的顺序匹配法,不建立索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目过大后,查询所需要的时间是让人无法忍受的。

Elasticsearch术语及概念

  • 索引词(term):索引词是一个能被索引的精确值
  • 文本(text):文本是一段普通的非结构化的文字。通常,文本会被拆分成一个个的索引词,存储在ES的索引库中。为了文本能够进行搜索,文本字段需要事先进行分析;当对文本中的关键词进行查询的时候,搜索引擎应该根据查询条件搜索出原文本。
  • 分析(analysis):分析是将文本转换为索引词的过程,分析的结果依赖分词器。比如FOO BAR、Foo_Bar和foo bar这几个单词可能会被分析成相同的索引词foo和bar,这些索引词存储在ES的索引库中。当用FoO/BAr进行全文搜索的时候,搜索引擎根据匹配计算也能在索引库中搜索出之前的内容。
  • 集群(cluster):集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。在所有节点,一个集群有一个唯一的名称默认为“Elasticsearch”。
  • 节点(node):一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。
  • 路由(routing):当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择。默认情况下,这个值是由稳当的ID生成的。
  • 分片(shard):分片是单个Lucene实例,这是ES管理的比较底层的功能。索引是指向主分片和副分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,ES会自动管理集群中所有的分片,当发生该故障的时候,ES会把分片移动到不同的节点或者添加新的节点。
  • 主分片(primary shard):每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后复制到不同的副本中。默认情况下,一个索引有五个主分片。你可以事先指定分片的数量,当分片一旦建立,则分片的数量不能修改。
  • 副分片(replica shard):每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的,首先增加了高可用性,当主分片失败的时候,可以从副分片中选择一个作为主分片;其次提高了性能:当查询的时候可以到主分片或者副分片中进行查询。默认情况下,一个主分片配有一个副本,但是副本的数量可以再后面动态的增加。副本分片必须部署在不同的节点上,不能部署在和主分片相同的节点。
  • 复制(replica ):当网络中的某个节点出现问题的时候,复制可以对故障进行转移,保证系统的高可用。因此,ES允许你创建一个或多个拷贝,你的索引分片就形成了所谓的副本和副分片。(提供了高可用性,扩展了搜索量以及提高并发量)
  • 索引(index):索引是具有相同结构的文档的集合。在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除等操作。
  • 类型(type):在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。一般情况下,一个类型被定义为具有一组公共字段的文档。例如,假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户的数据,一种类型微博客的数据(在ES6.0.0及更高的版本中,创建的索引只能包含一个映射类型)。
  • 文档(document):文档是存储在ES中的一个JSON字符串。它就像是在关系型数据库中表的一行。
  • 映射(mapping):映射像关系型数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。
  • 来源字段(field):默认情况下,你的原文档将被存储在_source这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始数据,这个对象返回一个精确的JSON字符串,这个对象不显示索引分析后的其他任何数据。
  • 字段(source field):文档中包含零个或多个字段,字段可以是一个简单的值。
  • 主键(ID):ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,且是唯一的。

安装配置

  • 安装Java:为了运行ES,Elasticsearch需要Java7或者更高版本的支持e。(过程省略,查看是否安装成功,控制台运行: java - version)
  • 安装Elasticsearch:可以根据自己的需要选择下载哪个版本,下载地址链接: elasticsearch.
  • 配置:
elasticsearch.yml配置说明
集群名称:cluster.name : elasticsearch
确保在不同的环境中集群的名称不相同,否则,节点可能会连接到错误的集群。
节点名称:node.name : node-1
默认情况下,当节点启动时es将随机在一份3000个名字的列表中随机指定一个。如果机器上只运行一个集群节点,可以用${HOSTNAME}设置该节点的名称为主机名。
节点描述:node.rack : r1
索引存储位置:path.data : /path/to/data
http协议端口:http.port : 9200
  • 运行:在Windows下执行elasticsearch.bat,在Linux下运行./elasticsearch
  • 停止:如果节点是连接到控制台,按下Ctrl+C;杀进程(Linux是kill,Windows下用任务管理器)。
  • 版本升级:ES通常可以使用滚动升级过程,导致服务不断。下面详细介绍如何执行滚动升级与集群的升级重启。ES不是所有版本都可以直接升级。升级前请先查阅相关文档,然后进行数据备份,最好先在测试环境模拟测试一遍。
集群重启

关闭分片分配:当我们试图关闭一个节点的时候,ES会立即试图复制这个节点的数据到集群中的其他节点上。这将导致大量的IO请求。在关闭该节点的时候可以通过设置一系阿参数来避免此问题的发生。

PUT /_cluster/settings
{
	"transient":{"cluster.routing.allocation.enable":"none"}
}

执行一个同步刷新:当停止一个索引的时候,分片的恢复会很快,所以需要进行同步刷新请求。同步刷新请求是一个非常有效的操作,当任何索引操作失败的时候,可以执行同步刷新请求,必要的时候可以执行多次。

PUT /_flush/synced

关闭和升级所有节点:停止在集群中的所有节点上的服务。每一个节点都要进行单独升级。这个主要就是文件替换操作,注意保留日志目录。

启动集群:如果你有专门的主节点(node.master节点设置为true,node.data节点设置为false),则先启动主节点。等他们形成一个集群,然后选择一个数据节点进行启动。你可以通过查看日志来检查启动情况。通过以下命令可以监控集群的启动情况,检查所有节点是否成功已加入集群。

GET _cat/health
GET _cat/nodes

等待黄色集群状态:当节点加入到集群后,它首先恢复存储在本地的主分片数据。最初的时候,通过_cat/health请求发现集群的状态是红色,意味着不是所有的主分片都已分配。当每个节点都恢复完之后,集群的状态会变成黄色,这意味着所有分片都已经被找到,但是并不是所有的副本分片都恢复。

重新分配:延迟副本的分配直到所有节点都加入集群,在集群的所有节点,可以重新启动碎片分配。

PUT /_cluster/settings
{
	"transient":{"cluster.routing.allocation.enable":"all"}
}

这个时候集群将开始复制所有副本到数据节点上,这样可以安全的恢复索引和搜索。如果你能延迟索引和搜索直到所有的分片已恢复,这样可以加快集群的恢复。最后当集群的状态出现绿色的时候,表示本次集群升级全部完成,可以通过下面的API监控恢复的进度和健康情况:

GET _cat/health
GET _cat/recovery
滚动升级

滚动升级:滚动升级允许ES集群升级一个节点,同时不影响系统的使用。在同一个集群中的所有节点的版本最后保持一致,否则可能产生不可预知的后果。

关闭分片分配:当我们试图关闭一个节点的时候,ES会立即试图复制这个节点的数据到集群中的其他节点上。这将导致大量的IO请求。在关闭该节点的时候可以通过设置一系阿参数来避免此问题的发生。

PUT /_cluster/settings
{
	"transient":{"cluster.routing.allocation.enable":"none"}
}

停止不必要的索引和执行同步刷新(可选):当停止一个索引的时候,分片的恢复会很快,所以需要进行同步刷新请求。同步刷新请求是一个非常有效的操作,当任何索引操作失败的时候,可以执行同步刷新请求,必要的时候可以执行多次。

PUT /_flush/synced

关闭和升级一个节点:在启动升级前,将节点中的一个节点关闭。可以通过卢瑟解压安装或者通过RPM等安装包安装。不管是解压安装还是压缩包安装都要保留之前的数据文件不能破坏。可以在新的目录中安装。

启动升级节点集群:启动升级节点,并通过接口检查是否正确。

GET _cat/nodes

启用共享配置:一旦节点加入集群,在节点重新启动碎片分配。

PUT /_cluster/settings
{
	"transient":{"cluster.routing.allocation.enable":"all"}
}

等待节点恢复:应该在集群下一个节点升级之前完成碎片分配。可以通过一下接口进行检查,等待的状态栏从黄色变成绿色。状态绿色意味着所有主分片和副分片已经完成分配。

GET _cat/health

重复其他节点。当集群是稳定的,节点已经恢复,重复上述步骤,把所有剩余的节点进行升级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值