Elasticsearch面试核心

Elasticsearch面试核心
最新回答
想后不需要理由

2020-05-08 20:23:48

Elasticsearch面试核心问题解答

1. Elasticsearch 的核心概念有哪些?

  • Index(索引):类似于数据库中的表,用于存储文档数据。每个索引可以包含多个类型的数据(在Elasticsearch 7.x及以后版本中,多类型已被废弃,每个索引只包含一种类型的数据)。
  • Document(文档):最小的可检索单元,类似于数据库中的一行记录,以JSON格式存储。
  • Shard(分片):索引的数据会被分片存储,每个索引会分为多个分片来提高性能和数据容量。分片分为主分片和副本分片。
  • Replica(副本):分片的副本,用于高可用性和容错。副本分片不能存储在主分片所在的同一节点上,以确保数据的可靠性。

2. Elasticsearch 如何实现高可用和数据冗余?

  • Elasticsearch通过分片(Shards)和副本(Replicas)实现高可用性。每个索引都会被分成多个分片,并且每个分片可以有多个副本。主分片负责数据写入,副本用于容错和查询。如果某个节点失效,副本可以迅速接管角色,保障数据不会丢失,从而实现高可用性和数据冗余。

3. Elasticsearch 的倒排索引是什么?它是如何工作的?

  • 倒排索引是Elasticsearch的核心数据结构,用于实现高效的全文检索。它将文档中的每个词与包含这个词的文档ID关联起来。
  • 在查询时,倒排索引能够快速找到包含某个词的所有文档集合,从而实现全文搜索。这种索引方式极大地提高了搜索效率,使得Elasticsearch能够处理大规模的数据集。

4. Elasticsearch 的分片机制是如何工作的?为什么需要分片?

  • 分片是将一个大索引的数据分散到多个节点的机制。每个分片都是一个独立的Lucene索引,可以独立地进行查询和写入操作。
  • 分片机制可以提高系统的扩展性和性能,允许并行查询和写入,从而加快数据处理速度。此外,分片还可以有副本用于故障恢复和提高查询性能。
  • 需要分片的原因是为了应对大规模数据的存储和查询需求,通过分片可以将数据分散到多个节点上,实现负载均衡和性能优化。

5. Elasticsearch 如何实现水平扩展?

  • Elasticsearch通过分片机制实现水平扩展。索引的数据会被分割成多个分片,并分布到不同的节点上。
  • 随着数据量的增加,可以通过添加新的节点,将已有的分片重新分配到这些新节点上,从而增加系统的存储和处理能力。这种扩展方式无需停机或中断服务,具有高度的灵活性和可扩展性。

6. Elasticsearch 中的 Mapping 是什么?它有什么作用?

  • Mapping是定义文档中各字段的数据类型和处理方式的过程。它类似于关系型数据库中的表结构定义。
  • 在Mapping中,可以指定字段类型(如字符串、数值、日期等)以及如何索引这些字段(如是否需要分词,是否存储等)。
  • Mapping的作用是为文档中的字段提供明确的类型定义和索引策略,从而优化查询效率和节省存储空间。合理的Mapping设计有助于提高Elasticsearch的性能和可靠性。

7. 什么是集群再平衡(Cluster Rebalancing)?它的作用是什么?

  • 集群再平衡是指当Elasticsearch集群中新添加或删除节点时,ES会触发分片的再分配过程。
  • 集群再平衡的目的是将集群的负载均匀分布到所有节点上,避免某些节点过载或空闲,从而保证系统的稳定性和性能。
  • 通过集群再平衡,可以确保Elasticsearch集群在节点变化时能够自动调整分片分布,实现资源的优化配置和负载均衡。

8. Elasticsearch 如何处理写入冲突(Write Conflicts)?

  • Elasticsearch通过乐观并发控制(Optimistic Concurrency Control, OCC)来处理写入冲突。
  • 每个文档都有一个版本号,在更新时,Elasticsearch会检查版本号是否匹配。只有匹配的情况下才会进行更新,从而避免并发写入时的数据冲突。
  • 如果版本号不匹配,说明文档在更新过程中被其他操作修改过,此时会抛出冲突异常,需要客户端重新处理冲突。

9. Elasticsearch 中如何优化查询性能?

  • 使用合适的索引:通过为常用字段创建合适的倒排索引来加速查询。
  • 合理设置分片数:避免过多或过少的分片,确保分片分布均匀,避免集群瓶颈。
  • 减少全文搜索的分词范围:通过精确匹配(如keyword类型)替代全文搜索,减少分词消耗。
  • 使用filter查询:filter查询不计算相关性评分,性能更高,可以用于缓存频繁查询的结果。
  • 缓存频繁查询的结果:利用Elasticsearch的缓存机制来加速频繁查询,提高查询效率。

10. Elasticsearch 是如何实现数据持久化的?

  • Elasticsearch使用事务日志(Translog)和段文件(Segment)来实现数据持久化。
  • 数据首先被写入Translog,用于保障数据安全,防止丢失。随后,数据定期被刷新到段文件中,这些段文件是不可变的。
  • 通过这种方式,Elasticsearch能够在系统崩溃后通过Translog恢复数据,并确保数据持久化到磁盘上。这种持久化机制保证了数据的可靠性和完整性。

11. 什么是 Elasticsearch 的refresh机制?它与flush有什么区别?

  • Refresh:是指将最新的文档写入段文件,并使其可见。默认每隔1秒会自动执行一次refresh操作,但它并不会将数据从内存刷到磁盘上。Refresh适用于实时性要求高的场景,可以确保新添加的文档能够立即被查询到。
  • Flush:是指将数据从事务日志(Translog)持久化到磁盘上,并清空Translog。Flush通常在集群关闭或日志积累过多时执行,用于数据的持久化保障。Flush操作会将内存中的数据写入到磁盘上的段文件中,并释放相关资源。
  • 区别在于,refresh操作是轻量级的,不会将数据持久化到磁盘上;而flush操作是重量级的,会将数据持久化到磁盘上并清空Translog。

12. Elasticsearch 中如何防止“分片过多”问题?

  • 合理设置分片数量:在创建索引时,应根据数据量和查询需求合理设置分片数量,避免每个分片数据量过小导致性能问题。
  • 使用索引生命周期管理(ILM)策略:通过ILM策略对老数据进行合并或归档处理,减少分片数量并优化存储性能。
  • 定期对索引进行分片的缩减(shrink)操作:对于已经存在的大量分片,可以通过shrink操作将其合并成较少的分片数量,从而优化性能和资源利用率。