作者:额 | 来源:互联网 | 2023-07-21 12:12
一.概述1.为什么要使用Elasticsearch?在网络应用中,搜索功能十分常见。而在查询海量数据时,如果使用传统的关系型数据库进行搜索,往往需要采用模糊查询。而模糊查询会
一.概要1 .为什么要使用电子搜索? 在互联网APP应用中,搜索功能很常见。 在检索大量数据时,如果使用传统的关系数据库进行搜索,则模糊模糊查询查询会导致查询引擎放弃索引,并在系统查询数据时生成所有表密钥在百万级别的数据库中,查询效率是非常低下的,Elasticsearch是专业的3358www.Sina.com/,使用ES可以大大提高搜索效率。 通过将经常查询的系统功能的几个字段,例如电子商务系统商品表的商品名、说明、价格、以及id等字段放入ES索引库中,可以实现全文搜索引擎2 .核心原理1.elaa提高查询速度是一个或多个节点(服务器)的集合,用于存储整个数据,并跨所有节点索引和搜索。集群是属于群集的单个服务器。 保存数据,参与集群索引和搜索功能。 就像节点关系数据库中的“数据库”。 定义了多种类型的映射。 索引为索引,逻辑名称空间。 类似于映射到一个或多个主分片,并且可以有零个或多个副本分片关系数据库中的一行。 差异是索引文档,但公共字段的数据类型必须相同。每个文档可以具有不同的结构(字段)是索引的逻辑类别/分区,其含义完全取决于用户。 (类型)2. Elasticsearch的倒排索引是什么? 倒排索引是搜索引擎的核心。 搜索引擎的主要目标是在搜索出现搜索条件的文档时提供快速搜索。 ES的倒排索引实际上是lucene的倒排索引,与传统的前向索引不同,倒排索引是http://www.Sina.com/3.elastic search文档的写入过程
协调节点收到文档后,当路由计算找到相应的片并收到来自协调节点的请求时,Elasticsearch7已删除这一概念,http://www.Sina.com 这称为内存缓冲器到文件系统缓存的过程(65将关键词和数据进行关联,保存到倒排表中,然后查询时,将查询内容进行分词后在倒排表中进行查询,最后匹配数据即可)。在某些情况下,内存缓冲器和文件系统缓存中的数据可能会丢失。 es通过http://www.Sina.com/。 其实现机制为将请求写入到 Memory Buffer,将在文件系统缓存数据写入磁盘时清除。 这个过程称为flush; flush中,内存中的缓冲区被清除。然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,refreshflush触发器的计时可以是定时器触发(默认30分钟)或translog太大)默认值512M 4. Elasticsearch更新和删除文档的过程? 删除和更新也是写入,但是写入到Filesystemcache后即可被检索到,不能删除或更改以表示更改; 提交磁盘上的translog的机制来保证数据的可靠性删除请求后,不会真正删除文档,接收到请求后,同时也会写入到 translog 中此文档仍然与查询匹配,但http://www.Sina.com 创建新文档后,Elasticsearch会为文档分配版本号,并在执行更新时将新版本的文档索引到新段。 5 .电子搜索搜索流程?
搜索作为两个阶段的过程运行,称为内容被写入一个新段。 在第一个查询阶段,查询为段的 fsync 将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog。。 每个拼贴都在本地执行搜索,并构建匹配文档大小为from size的首选队列。 虽然位于PS:3358www.Sina.com/,但有些数据仍在Memory Buffer中,因此搜索为Elasticsearch 中的段是不可变的
strong>。每个分片返回各自优先队列中 所有
文档的 ID 和排序值 给协调节点,它
合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。接下来就是取回阶段, **协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。**每个分片加载并丰富文档,如果有需要的话,接着返回文档给协调节点。
一旦所有的文档都被取回了,协调节点返回结果给客户端。 Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确, DFS Query Then Fetch 增加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确,但是性能会变差。 三. 集群 1. Elasticsearch 的 master 选举流程?master节点的职责? 对所有可以成为master的节点(node master: true)
根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后
选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。master节点的职责主要包
括集群、节点和索引的管理,不负责文档级别的管理。 2. Elasticsearch 集群脑裂问题?
“脑裂”问题可能的成因:
网络问题:集群间的网络延迟导致一些节点访问不到master, 认为master 挂掉了从而选举出新的master,并对master上的分片和副本标红,分配新的主分片。
节点负载:主节点的角色既为master又为data,访问量较大时可能会导致ES停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。
内存回收:data 节点上的ES进程占用的内存较大,引发JVM的大规模内存回收,造成ES进程失去响应。
脑裂问题解决方案:
选举触发:调整discovery.zen.minimum. _master_ nodes参数(默认为1),该参数是用于控制选举行为发生的最小集群主节点数量。当备选主节点的个數大于等于该参数的值,且备选主节点中有该参数个节点认为主节点挂了,进行选举。官方建议为(n / 2) +1(
超过半数节点投票才能成为master), n为主节点个数(即有资格成为主节点的节点个数)。
减少误判:调整discovery.zen ping_ timeout
节点状态的响应时间,默认为3s,可以适当调大,如果master在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如6s,discovery.zen.ping_timeout:6),可适当减少误判。
角色分离:即master节点与data节点分离,限制角色
主节点配置为:node master: true,node data: false
从节点配置为:node master: false,node data: true 3. 如何监控 Elasticsearch 集群状态? elasticsearch-head 插件。通过 Kibana 监控 Elasticsearch。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标 四. 优化 1. GC 方面,在使用 Elasticsearch 时要注意什么?
倒排词典的索引需要常驻内存,无法 GC,需要监控 data node 上 segment memory 增长趋势。各类缓存, field cache, filter cache, indexing cache, bulk queue 等等,
要设置合理的大小,并且要应该根据最坏的情况来看 heap 是否够用。避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用 scan & scroll api 来实现。cluster stats 驻留内存并无法水平扩展,超大规模集群可以考虑分拆成多个集群通过 tribe node 连接。
参考文章:https://www.bilibili.com/video/BV1hh411D7sb?p=62&spm_id_from=pageDriver