ES知识点总结

1、es搜索引擎的架构是怎么设计的?为什么是分布式的?

  1. 答:es的核心思想就是在多台机器上部署启动多个es的进程实例,这样就组成了一个es集群,接着当你新建一个索引时(es7.0之后一个索引相当于一个表),这个索引可以被拆分成多个分片shard,每个分片存储这个索引下的一部分数据。接着就是每个分片shard都有多个备份,就是说每个分片都有一个备份分片,主分片负责写入数据,之后会将数据同步到其他机器他的备份分片上去,实现数据的分布式存储,通过这个方案,每个分片数据都有多个备份,这时候如果某个机器宕机了,那么没关系还有别的机器上的备份分片的数据在,所有就高可用了啊,这样es的数据就变成分布式的了
  2. ES知识点总结

2、Es的写入数据和查询数据流程是怎么样的?

  1. es写数据大致的过程
  1. 客户端选择一个node发送写数据请求过去,这个node即使协调节点
  2. 协调节点会对写入的document进行hash算法,然后将请求转发给对应的node节点(有primary shard)
  3. 实际上node上的primary shard 处理请求,然后把数据同步到replica node 上
  4. 此时,如果发现主节点和副节点都写入成功之后,就返回响应成功给客户端
  1. es写数据的详细流程

 解释:什么是os cache? oscache是操作系统缓存,当数据写入磁盘文件之前,会先进入os cache,先进入操作系统级别的一个内存缓存中去后面才会被真正的写入磁盘文件

  1. 当客户端往某一个节点写入一条数据时,首先会根据hash算出该数据应该存储在哪个对应的分片上
  2. 然后这主分片primary shard 拿到一条数据之后会往buffer缓存中写入这条数据,并且会往内存(os cache)中写入一条日志(该日志每隔5秒钟把日志信息持久化写到磁盘的日志文件中(translog))
  3. Buffer中的真正数据则每隔1秒钟把数据refresh刷新到内存(os cache)中,
  4. 那数据什么时候从内存os cache 中持久化到磁盘中呢?那就是每隔30分钟translog日志会提交一次(当translog满了也会提交)把os cache中的数据flsh到存储数据的磁盘中(segment file),当数据写入磁盘时这个时候也就对数据简历了倒排索引了
  5. 当flush数据到磁盘之后,就清空translog日志文件。
  6. 面试:其实es是准实时的,数据写入1秒后可以搜索到,第二:有可能会丢失5秒钟的数据,因为当真正的数据还没有持久化到磁盘中时(可能存在buffer、os cache中),而写入数据的日志是每5秒持久化到日志文件中,这是机器突然宕机了,那么在内存中的真正数据丢失,并且日志数据也丢失了,导致会丢失5秒钟的数据。
  7. 如果你希望一定不能丢失数据的话,那么可以设置一个参数(具体百度)。每次写一条数据后,都是写入buffer,同时把日志写入到磁盘日志文件translog中去(相当于把日志文件每5秒写入磁盘改成实时写入磁盘了),但是这样可能会导致写的性能和吞吐量下降一个数量级。
  8. Translog日志文件的作用是什么?就是在日志文件在执行commit操作之前,数据要么是停留在buffer中要么是停留在os cache 中,但无论是那种情况,只要机器宕机,那么这些数据都会丢失。所以需要将数据对应的操作写入一个专门的日志文件translog中,一旦机器宕机再次重启时,es会自动读取translog日志文件中的数据并恢复到内存buffer和os cache 中。

 

  1. Es删除数据的详细流程
    1. Es删除数据首先也是通过记录操作日志,然后写入.del文件标识一下,说明这个数据被删除了(其实未被删除),当客户端再搜索时一旦发现这条数据在.del文件里被标识成删除状态了,就不会在被搜索出来了
    2. 最后数据被真正的物理删除其实是在文件的merge阶段,在merge时会先看一下如果某条数据被标识了del删除标记,那么再merge后新文件里的那条被删除的数据就没了
  2. Es查询数据
  1. 分为两种,第一位查询GET,第二位全文检索(搜索)
  2. Get查询:客户端通过id进行查询,客户端随意挑选某一个节点,这时这个节点会变为协调节点经过对id进行hash然后确定这条数据被分配到那个shard上,然后把请求路由过去在主分片和副分片之间进行负载均衡的算法不断轮训查询
  3. 全文检索(搜索):客户端进行搜索时会挑选一个节点,该节点会将请求发送到所有的shard上进行搜索,等协调者拿到所有shard返回匹配的doc_id后,再根据doc_id到各个shard去查完整的数据进行删选匹配,最后返回给客户端

es里的写流程有4个核心概念:refresh、flush、translog、merge

 

ES知识点总结

3、filesystem cache 对es对搜索 性能的影响

ES知识点总结

ES知识点总结

ES知识点总结