1.介绍
本文主要介绍ES分布式的一些原理,了解一个文档的写入、提取、搜索在ES里面做了哪些事情。
2.文档写入流程
我们首先了解在ES集群中,一个单独的文档是如何写入的。
1、客户端发送任何一个请求到任意一个节点,这个节点就成为协调节点 (coordinate node)
2、协调节点对新增document(可以手动设置doc id,也可以由系统分配)的id号进行哈希取值,在根据分片的数量进行取模,得到的数量就是具体的节点,然后将请求转发给对应node。
文档编号 | Hash值 | 对应主分片编号(HASH值%主分片数量) |
---|---|---|
800 | 8817201 | 0 |
900 | 8932174 | 1 |
933 | 8936891 | 2 |
主分片确定后:
3、node上的primary shard处理请求,然后将数据同步到replica node
4、协调节点如果发现primary shard所在的node和所有的replica shard所对应的 node都搞定之后,就会将请求返回给客户端
3.
1、客户端发送任何一个请求到任意一个node,这个节点就成为协调节点
2、协调节点对文档id进行哈希路由,此时会使用round-robin随机轮询算法,在主分 片以及所有的副本分片中随机选择一个,让读请求负载均衡
3、数据提取完毕,返回document给协调节点
4、协调节点再将数据返回给客户端
4.文档搜索过程
文档搜索和提取的区别:
文档提取:一次性获取一个文档
文档搜索:一次性获取多个文档
1、客户端发送一个请求给协调节点(coordinate node)
2、协调节点将搜索的请求转发给所有shard对应的primary shard或replica shard
3、query phase:每一个shard将自己搜索的结果(其实也就是一些唯一标识),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最后的结果
5.文档写入的底层原理
看一下文档是如何在内存和磁盘中进行协调的,为什么作为ES文档的提取速度这么快的原因。
按照文档的存储组织来说,它主要分成了四块:
1、index buffer:内存的索引缓冲区
2、filesystem cache:系统文件的缓冲区
3、translog:数据的操作日志,为了防止数据丢失设计的
4、Disk:最终落盘存储的磁盘
在每一个过程中他都有一个处理的逻辑,下面我们分别来看一下:
1、当你写一条数据document的时候,一方面写入到内存buffer缓冲中,一方面同时 写入到translog日志文件中。
tips: translog日志作用:在数据最终保存到磁盘之前,所有的数据都是停留在buffer或OS cache之中,无论buffer或OS cache都是内存,一旦这台机器死了,内存的数据就会丢失,所以需要将数据对应的操作写入一个专门的日志之中,一旦机器出现宕机,再次重启的时候,es会主动的读取translog之中的日志文件的数据,恢复到内存buffer和OS cache之中。
2、buffer满了或者每隔1秒(可配),自动refresh将内存buffer中的数据生成index segment文件并写入os cache,此时index segment可被打开以供search查询读取,这样文档就可以被搜索到了(注意,此时文档还没有写到磁盘上);然后清空内存buffer供后续使用。可见,refresh实现的是文档从内存移到文件系统缓存的过程。
tips: index segment本质就是倒排索引,ES的核心lucene引擎就是将大的倒排索引拆 分为许多小的index segment倒排索引存储。
(1)执行refresh操作将mem buffer中的数据写入到新的segment并写入os cache,然后打开本segment以供search使用,最后再次清空mem buffer。
(2)一个commit point被写入磁盘,这个commit point中标明所有的index segment。
(3)filesystem cache(os cache)中缓存的所有的index segment文件被fsync 强制刷到磁盘os disk,当index segment被fsync强制刷到磁盘上以后,就会被 打开,供查询使用。
(4)translog被清空和删除,创建一个新的translog。
6.为什么说es是准实时的?
NRT,全程near real-time,默认每隔1s refresh一次,所以es是准实时的,因为写入的数据1s之 后才能被看到。也可以通过restful ap或者java api,手动执行一次refresh操作。总之,只要数 据被输入到os cache中,数据就立马可以被搜索到
7.为什么ES可能会丢失5秒数据?
利用translog的数据也是先写入到内存buffer和os cache / segment filie 中,默认5s将数据 刷新到os disk中去,也就是说,可能有5s的数据仅仅停留在内存buffer或 os cache中,如果此 时机器挂了,会丢失5s的数据,但是这样性能比较好。如果对数据一致性要求较高,想要数据完全不丢,可以将每次的操作都必须直接fsync到磁盘,但是性能会比较差
8.ES中的更新与删除操作背后的原理是什么?
删除操作
当删除document的时候,会生成一个.del文件(如果没有的话) ,里面将被删除的document并标识为deleted状态。当搜索的时候,根据.del文件就知道document是否被删除了。
更新操作
ES其实没有更新操作,而是将原来的document标识为deleted状态,然后新写入一条被更新后的数据。
9.segment merge的执行流程
segment merge作用:将多个小的倒排索引合并成一个大的索引,方便我们进行磁盘的IO。
执行流程:
- 选择一些相似大小的segment file, merge成一个大的segment file,同时,被标记为deleted的document也会被彻底物理删除
- 将新的segment file flush到os disk
- 写入一个新的commit point,包括了新的segment file,并排除了旧的那些 segment file
- 将新的segment file打开供搜索
- 将旧的segment file删除
转载请注明:西门飞冰的博客 » Elasticsearch分布式底层原理