Anatomy of an Elasticsearch Cluster part.1——深度解析ElasticSearch(1)

来源:互联网 发布:彩票号码组合软件 编辑:程序博客网 时间:2024/05/16 06:10

原文来源:http://insightdataengineering.com/blog/elasticsearch-crud/ 

注:本人是ES初学者,本翻译仅作为个人学习之用,顺手发在博客上,可能会有不准确、理解错误的地方,有任何问题欢迎指正。

本文探讨ES基层的存储模型和CRUD(创建、读取、更新、删除)操作在ES中是如何工作的。

ES是一个在全文搜索和分析的用途中非常流行的分布式搜索引擎。功能有:
·全文搜索
·聚合
·地理空间API
关于底层存储结构,我们待探讨五个问题:
·是否存在主从结构,或者是不分主从的结构?(Is it a Master/Slave architecture or Master-less architecture?
·什么是存储模型
·存储(write)工作是如何进行的?
·读取工作是如何进行的?
·搜索的结果是如何关联的?
在讨论底层结构前,首先理清几个概念:
#ElasticSearch的索引、Lucene的索引
ElasticSearch的索引是一个用于规划组织(organize)你的数据的逻辑命名空间(类似一个数据库)。一个ElasticSearch索引有着一个或多个分片(默认为5个)。一个分片其实就是一个真正存储了数据的Lucene索引,同时分片内部也内置一个搜索引擎。每个分片可以有0个或者多个replicas(默认为1个)。ES的索引中有“types”(类似数据库中的表格),能让你有逻辑地设计你的数据如何分区。一个index中拥有相同type的文档拥有相同的属性(数据模式)。

#ES类比数据库(相似,但是不完全等同)
·Index ~ Database
·Types ~ Tables
·Mapping ~ Schema

#Type of nodes 节点的Type
ES 集群(ES cluster)中的节点可以有以下三种配置方式:
主节点(Master Node控制ES集群并对集群内的创建/删除操作做出回应、记录并跟踪究竟哪些node是集群的组成部分、把分片(shards)分配给nodes。主节点一次处理一个集群的状态,同时向所有对主节点回应了确认信息的其他节点广播当前状态。
通过设置elasticsearch.yml配置文件中的node.master属性为true (默认),可以将一个节点变成主节点。
对于一个大型集群来说,推荐至少设置一个主节点来专注控制集群,而不处理任何用户请求。

数据节点(Data Node存储数据和倒排索引。elasticsearch.yml中默认设置了每个节点都是数据节点。如果你想设置其为专门的主节点,可以设置node.data属性为false。

客户节点(Client Node)node.master和node.data都设置成false时,节点就变成了客户节点,该节点扮演负载均衡器角色,来协调集群中的节点对请求的处理
链接客户的节点叫做协调节点。协调节点将客户的请求分配到合适的分片。如对于读取请求,协调节点每次都会选择不同的分片来回应,以此平衡负载。

#Storage Model
ES使用了 Apache Lucene ,一个用JAVA写的全文搜索库。在内部它使用了一个叫做倒排索引的数据结构来提供低延迟率的搜索结果。文档是ES中的数据单元,倒排索引是通过对文档的词语进行此法分析得到的,它创建了一个对所有单独词汇情况统计排序的列表,同时也存储了特定词汇可以在哪个文档中被找到的相关信息。

为了提高可搜索性(如:对大小写的词语提供相同的结果)。文档首先被分析、然后被索引。分析包括两部分:1.分句成词、2.将词汇转换成标准模式。ES默认使用标准分析器,它使用标准分词器切分词语,同时把词语都转换成小写,(默认也使用停用词表)。当然也有很多其他的分析器可以使用。



接下来我们正式来解析ElasticSearch中的CURD操作
解析Write操作
【Create】
当你向协调节点发送“索引新文档(index a new document)”的请求时,会按顺序产生以下步骤:
·ES集群中的所有节点都包含了哪个shards储存在哪个node上的元信息。协调节点使用文档的ID(默认)来给文档分配节点。
分配节点的算法(MurmurHash):shard = hash(document_id) % (num_of_primary_shards)
·当节点收到协调节点的请求后,该请求会被写成translog,同时该文档会被加载到存储缓冲区(memory buffer)。如果在primary shard上请求成功,该请求就会被并行地发送到replica shards。只有当translog被成功写入replic shards后,客户才能收到请求成功的信息。

·存储缓冲区(memory buffer)以一个固有频率被刷新(默认是1sec),同时内容被写入新的文件系统缓冲区片段。该片段还没有被同步到文件,但是该片段已经开放并且可以用来被搜索了。
·常规来说每隔30分钟,translog会被清空,文件系统缓存会被同步到文件。但是当translog太大时,也会进行清空和同步操作。这在ES中被称为flush。flush之后原有的translog被清空,同时生成一个新的提交节点。

【Update & Delete】
删除和更新操作同样属于write操作。然而,ES中的文档是不可变的,因此,不能被删除或修改。那么文档是如何被删除或更新的呢?

删除:磁盘(disk)上的每个segments都有一个关联的.del文件,当发送删除请求时,该文档并没有被真的删除,但是在.del文件中被打上了"deleted"标记。这个文档依旧可以匹配一个查询语句,但是在结果中会被过滤掉。当我们合并segments的时候(在稍后会介绍),被标记了"deleted"的文档将不会被合并。
更新:当一个文档被创建后,ES分配一个版本号给它。每次修改文档,都会导致分配一个新的版本号。当更新操作被执行后,旧版本同样在.del文件中被打上了"deleted"标记,而新的版本在一个新的segment中被索引。旧版本同样可以匹配查询语句,但是不会出现在返回结果中。
解析Read操作
Read操作包括两部分:查询阶段、取回结果阶段
查询阶段:协调节点把搜索请求发送给索引中的所有shards。每个shard在自己的范围内独立查找,同时创建一个按照相关得分优先排序的结果集。所有的shards都会返回匹配查询的文档结果的记录和相关得分给协调节点。协调节点创建一个新的优先队列来处理汇总后的结果。每个shard可能会匹配出非常多结果,但是默认只会给协调节点返回前10条结果。最后协调节点默认返回最匹配的前10条结果。
取回阶段:当协调节点将所有结果汇总排序后,就会需要从所有的shards中请求原始文档。


相关性得分
相关性由ES对返回结果中的每个文档的打分决定。默认的算法是TF/IDF。词频用于测量一个词语(term)在文档出现的频率(高词频=高相关性)。逆文档频率一个词在所有文档集合中出现的频率有多高(高逆文档频绿=低相关性)。最后的结果是TF和IDF的结合。

0 0
原创粉丝点击