24 Star 203 Fork 101

javajov / java高级工程师面试

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
es.md 3.68 KB
一键复制 编辑 原始数据 按行查看 历史
javajov 提交于 2021-10-25 07:31 . update es/es.md.

Elasticsearch中的基本概念

集群(Cluster) : ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

节点(Node) : 形成集群的每个服务器称为节点

索引(index) : 在 ES 中, 索引是一组文档的集合。(类似数据库中的一张表,文档id类似表中的主键)

分片(shard) :当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起。(类似于数据库的分库分表,把某个表中的数据分散到不同的库不同的表中)

副本(Replia) :为提高查询吞吐量或实现高可用性,可以使用分片副本。副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。

描述一下Elasticsearch中文档的搜索过程?

搜索分为两阶段过程(称之为 Query Then Fetch),在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索(搜索出满足搜索条件的文档)并构建一个匹配文档的大小为 from + size 的优先队列。每个分片返回各自优先队列中 所有文档的 ID 和排序值(只带文档id和排序条件) 给协调节点,协调节点合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。

接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。

描述一下Elasticsearch中文档的写入过程,删除或更新过程?

写入过程: 客户端发送写请求的时候,先通过协调节点(收到请求的节点此时作为协调协调节点)计算文档ID的hash值,找到要写入的分片节点,分片节点收到写请求后,先写入内存中(同时写入translog),然后定时1秒刷到文件缓存中,写到文件缓存之后这个文档可以被检索到,之后才会被写到磁盘中(默认30分钟或者日志过大超过缓存的时候强制写到磁盘)。每个写请求都会记录translog日志,记录被写到磁盘之后会删除translog

删除或更新过程: 因为ElasticsearchS中文档是不可更改的,删除的时候记录先被标记为del,检索的时候该文档依然能匹配查询,但是会在结果中被过滤掉。更新的时候Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。之后merge的时候会删除这些被标记删除的记录。

并发情况下Elasticsearch如何保证读写一致?

可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;

参考:

ElasticSearch面试题

Java
1
https://gitee.com/javajov/java-senior-engineer-interview.git
git@gitee.com:javajov/java-senior-engineer-interview.git
javajov
java-senior-engineer-interview
java高级工程师面试
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891