es采用的是分布式的架构,es集群中会有多个结点,而结点的角色主要有下面几种。
协调结点:
请求路由能力,将请求内容将请求转发给对应的结点进行处理。
master结点:
结点管理:处理结点的加入和离开
索引管理:负责索引的创建,删除,修改。以及索引分片的分配任务。
数据结点:
数据的存储和管理。管理包括处理数据的新增,修改,查询等请求。
es的查询过程分两段,先query,再fetch。
在query阶段,有协调结点向数据结点发出查询指令,数据结点会返回匹配的id和排序权重
在fetch阶段,协调结点会根据排序权重重新排序,确定当前查询需要返回的数据范围。再去数据结点fetch具体的数据。
es内部如何使用缓存来优化查询数据?
解答这个问题,需要先了解es中索引的结构。首先,es的索引类似于mysql中的表,是用来存储文档数据的。基于分布式的特点,es将一个索引划分成多个分片,来提高索引的读写性能。然后,分片中的数据又是由一个个的segment构成的。
那基于索引,分片,segment这样的结构,es中存在segment级别的缓存和分片级别的缓存,来提高查询的检索速度。
其中作为数据存放的基本单元,segment在生成之后,除了合并和删除的场景,其它情况是不会变更的。对索引中文档的修改操作,都是会存在新的segment中。查询的时候,对与不同segment中包含同样id的文档的情况,也是会优先展示更新的版本号的记录。segment上的数据比较稳定,也是适合使用缓存的。
es中的索引结构?
es中使用的是倒排序的索引结构,这种结构的玩法就是存放关键词和包含了关键词的文档的对应关系。可以想象成是一个map结构,key是关键词,value是一个列表,列表中存放了关键词出现的文档id。检索的复杂度是O(1),速度很快。当然,为了减少存储key所占有的空间。实际的存储结构会使用到前缀索引,可以减少重复字符占用的空间。