您当前的位置: 首页 >  ar

少林码僧

暂无认证

  • 1浏览

    0关注

    317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Elasticsearch索引数据(写入)流程及原理详解

少林码僧 发布时间:2021-11-25 21:19:26 ,浏览量:1

ES索引数据(写入)流程及原理详解

请思考如下几个问题?

1、为什么Elasticsarch是近实时,而不是准实时? 2、为什么文档的CRUD操作是实时的? 3、为什么Elasticsearch能做到保证数据不丢失? 4、Refresh、flush的作用是什么? 什么时候使用? 5、Elasticsearch存储怎么让数据保存在磁盘上,而不是在内存上?

本文会给出以上问题的答案。

#mermaid-svg-CX6XGKqxsWHR34vf .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-CX6XGKqxsWHR34vf .label text{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .node rect,#mermaid-svg-CX6XGKqxsWHR34vf .node circle,#mermaid-svg-CX6XGKqxsWHR34vf .node ellipse,#mermaid-svg-CX6XGKqxsWHR34vf .node polygon,#mermaid-svg-CX6XGKqxsWHR34vf .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-CX6XGKqxsWHR34vf .node .label{text-align:center;fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .node.clickable{cursor:pointer}#mermaid-svg-CX6XGKqxsWHR34vf .arrowheadPath{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-CX6XGKqxsWHR34vf .flowchart-link{stroke:#333;fill:none}#mermaid-svg-CX6XGKqxsWHR34vf .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-CX6XGKqxsWHR34vf .edgeLabel rect{opacity:0.9}#mermaid-svg-CX6XGKqxsWHR34vf .edgeLabel span{color:#333}#mermaid-svg-CX6XGKqxsWHR34vf .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-CX6XGKqxsWHR34vf .cluster text{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-CX6XGKqxsWHR34vf .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-CX6XGKqxsWHR34vf text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-CX6XGKqxsWHR34vf .actor-line{stroke:grey}#mermaid-svg-CX6XGKqxsWHR34vf .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-CX6XGKqxsWHR34vf .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-CX6XGKqxsWHR34vf #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-CX6XGKqxsWHR34vf .sequenceNumber{fill:#fff}#mermaid-svg-CX6XGKqxsWHR34vf #sequencenumber{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf #crosshead path{fill:#333;stroke:#333}#mermaid-svg-CX6XGKqxsWHR34vf .messageText{fill:#333;stroke:#333}#mermaid-svg-CX6XGKqxsWHR34vf .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-CX6XGKqxsWHR34vf .labelText,#mermaid-svg-CX6XGKqxsWHR34vf .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-CX6XGKqxsWHR34vf .loopText,#mermaid-svg-CX6XGKqxsWHR34vf .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-CX6XGKqxsWHR34vf .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-CX6XGKqxsWHR34vf .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-CX6XGKqxsWHR34vf .noteText,#mermaid-svg-CX6XGKqxsWHR34vf .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-CX6XGKqxsWHR34vf .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-CX6XGKqxsWHR34vf .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-CX6XGKqxsWHR34vf .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-CX6XGKqxsWHR34vf .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .section{stroke:none;opacity:0.2}#mermaid-svg-CX6XGKqxsWHR34vf .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-CX6XGKqxsWHR34vf .section2{fill:#fff400}#mermaid-svg-CX6XGKqxsWHR34vf .section1,#mermaid-svg-CX6XGKqxsWHR34vf .section3{fill:#fff;opacity:0.2}#mermaid-svg-CX6XGKqxsWHR34vf .sectionTitle0{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .sectionTitle1{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .sectionTitle2{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .sectionTitle3{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-CX6XGKqxsWHR34vf .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .grid path{stroke-width:0}#mermaid-svg-CX6XGKqxsWHR34vf .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-CX6XGKqxsWHR34vf .task{stroke-width:2}#mermaid-svg-CX6XGKqxsWHR34vf .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .taskText:not([font-size]){font-size:11px}#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-CX6XGKqxsWHR34vf .task.clickable{cursor:pointer}#mermaid-svg-CX6XGKqxsWHR34vf .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CX6XGKqxsWHR34vf .taskText0,#mermaid-svg-CX6XGKqxsWHR34vf .taskText1,#mermaid-svg-CX6XGKqxsWHR34vf .taskText2,#mermaid-svg-CX6XGKqxsWHR34vf .taskText3{fill:#fff}#mermaid-svg-CX6XGKqxsWHR34vf .task0,#mermaid-svg-CX6XGKqxsWHR34vf .task1,#mermaid-svg-CX6XGKqxsWHR34vf .task2,#mermaid-svg-CX6XGKqxsWHR34vf .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutside0,#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutside2{fill:#000}#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutside1,#mermaid-svg-CX6XGKqxsWHR34vf .taskTextOutside3{fill:#000}#mermaid-svg-CX6XGKqxsWHR34vf .active0,#mermaid-svg-CX6XGKqxsWHR34vf .active1,#mermaid-svg-CX6XGKqxsWHR34vf .active2,#mermaid-svg-CX6XGKqxsWHR34vf .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-CX6XGKqxsWHR34vf .activeText0,#mermaid-svg-CX6XGKqxsWHR34vf .activeText1,#mermaid-svg-CX6XGKqxsWHR34vf .activeText2,#mermaid-svg-CX6XGKqxsWHR34vf .activeText3{fill:#000 !important}#mermaid-svg-CX6XGKqxsWHR34vf .done0,#mermaid-svg-CX6XGKqxsWHR34vf .done1,#mermaid-svg-CX6XGKqxsWHR34vf .done2,#mermaid-svg-CX6XGKqxsWHR34vf .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-CX6XGKqxsWHR34vf .doneText0,#mermaid-svg-CX6XGKqxsWHR34vf .doneText1,#mermaid-svg-CX6XGKqxsWHR34vf .doneText2,#mermaid-svg-CX6XGKqxsWHR34vf .doneText3{fill:#000 !important}#mermaid-svg-CX6XGKqxsWHR34vf .crit0,#mermaid-svg-CX6XGKqxsWHR34vf .crit1,#mermaid-svg-CX6XGKqxsWHR34vf .crit2,#mermaid-svg-CX6XGKqxsWHR34vf .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-CX6XGKqxsWHR34vf .activeCrit0,#mermaid-svg-CX6XGKqxsWHR34vf .activeCrit1,#mermaid-svg-CX6XGKqxsWHR34vf .activeCrit2,#mermaid-svg-CX6XGKqxsWHR34vf .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-CX6XGKqxsWHR34vf .doneCrit0,#mermaid-svg-CX6XGKqxsWHR34vf .doneCrit1,#mermaid-svg-CX6XGKqxsWHR34vf .doneCrit2,#mermaid-svg-CX6XGKqxsWHR34vf .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-CX6XGKqxsWHR34vf .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-CX6XGKqxsWHR34vf .milestoneText{font-style:italic}#mermaid-svg-CX6XGKqxsWHR34vf .doneCritText0,#mermaid-svg-CX6XGKqxsWHR34vf .doneCritText1,#mermaid-svg-CX6XGKqxsWHR34vf .doneCritText2,#mermaid-svg-CX6XGKqxsWHR34vf .doneCritText3{fill:#000 !important}#mermaid-svg-CX6XGKqxsWHR34vf .activeCritText0,#mermaid-svg-CX6XGKqxsWHR34vf .activeCritText1,#mermaid-svg-CX6XGKqxsWHR34vf .activeCritText2,#mermaid-svg-CX6XGKqxsWHR34vf .activeCritText3{fill:#000 !important}#mermaid-svg-CX6XGKqxsWHR34vf .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-CX6XGKqxsWHR34vf g.classGroup text .title{font-weight:bolder}#mermaid-svg-CX6XGKqxsWHR34vf g.clickable{cursor:pointer}#mermaid-svg-CX6XGKqxsWHR34vf g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-CX6XGKqxsWHR34vf g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-CX6XGKqxsWHR34vf .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-CX6XGKqxsWHR34vf .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-CX6XGKqxsWHR34vf .dashed-line{stroke-dasharray:3}#mermaid-svg-CX6XGKqxsWHR34vf #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf .commit-id,#mermaid-svg-CX6XGKqxsWHR34vf .commit-msg,#mermaid-svg-CX6XGKqxsWHR34vf .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-CX6XGKqxsWHR34vf g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-CX6XGKqxsWHR34vf g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-CX6XGKqxsWHR34vf g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-CX6XGKqxsWHR34vf .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-CX6XGKqxsWHR34vf .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-CX6XGKqxsWHR34vf .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-CX6XGKqxsWHR34vf .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-CX6XGKqxsWHR34vf .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-CX6XGKqxsWHR34vf .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-CX6XGKqxsWHR34vf .edgeLabel text{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CX6XGKqxsWHR34vf .node circle.state-start{fill:black;stroke:black}#mermaid-svg-CX6XGKqxsWHR34vf .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-CX6XGKqxsWHR34vf #statediagram-barbEnd{fill:#9370db}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-state .divider{stroke:#9370db}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-CX6XGKqxsWHR34vf .note-edge{stroke-dasharray:5}#mermaid-svg-CX6XGKqxsWHR34vf .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-CX6XGKqxsWHR34vf .error-icon{fill:#522}#mermaid-svg-CX6XGKqxsWHR34vf .error-text{fill:#522;stroke:#522}#mermaid-svg-CX6XGKqxsWHR34vf .edge-thickness-normal{stroke-width:2px}#mermaid-svg-CX6XGKqxsWHR34vf .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-CX6XGKqxsWHR34vf .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-CX6XGKqxsWHR34vf .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-CX6XGKqxsWHR34vf .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-CX6XGKqxsWHR34vf .marker{fill:#333}#mermaid-svg-CX6XGKqxsWHR34vf .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-CX6XGKqxsWHR34vf { color: rgba(0, 0, 0, 0.75); font: ; }
Elasticsearch写入核心概念
索引 index
Elasticsearch中的''索引''有点像关系数据库中的数据库
分片 shard
分片是Lucene的一个索引.它是存储/索引数据的地方
'索引'可以由单个分片组成,但通常由多个分片组成,一部分主分片,一部分副本分片
ES默认5个主分片,1个副本分片
副本分片的用途
1.主节点故障时的故障转移
1.增加的读取吞吐量
分段 segment
每个分片包含多个'分段',其中分段是倒排索引
分段内的doc数量上限是2的31次方
默认每秒都会生成一个segment文件
在分片中搜索将依次搜索每个片段,然后将其结果合并到该分片的最终结果中

