分片内部原理

  • 分片是如何工作的

    • 为什么ES搜索是近实时性
    • 为什么CRUD 操作也是实时性
    • ES 是怎么保证更新被持久化时断电也不丢失数据
    • 为什么删除文档不会立即释放空间
    • refresh, flush, 和 optimize API 作用
  • 使文本可被搜索

    倒排索引的结构

    词项 文档列表

    Term | Doc 1 | Doc 2 | Doc 3 | ...

    ------------------------------------

    brown | X | | X | ...

    fox | X | X | X | ...

    quick | X | X | | ...

    the | X | | X | ...

  • 倒排索引的不变性
    • 不需要锁
    • 可被内核的文件系统缓存,停留在内存中,大部分请求会直接请求到内存,不会落到磁盘上
    • filter缓存,在索引的生命周期始终有效。不需要再每次数据改变时重建
    • 写入单个较大的倒排索引使允许数据被压缩
  • 如何在索引不变情况下 动态更新索引
    • 使用更多的索引,来解决这个问题
    • 通过增加新的补充索引来反映新近的修改,而不是直接重写整个倒排索引
    • 一个 Lucene 索引包含一个提交点和三个段

    • 逐段搜索的流程
      • 新文档被收集到内存索引缓存
      • 不时地, 缓存被 提交
        • 一个新的段----一个追加的倒排索引--被写入磁盘
        • 一个新的包含新段名字的 提交点 被写入磁盘
        • 磁盘进行 同步 — 所有在文件系统缓存中等待的写入都刷新到磁盘
      • 新的段被开启,让它包含的文档可见以被搜索
      • 内存缓存被清空,等待接收新的文档
    • 一个在内存缓存中包含新文档的 Lucene 索引
    • 在一次提交后,一个新的段被添加到提交点而且缓存被清空
  • 删除和更新文档
    • 段是不可改变的,每个提交点都会有一个.del文件。在这个文件中能列出这些删除文档的短信息
    • 当文档被删除时不是删除,只是在.del文件中被登记
    • 文档的更新也是这样的,先将更新的文档标记为删除。然后文档的新版本被索引到一个新的段中

近实时搜索

  • 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据。但是每次提交的一个新的段都fsync 这样操作代价过大。可以使用下面这种更轻量的方式
  • 在内存缓冲区中包含了新文档的 Lucene 索引
    • Lucene 允许新段被写入和打开--使其包含的文档在未进行一次完整提交时便对搜索可见
  • 缓冲区的内容已经被写入一个可被搜索的段中,但还没有进行提交
    • 这里新段会被先写入到文件系统缓存--这一步代价会比较低,稍后再被刷新到磁盘--这一步代价比较高
  • 默认情况下每个分片会每秒自动刷新一次
    • 近 实时搜索: 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见
    • POST /_refresh // 刷新Refresh 所有的索引
    • POST /blogs/_refresh // 只刷新Refresh blogs 索引

      可以在settings 设置对定时刷新频率的大小

    PUT /my_logs

    {

    "settings": {

    "refresh_interval": "30s" //30秒刷新一次

    "refresh_interval": "-1" //关闭自动刷新

    "refresh_interval": "1s"//每秒自动刷新

    }

    }

    持久化变更

    在没有 fsync 把数据从内存刷新到硬盘中,我们不能保证数据在断电或程序退出时之后依然存在

  • 即时每秒刷新,也不能实现近实时搜索。我们任然有另外的方法确保从失败中回复数据
  • ES 增加一个translog,或者叫做事务日志。在每次操作是均进行日志记录
  • 整个流程是如下的操作
    1. 一个文档被索引之后,就会被添加到内存缓冲区,并且 追加到了 translog

      -

    2. 刷新(refresh)使分片处于缓存被清空,但是事务日志不会的状态
      • 内存缓冲区的文档被写入新的段中,但是没有进行fsync
      • 段被打开,且可被搜索到
      • 内存缓冲区被清空
    3. 进程继续进行,更多的文档被添加到内存缓冲区和追加的事务日志中
    4. 每隔一段时间,translog太大 或 索引被刷新。一个新的translog被创建,并且被全量提交

      -

      • 所有内存缓冲区的文档都被写入一个新的段中
      • 缓冲区内清空
      • 一个提交点被写入硬盘
      • 文件系统缓存通过fsync被刷新
      • 老的translog 被删除
  • translog 提供所有没有被刷新到磁盘操作的一个持久化记录。当ES启动时,会根据最后一个提交点去恢复已知的段
  • translog 也可供用来提供实时的CRUD。但我们进行一些CRUD操作时,它会首先检查translog任何最近的变更。
  • flush API 执行一次提交,并截断translog的操作
    • 分片默认每30M自动flush一次。translog太大也会自动flush
    • 可通过自己执行flush API操作

      POST /blogs/_flush //刷新索引

      POST /_flush?wait_for_ongoing //刷新索引并等待所有的刷新结果返回

