版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433114
目录
一、概念
1. 基本概念
2. 分布式相关概念
二、功能特性总结
三、ES架构
代码语言:txt复制 准备写一个Elasticsearch的专题,记录和总结一下这段时间对Elasticsearch的学习过程。之所以叫做触类旁通,是希望和RDBMS作比较,这里的“类”指的就是数据库。当然刚看了一个月,“通”是不敢说了,只是借用这个词而已。Elasticsearch的强项是解决搜索问题,但是在使用场景有严格约束的情况下,也可以将它用作数据库查询,其实这样使用的用户应该也不少。
代码语言:txt复制 必须强调本专题的所有DSL语句都只在ES 6.4.3版本上执行通过,而不保证在其它版本上能执行。对于ES最深的印象是其版本升级的随意性。几周升级一个新版本,而在大版本迭代时,其API语法、数据类型、实现方式等等方面变化之大,大到让我感觉就没有“向后兼容”这回事儿的存在。如此任性的做法,到底是说明开发者的水平高,还是这东西本身就缺乏体系、标准与规范呢?要用ES,就做好绑死一个版本的准备吧,无论是只用它做搜索,还是当DB使。别想着版本升级、数据迁移这些事儿了,除非你想“从头再来”。
一、概念
1. 基本概念
代码语言:txt复制 如前所述,我们对比DB来理解ES的相关概念。虽然在有些方面不具有可比性(比如事务),但这样入手对于DBA来说会相对容易些。ES是构建在Apache Lucene之上的开源分布式搜索引擎。Lucene是开源的搜索引擎包,允许用户通过自己的Java应用程序实现搜索功能。ES充分利用Lucene,并对其功能进行了扩展,并且是正如名字中的“elastic”所示,ES是灵活、有弹性、易扩展的系统。
(1)索引
代码语言:txt复制 索引是ES最重要的概念。我理解ES的“索引”有两层含义,用作名词时,索引类似于DB中的表。此时索引是一种数据结构,它依据数据建造,最终提供快速搜索功能。ES的低层是Lucene,而Lucene使用的是倒排索引。倒排索引类似于DB中的位图索引。DB中的普通索引通常是用尽量小的键值查找记录。例如,通过文章ID查找其标签或其它属性。而倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引中的每一项都包括一个属性值(如标签)和具有该属性值的各记录的地址(如文章ID)。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件称为倒排索引文件,简称倒排文件(inverted file)。
代码语言:txt复制 在ES中,当索引一词用作动词时,指的是类似于DB中的insert操作。“索引”一篇文档基本就是指将文档PUT到索引中,在此过程中将生成该文档的倒排索引。
(2)文档
代码语言:txt复制 一个文档是一个可被索引的基础信息单元。如果说将ES索引比作DB的表,那么ES的文档就是表中的记录,记录中的包含的字段对应文档的属性。但需要注意,DB的一个表中的所有记录都必须具有严格的固定的字段定义。而ES中的文档是no-schema的,也就是说一个索引中的文档结构是松散的,不同文档允许拥有不同的属性,不必须象表记录那样严格。
(3)搜索
代码语言:txt复制 ES的搜索类比于DB中的select操作,当然两者的差别还是很明显的。DB的查询功能是利用关键字、组合条件对表中数据的相关信息进行查找。可以根据系统表单中设定的字段对指定的关键字进行排查,处理的主要对象是结构化数据。搜索主要指对非结构化的文本内容进行查找和匹配。
代码语言:txt复制 DB与ES相关概念类比如下表所示:
DB | ES |
---|---|
Table | Index |
Row | Document |
Column | Field |
Index | 倒排索引,每个字段均可被索引 |
Schema | Mapping |
SQL | DSL |
2. 分布式相关概念
(1)集群
代码语言:txt复制 一个集群(cluster)将一个或多个节点组织在一起,它们共同持有整个索引的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,节点通过集群名加入到ES集群中的。集群中可以包含一个或多个节点。其中有一个为主节点,这个主节点是通过选举产生的。主从节点是对于集群内部来说的。ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的。从外部来看ES集群,在逻辑上是个整体,与任何一个节点的通信和与整个ES集群通信是等价的。
(2)节点
代码语言:txt复制 一个ES实例即为一个节点(node)。一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的。
代码语言:txt复制 一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中。这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此(多播方式),它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
代码语言:txt复制 一个集群里可以拥有任意多个节点。而且,如果当前网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。
(3)分片
代码语言:txt复制 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片(shard)。
代码语言:txt复制 ES可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。分片的数量只能在索引创建时指定,并且索引创建后分片数量不能更改。一个分片即为一个Lucene实例。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
代码语言:txt复制 分片很重要,主要有两方面的原因:
- 允许水平分割/扩展容量。
- 允许在位于多个节点上的分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,完全由ES管理,对于用户来说是透明的。
(4)副本
代码语言:txt复制 在一个网络环境里,失败随时都可能发生,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,ES允许创建分片的一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本(replicas)。副本分片和对应的主分片不能存储于同一节点上。默认情况下,ES中的每个索引被分成5个主分片,每个主分片1个副本,副本数量允许在索引创建后进行修改。副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中搜索。二是提高查询效率,ES会自动对搜索请求进行负载均衡。
二、功能特性总结
- 提供接近实时(NRT)查询。ES是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)。
- 缺省通过TF-IDF算法计算相关性得分(relevancy score),确保结果相关性。
- 超越精确匹配。ES支持容错(如拼写错误)、变体(如相同词干搜索)、统计信息和自动提示。
- 将文档分布到不同的容器或者分片中,分片可以存在于一个或多个节点中。
- 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
- 冗余每一个分片,防止硬件故障造成的数据丢失。
- 通过文档ID的哈希值,将集群中任意一个节点上的请求路由到相应数据所在的节点。
- 无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。
三、ES架构
- Gateway是ES用来存储索引的文件系统,支持多种类型。
- Gateway的上层是一个分布式的Lucene框架。
- Lucene之上是ES的模块,包括:索引模块、搜索模块、映射解析模块等。
- ES模块之上是 Discovery、Scripting和第三方插件。Discovery是ES的节点发现模块,不同机器上的ES节点要组成集群需要进行消息通信,集群内部需要选举master节点,这些工作都是由Discovery模块完成。支持多种发现机制,如 Zen 、EC2、gce、Azure。Scripting用来支持在查询语句中插入javascript、python等脚本语言,scripting模块负责解析这些脚本,使用脚本语句性能稍低。ES也支持多种第三方插件。
- 再上层是ES的传输模块和JMX.传输模块支持多种传输协议,如 Thrift、memecached、http,默认使用http。JMX是java的管理框架,用来管理ES应用。
- 最上层是ES提供给用户的接口,可以通过RESTful接口和ES集群进行交互。