2.4 倒排索引 “倒排索引”是Lucene用于使数据可搜索的数据结构。

一图胜千言!如下:索引、分片、分段的关系一目了然。

2.5 translog日志文件: 为了防止elasticsearch宕机造成数据丢失保证可靠存储,es会将每次写入数据同时写到translog日志中。 translog还用于提供实时CRUD。 当您尝试按ID检索,更新或删除文档时,它会首先检查translog中是否有任何最近的更改,然后再尝试从相关段中检索文档。 这意味着它始终可以实时访问最新的已知文档版本。

2.6、倒排索引是不可变的 写入磁盘的倒排索引永远不会改变。 好处:无需锁定,不用担心多进程操作更改数据导致数据不一致问题。 坏处:经常被问到的问题,更新了词典词库后,老的索引不能生效。如果要使其可搜索,则必须重建整个索引。建议:reindex操作。

2.7 分段不可变 分段是不可变的。更新文档时,它实际上只是将旧文档标记为已删除,并为新文档编制索引。合并过程还会清除这些旧的已删除文档。

3、Elasticsearch写入步骤拆解 步骤1:新document首先写入内存Buffer缓存中。 步骤2:每隔一段时间,执行“commitpoint”操作,buffer写入新Segment中。 步骤3:新segment写入文件系统缓存 filesystem cache。 步骤4:文件系统缓存中的index segment被fsync强制刷到磁盘上,确保物理写入。 此时,新egment被打开供search操作。 步骤5:清空内存buffer,可以接收新的文档写入。

