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