工作原理
1. 写数据过程
1. 客户端抉择一个 node 结点,向其发送写申请,这个结点就是 coordinate(协调者)结点
2. 协调者结点对 document 进行路由,将申请转发给对应的 node(primary shard 主分片)
3. 主分片结点解决写申请,并将数据同步到 replica shard(正本分片)
4. 协调者结点发现主分片和正本都实现数据写入后,返回响应给客户端
2. 读数据过程
1. 客户端发送读申请到任意一个 node,这个 node 成为 coordinate 结点
2. 协调者结点对 doc_id 进行路由,路由算法能够是轮询等,将申请转发给对应结点,这里的节点能够是 primary shard,也能够是 replica shard,实现读申请的负载平衡(写申请是写入到主分片,读申请既能够是主分片,也能够是正本)
3. 接管到申请的节点解决读申请,将 document 返回给 coordinate 结点
4.coordinate 结点将 document 返回给客户端
3. 删除 / 更新数据过程
1. 如果是删除操作,commit 的时候会生成一个 .del
文件,外面将某个 doc 标识为 deleted
状态,那么搜寻的时候依据 .del
文件就晓得这个 doc 是否被删除了。
2. 如果是更新操作,就是将原来的 doc 标识为 deleted
状态,而后新写入一条数据。
ES 写入数据的准实时性(near real-time)
ES 写数据时,先写入内存 buffer,在 buffer 里的时候数据是搜寻不到的;同时将数据写入 translog 日志文件。
如果 buffer 快满了,或者到肯定工夫,就会将内存 buffer 数据 refresh
到一个新的 segment file
中,然而此时数据不是间接进入 segment file
磁盘文件,而是先进入 os cache
。这个过程就是 refresh
。
每隔 1 秒钟,es 将 buffer 中的数据写入一个 新的 segment file
,每秒钟会产生一个 新的磁盘文件 segment file
,这个 segment file
中就存储最近 1 秒内 buffer 中写入的数据。
操作系统外面,磁盘文件其实都有一个货色,叫做 os cache
,即操作系统缓存,就是说数据写入磁盘文件之前,会先进入 os cache
,先进入操作系统级别的一个内存缓存中去。只有 buffer
中的数据被 refresh 操作刷入 os cache
中,这个数据就能够被搜寻到了。
为什么叫 es 是 准实时 的?NRT
,全称 near real-time
。默认是每隔 1 秒 refresh 一次的,所以 es 是准实时的,因为写入的数据 1 秒之后能力被看到。能够通过 es 的 restful api
或者 java api
,手动 执行一次 refresh 操作,就是手动将 buffer 中的数据刷入 os cache
中,让数据立马就能够被搜寻到。只有数据被输出 os cache
中,buffer 就会被清空了,因为不须要保留 buffer 了,数据在 translog 外面曾经长久化到磁盘去一份了。
translog 日志文件的作用是什么?你执行 commit 操作之前,数据要么是停留在 buffer 中,要么是停留在 os cache 中,无论是 buffer 还是 os cache 都是内存,一旦这台机器死了,内存中的数据就全丢了。所以须要将数据对应的操作写入一个专门的日志文件 translog
中,一旦此时机器宕机,再次重启的时候,es 会主动读取 translog 日志文件中的数据,复原到内存 buffer 和 os cache 中去。
总结一下,数据先写入内存 buffer,而后每隔 1s,将数据 refresh 到 os cache,到了 os cache 数据就能被搜寻到(所以咱们才说 es 从写入到能被搜寻到,两头有 1s 的提早)。每隔 5s,将数据写入 translog 文件(这样如果机器宕机,内存数据全没,最多会有 5s 的数据失落),translog 大到肯定水平,或者默认每隔 30mins,会触发 commit 操作,将缓冲区的数据都 flush 到 segment file 磁盘文件中。
倒排索引
在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被示意为一系列关键词的汇合。例如,文档 1 通过分词,提取了 20 个关键词,每个关键词都会记录它在文档中呈现的次数和呈现地位。
那么,倒排索引就是 关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都呈现了关键词。
有了倒排索引,搜索引擎能够很不便地响应用户的查问。比方用户输出查问 Facebook
,搜寻零碎查找倒排索引,从中读出蕴含这个单词的文档,这些文档就是提供给用户的搜寻后果。
例如:
要留神倒排索引的两个重要细节:
- 倒排索引中的所有词项对应一个或多个文档;
- 倒排索引中的词项 依据字典程序升序排列
(ps: 上图只是举例,并未严格按字典顺序排列)