官方解读地址:http://t.cn/EyhPQt5 这是传统意义的写入步骤,实际ES为保证实时性,会做refresh操作。

#4、Elasticsearch refresh和flush

4.1、refresh操作 相比于Lucene的提交操作,ES的refresh是相对轻量级的操作。 先将index-buffer中文档(document)生成的segment写到文件系统之中,这样避免了比较损耗性能io操作,又可以使搜索可见。 默认1s钟刷新一次,所以说ES是近实时的搜索引擎,不是准实时。 注意:实际需要结合自己的业务场景设置refresh频率值。调大了会优化索引速度。注意单位:s代表秒级。

PUT /my_logs
{
  "settings": {
    "refresh_interval": "30s" 
  }
}

4.2、flush操作 新创建的document数据会先进入到index buffer之后,与此同时会将操作记录在translog之中,当发生refresh时ranslog中的操作记录并不会被清除,而是当数据从filesystem cache中被写入磁盘之后才会将translog中清空。 从filesystem cache写入磁盘的过程就是flush。

步骤1:当translog变得太大时 ,可以执行commit ponit操作。 步骤2:使用fsync刷新文件系统缓存,写入磁盘。 步骤3:旧缓冲区被清除。

flush操作如下:

POST /_flush?wait_for_ongoing 1 5、图解Elasticsearch写入持久化模型

图的示意图要从上往下看。 1、当新的文档写入后,写入 index buffer的同时会写入translog。 2、refresh操作使得写入文档搜索可见; 3、flush操作使得filesystem cache写入磁盘,以达到持久化的目的。

6、小结 相信经过梳理,开篇几个问题的答案便非常清晰了。 知识的累积,需要过程,《高手》中尤其强调第一手文档的重要性。 第一手的官方文档+源码是根基,是最快、最准的方式。

关注
打赏
1661398670
查看更多评论
立即登录/注册

微信扫码登录

0.0399s