ElasticSearch面试题

一、elasticsearch的写入过程?
当es接收到一个写请求时,es的请求会发送到协调节点上,协调节点根据该条记录的_id通过一个路由算法计算出我们该条记录被分配到哪一条shard上,当数据保存到对应的primary shard和replica shard上之后,返回响应到协调节点,协调节点返回成功的响应到客户端;

二、elasticsearch的写入是实时搜索的不?
非实时的,elasticsearch是一个近实时的搜索系统,写入的时候,先将文档写入到内存缓冲区中和translog里面,通过refresh操作将内存缓冲区里面的数据刷新到segments中,此时才可以被条件搜索,之前只能通过doc_id搜索到,refresh默认是1s刷新一次,最小可设置为100ms刷新一次,值设置的越小,则写入的性能就越差;

三、当elasticsearch的参数refresh设置为-1的时候,是不是就不会刷新到segments了?
会刷新到内存的,有两种情况下会刷新内存中,一是根据我们设置的时间间隔refresh,二是当内存缓冲区满了的时候refresh;

四、elasticsearch的查询流程?
当通过docid查询数据的时候,会先用我们的路由算法计算出shard的位置,然后在对应的shard上查询数据;
当通过条件查询的时候,会有协调节点将查询请求分发到所有的shard对应的primary shard或者replica shard上,在每个shard上查询了之后,在将结果返回到协调节点,在协调节点上做排序、合并等操作,最终返回给客户端;

五、elasticsearch的持久化?
elasticsearch默认是1s中将内存缓冲区中的数据落地到segments中的,使数据可以被搜索,但是数据有可能会被丢失,因为数据是保存在内存中的;es写入的时候会将数据写入到内存缓冲区和translog中,默认五秒钟执行一次fsync,将缓存中的translog文件保存到磁盘中,每三十分钟或者当translog文件大小达到上限时会触发一次flush,将缓存中的数据保存到磁盘上并清空translog文件;
flush执行的步骤如下:

  • 把所有在内存缓冲区中的文档写入到一个新的segment中
  • 清空内存缓冲区
  • 往磁盘里写入commit point信息
  • 文件系统的page cache(segments) fsync到磁盘
  • 删除旧的translog文件,因此此时内存中的segments已经写入到磁盘中,就不需要translog来保障数据安全了

六、elasticsearch删除的流程?
elasticsearch删除实际上是一个伪删除,每个提交点(commit point)会包含一个.del文件,里面列出了每一个被删除的段的信息,查询的时候,被删除的信息任然可以被检索到,只是在最终返回结果集的时候会被过滤掉,当在segment合并的时候,被标记为del的段才会被清理掉;
这样做是为了保证在不重写整个倒排索引的情况下,通过增加新的索引的方式来体现出最近的修改;

七、如何避免集群脑裂问题?
es有一个参数discovery.zen.minimum_master_nodes:表示选举一个master节点最少需要多少个候选节点,默认是1个,一般设置为N/2+1;

你可能感兴趣的:(面试)