段合并
  • 段合并的时候会将那些旧的已删除的文档从文件系统中删除,被删除或者被更新的文档不会被复制到新的大段中
  • 段合并的流程

    -

    • 当索引的时候,刷新(refresh)操作会创建新的段
    • 合并的时候会选择一部分大小相似的段,并且将其合并到更大的段中
    • 段的合并结束,老的段就要被删除

  • optimized API 的作用
    • optimize API大可看做是 强制合并 API 。

ElasticSearch 学习记录之集群分片内部原理的更多相关文章

  1. ElasticSearch学习笔记-02集群相关操作_cat参数

    _cat参数允许你查看集群的一些相关信息,如集群是否健康,有哪些节点,以及索引的情况等的. 检测集群是否健康 curl localhost:9200/_cat/health?v 说明: curl 是一 ...

  2. ElasticSearch 学习记录之Text keyword 两种基本类型区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  3. ElasticSearch 5学习(6)——分布式集群学习分享1

    在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...

  4. ElasticSearch 5学习(7)——分布式集群学习分享2

    前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...

  5. Elasticsearch学习记录(分布式的特性)

    Elasticsearch学习记录(分布式的特性) 分布式的特性 我们提到Elasticsearch可以扩展到上百(甚至上千)的服务器来处理PB级的数据.然而我们的例子只给出了一些使用Elastics ...

  6. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  7. Akka-Cluster(6)- Cluster-Sharding:集群分片,分布式交互程序核心方式

    在前面几篇讨论里我们介绍了在集群环境里的一些编程模式.分布式数据结构及具体实现方式.到目前为止,我们已经实现了把程序任务分配给处于很多服务器上的actor,能够最大程度的利用整体系统的硬件资源.这是因 ...

  8. Elasticsearch学习记录(入门篇)

    Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...

  9. Elasticsearch常见用法-分布式集群

    集群内部工作方式 Elasticsearch用于构建高可用和可扩展的系统.扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))或者购买更多的服务器( ...

随机推荐

  1. ArcGIS中的坐标系统定义与投影转换【转】

    ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...

  2. MyTtcp 测试网络带宽

    网络编程学习 注意的指标MB/S 带宽每秒处理的信息 查询等 messages/s queries/s transaction/s延时cpu使用率 ttcp测试网络 读写读写 循环 测试网络带宽 正确 ...

  3. java 面试每日一题

    题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? import java.util.Scanner; public cl ...

  4. JAVA 关于Icon,Image,ImageIcon的简单的对比参考 分类: Java Game 2014-08-14 17:08 210人阅读 评论(0) 收藏

    转自:http://blog.csdn.net/bcmissrain/article/details/7190886 其实就算是现在,我还是有不少地方概念模糊,但是下面的内容是是没有什么问题的.稍微介 ...

  5. Struts2与ajax整合之缺点

    之前有篇博客介绍了Struts2与ajax的整合,链接Struts2之-集成Json插件实现Ajax 这里不再累述,看以上博客. 此篇博客想吐槽一下Struts2的缺点--错误处理做的不好,怎么做的不 ...

  6. 将home多余的空间分配到&quot;/&quot;分区下

    一.操作过程 1.df -h 查看分区大小情况; [root@localhost /]# df -h Filesystem            Size  Used Avail Use% Mount ...

  7. 冲刺NO.5

    Alpha冲刺第五天 站立式会议 项目进展 今日项目完成内容主要包括了JS的学习,事务管理员模块与学生模块的完善与补充,并且开始编写信用信息管理模块和奖惩事务管理模块. 问题困难 前端部分的技术掌握的 ...

  8. pointer-events属性屏蔽鼠标事件(点击穿透上层元素)

    应用场景 我们在 HTML 开发时可能会遇到这样的情况:页面上有一些元素使用绝对定位布局,这些元素可能会遮盖住它们位置下方的某个元素的部分或者全部.默认情况下,下方元素被遮挡的部分是不会响应鼠标事件的 ...

  9. 「TJOI2015」线性代数 解题报告

    「TJOI2015」线性代数 和牛客某题很像 在和里面有\(B_{i,j}\)要求是\(A_i,A_j\)都为\(1\),和里面减去\(C_i\)要求\(A_i\)为\(1\),然后先把贡献也就是\( ...

  10. 深入理解ajax

    http://www.imooc.com/code/13468    基础练习 http://www.imooc.com/video/5644            !ajax! 常用   for   ...