集群(Cluster) : ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。
节点(Node) : 形成集群的每个服务器称为节点
索引(index) : 在 ES 中, 索引是一组文档的集合。(类似数据库中的一张表,文档id类似表中的主键)
分片(shard) :当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起。(类似于数据库的分库分表,把某个表中的数据分散到不同的库不同的表中)
副本(Replia) :为提高查询吞吐量或实现高可用性,可以使用分片副本。副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
搜索分为两阶段过程(称之为 Query Then Fetch),在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索(搜索出满足搜索条件的文档)并构建一个匹配文档的大小为 from + size 的优先队列。每个分片返回各自优先队列中 所有文档的 ID 和排序值(只带文档id和排序条件) 给协调节点,协调节点合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。
接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。
写入过程: 客户端发送写请求的时候,先通过协调节点(收到请求的节点此时作为协调协调节点)计算文档ID的hash值,找到要写入的分片节点,分片节点收到写请求后,先写入内存中(同时写入translog),然后定时1秒刷到文件缓存中,写到文件缓存之后这个文档可以被检索到,之后才会被写到磁盘中(默认30分钟或者日志过大超过缓存的时候强制写到磁盘)。每个写请求都会记录translog日志,记录被写到磁盘之后会删除translog
删除或更新过程: 因为ElasticsearchS中文档是不可更改的,删除的时候记录先被标记为del,检索的时候该文档依然能匹配查询,但是会在结果中被过滤掉。更新的时候Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。之后merge的时候会删除这些被标记删除的记录。
可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
参考:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。