做网站有限公司,智慧团建官方网站,网页游戏不用登录,网站运营需要服务器吗Elasticsearch写入原理深入详解
1. ES相关问题
引用官方文档地址#xff1a;分片内部原理 | Elasticsearch: 权威指南 | Elastic
为什么Elasticsarch是近实时#xff0c;而不是准实时#xff1f;
为什么文档的CRUD (创建-读取-更新-删除) 操作是实时的#xff1f;
Elast…Elasticsearch写入原理深入详解
1. ES相关问题
引用官方文档地址分片内部原理 | Elasticsearch: 权威指南 | Elastic
为什么Elasticsarch是近实时而不是准实时
为什么文档的CRUD (创建-读取-更新-删除) 操作是实时的
Elasticsearch 是怎样保证更新被持久化在断电时也不丢失数据?
Refresh、flush的作用是什么 什么时候使用
Elasticsearch存储怎么让数据保存在磁盘上而不是在内存上
为什么删除文档不会立刻释放空间2. ES索引、分片、分段的概念
2.1 索引 index
索引是 Elasticsearch 存储、组织和搜索数据的逻辑容器。它类似于 MySQL 中的数据表一个 Elasticsearch 集群可以包含多个索引。从 Elasticsearch 7.x 开始Elasticsearch 不再支持多个 type且默认为_doc并在之后的版本中完全移除因此索引可以认为是一个数据表而非数据库
2.2 分片 shard
在Elasticsearch中分片是对索引数据的水平划分和分布。索引被分成多个分片每个分片可以在集群的不同节点上存储。这种分片的设计提供了一种水平扩展的能力允许将大量数据分布到多个节点上从而提高性能和可伸缩性。每个分片就是一个Lucene的实例具有完整的功能。
ES使用数据**分片shard**来提高服务的可用性将数据分散保存在不同的节点上以降低当单个节点发生故障时对数据完整性的影响同时使用副本repiica来保证数据的完整性。关于分片的默认分配策略在7.x之前默认5个primary shard每个primary shard默认分配一个replica即5主1副而7.x之后默认1主1副
2.3 分段 segment
一个段(segment)是有完整功能的倒排索引Lucene中的索引指的是段的集合和提交点(commit point即记录所有分段的文件)。当在这个commit point上进行搜索就是在这个提交点下面的所有的segment文件中搜索每个segment返回结果然后汇总返回给用户。
每当创建新文档时它们就会被写入新的 Segment 中。 每当创建新文档时它们都属于一个新的 Segment并且无需修改前一个 Segment。 如果必须删除文档则在其原始 Segment 中将其标记为已删除。 这意味着它永远不会从 Segement 中物理删除。
与更新相同文档的先前版本在上一个 Segment 中被标记为已删除更新后的版本保留在当前 Segment 中的同一文档 ID下 分段内的doc数量上限是2的31次方 默认每秒都会生成一个segment文件 在分片中搜索将依次搜索每个片段然后将其结果合并到该分片的最终结果中 查看索引中分段信息的方法
GET /nlc_works/_segments shards: 包含了关于索引各个分片的详细信息。
0, 1, 2: 这些是分片的编号表示各个分片的信息。 routing: 分片的路由信息表示该分片所在的节点、状态等。num_committed_segments: 分片中已提交的段segments数量。num_search_segments: 分片中用于搜索的段数量。segments: 分片中的段信息。 _2, _3, _a, _b, _c, _3, _4: 这些是段的标识表示各个段的信息。 generation: 段的代数表示段的生成次数。num_docs: 段中文档的数量。deleted_docs: 已删除的文档数量。size_in_bytes: 段的大小以字节为单位。memory_in_bytes: 段占用的内存大小。committed: 表示该段是否已提交。search: 表示该段是否用于搜索。version: Lucene 版本。compound: 表示该段是否是复合段。attributes: 段的属性信息。
2.4 索引、分片、分段的关系图示
Lucene 索引就是我们所说的Elasticsearch分片 而 Elasticsearch 中的索引是分片的集合。 3. es写入操作
3.1 refresh操作
refresh 操作是指手动或自动刷新索引从in-memory buffer内存缓冲区到 filesystem cache文件系统缓存 的过程。在 ES中写入的文档首先被索引到内存中的缓冲区in-memory buffer创建一个新的segment执行refresh 操作会使该segment写入filesystem cache文件系统缓存同时可以立即被搜索到。 可以通过两种方式触发 refresh 操作 显式刷新Explicit Refresh通过发送 refresh 请求到 Elasticsearch API 来手动执行刷新操作。这样可以确保在需要时立即刷新数据但过于频繁的手动刷新可能会影响性能。 POST /{index}/_refresh自动刷新Automatic RefreshElasticsearch 也支持自动刷新机制。可以配置索引的刷新间隔refresh interval使得索引在一定时间内自动刷新。这样可以减少手动操作的需求但需要权衡刷新频率与性能之间的关系。 PUT /my_index/_settings
{index.refresh_interval: 1s
}关闭自动刷新 PUT /my_index/_settings
{ refresh_interval: -1
}3.2 flush操作
Elasticsearch 中的 flush 操作是指将 filesystem cache文件系统缓存 中的数据写入到磁盘并清空事务日志transaction log文件的过程。这个过程确保了在节点重启或者故障发生时已经提交但尚未持久化到磁盘上的数据不会丢失。
具体来说flush 操作包含以下步骤 写入磁盘Write to Disk将filesystem cache文件系统缓存的 segment 数据刷入磁盘确保数据持久化。 清空事务日志Clear Transaction Log清空事务日志文件以删除已经被持久化的数据。事务日志是用来记录索引操作的包括写入、更新和删除操作。一旦数据被成功写入到磁盘相关的事务日志就会被清空以释放磁盘空间并减少对日志文件的依赖。
flush 操作默认情况下不会经常执行而是由 Elasticsearch 自动管理。通常Elasticsearch 会根据一定的条件来触发 flush 操作例如
translog大小达到阈值默认配置下固定时间间隔手动触发 flush
在默认配置下Elasticsearch 会每隔一段时间默认是 30 分钟执行一次 flush 操作。这个时间间隔可以通过配置文件进行调整以满足特定需求。flush 操作的执行频率和时机会受到硬件性能、索引写入频率等因素的影响。
手动触发 flush 操作 API
POST /{index}/_flush3.3 commit 提交
commit point 是指在内存中的数据被成功写入到磁盘上并持久化的时间点。当 Elasticsearch 成功将数据写入到磁盘上后会生成一个新的 commit point这个点标志着数据的持久化已经完成之后的操作可以基于这个新的 commit point。
commit 操作流程 写入新的分段segment首先Elasticsearch 将内存中的新文档数据写入到磁盘上形成一个新的分段。这个新的分段包含了最近添加的文档数据。 更新提交点commit point随后Elasticsearch 更新分片的提交点记录新创建的分段以及相关的元数据信息。。 同步磁盘fsync为了确保数据的持久化Elasticsearch 执行磁盘同步操作将所有在文件系统缓存中等待的写入操作刷新到磁盘上。 打开新分段完成同步后新创建的分段被打开使得其中包含的文档数据可以被搜索。新添加的文档就可以立即被查询到。 清空内存缓冲区最后内存中的索引缓冲区被清空准备接受新的文档数据。下一次的提交操作就可以将新的文档写入到一个新的分段中
commit point 的生成通常发生在以下情况下 显式提交Explicit Commit通过 API 或命令向 Elasticsearch 发送显式提交请求要求将内存中的数据刷新到磁盘上。这种情况下commit point 会被立即生成。 自动提交Automatic CommitElasticsearch 会定期检查内存中的缓冲区并在达到一定条件时自动触发数据的刷新。这些条件可能包括缓冲区已满、一定的时间间隔已过等。
每个 commit point 记录了当前 Elasticsearch 中所有可用的段segments。对于每个 commit point都会有一个与之对应的 .del 文件用于记录删除操作。在 Elasticsearch 中删除操作并不会直接从磁盘上物理移除文档而是将其标记为已删除状态。这些删除操作会被准确地记录在 .del 文件中包括了在某个段内哪些文档已被删除。当进行查询操作时尽管在段中已经标记为删除的文档可以被查询到但在返回结果时Elasticsearch 会根据对应 commit point 维护的 .del 文件将已被删除的文档过滤掉确保返回的结果是准确的。这一机制保证了即使执行了删除操作查询结果也会反映出文档的最新状态。
4. Elasticsearch写入步骤拆解
在Elasticsearch中当数据被写入到一个节点的主分片之后副本分片会被复制到其他节点。这个过程是由Elasticsearch内部的分片复制机制完成的通常在写入数据到主分片之后Elasticsearch会异步地将主分片的数据复制到其他节点上的相应副本分片
当前有三个节点并且每个索引有一个主分片和一个副本分片那么数据写入的过程如下 客户端发送写入请求到Nginx负载均衡器 Nginx负载均衡器根据负载均衡算法选择一个节点作为协调节点 协调节点通过哈希取模算法确定数据要写入的目标节点并将写入请求转发到目标节点 目标节点接收到写入请求后将数据写入到对应的主分片 目标节点开始将主分片的数据异步复制到其他节点上的副本分片 其他节点接收到复制请求后开始接收并存储副本分片的数据 primary和replica节点数据写入完成后协调节点返回结果响应nginx转发响应结果 Elasticsearch写入步骤图示 5. 相关参考
官网参考分片内部原理 | Elasticsearch: 权威指南 | Elastic
官网参考[Inside a Shard | Elasticsearch: The Definitive Guide master] | Elastic
参考链接 Elasticsearch写入原理深入详解-阿里云开发者社区 (aliyun.com)
参考ElasticsearchElasticsearch 中的 refresh 和 flush 操作指南_elasticsearch flush-CSDN博客
本文依照官网和其他资料整理完成如果有错误之处烦请指出