美文网首页
22.es各操作实现原理

22.es各操作实现原理

作者: 不怕天黑_0819 | 来源:发表于2020-08-11 09:26 被阅读0次

    本文集主要是总结自己在项目中使用ES 的经验教训,包括各种实战和调优。

    新建、索引和删除文档

    新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上。

    下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:

    1. 客户端给Node 1发送新建、索引或删除请求。
    2. 节点使用文档的_id确定文档属于分片0。它转发请求到Node 3,分片0位于这个节点上。
    3. Node 3在主分片上执行请求,如果成功,它转发请求到相应的位于Node 1和Node 2的复制节点上。当所有的复制节点报告成功,Node 3报告成功到请求的节点,请求的节点再报告给客户端。

    客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片。你的修改生效了。

    有很多可选的请求参数允许你更改这一过程。你可能想牺牲一些安全来提高性能。这一选项很少使用因为Elasticsearch已经足够快,不过为了内容的完整我们将做一些阐述。

    replication

    复制默认的值是sync。这将导致主分片得到复制分片的成功响应后才返回。

    如果你设置replication为async,请求在主分片上被执行后就会返回给客户端。它依旧会转发请求给复制节点,但你将不知道复制节点成功与否。

    上面的这个选项不建议使用。默认的sync复制允许Elasticsearch强制反馈传输。async复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。

    检索文档

    文档能够从主分片或任意一个复制分片被检索。

    下面我们罗列在主分片或复制分片上检索一个文档必要的顺序步骤:

    1. 客户端给Node 1发送get请求。
    2. 节点使用文档的_id确定文档属于分片0。分片0对应的复制分片在三个节点上都有。此时,它转发请求到Node 2。
    3. Node 2返回文档(document)给Node 1然后返回给客户端。

    对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片副本。

    可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。

    局部更新文档

    update API 结合了之前提到的读和写的模式。

    下面我们罗列执行局部更新必要的顺序步骤:

    1. 客户端给Node 1发送更新请求。
    2. 它转发请求到主分片所在节点Node 3。
    3. Node 3从主分片检索出文档,修改_source字段的JSON,然后在主分片上重建索引。如果有其他进程修改了文档,它以retry_on_conflict设置的次数重复步骤3,都未成功则放弃。
    4. 如果Node 3成功更新文档,它同时转发文档(不是转发请求)的新版本到Node 1和Node 2上的复制节点以重建索引。当所有复制节点报告成功,Node 3返回成功给请求节点,然后返回给客户端。

    update API还接受《新建、索引和删除》章节提到的routing、replication、consistency和timout参数。

    基于文档的复制

    当主分片转发更改给复制分片时,并不是转发更新请求,而是转发整个文档的新版本。记住这些修改转发到复制节点是异步的,它们并不能保证到达的顺序与发送相同。如果Elasticsearch转发的仅仅是修改请求,修改的顺序可能是错误的,那得到的就是个损坏的文档。

    多文档模式

    mget和bulk API与单独的文档类似。差别是请求节点知道每个文档所在的分片。它把多文档请求拆成每个分片的对文档请求,然后转发每个参与的节点。

    一旦接收到每个节点的应答,然后整理这些响应组合为一个单独的响应,最后返回给客户端。

    下面我们将罗列通过一个mget请求检索多个文档的顺序步骤:

    1. 客户端向Node 1发送mget请求。
    2. Node 1为每个分片构建一个多条数据检索请求,然后转发到这些请求所需的主分片或复制分片上。当所有回复被接收,Node 1构建响应并返回给客户端。

    routing 参数可以被docs中的每个文档设置。

    下面我们将罗列使用一个bulk执行多个create、index、delete和update请求的顺序步骤:

    1. 客户端向Node 1发送bulk请求。
    2. Node 1为每个分片构建批量请求,然后转发到这些请求所需的主分片上。
    3. 主分片一个接一个的按序执行操作。当一个操作执行完,主分片转发新文档(或者删除部分)给对应的复制节点,然后执行下一个操作。一旦所有复制节点报告所有操作已成功完成,节点就报告success给请求节点,后者(请求节点)整理响应并返回给客户端。

    bulk API还可以在最上层使用replication和consistency参数,routing参数则在每个请求的元数据中使用。

    相关文章

      网友评论

          本文标题:22.es各操作实现原理

          本文链接:https://www.haomeiwen.com/subject/loxorktx.html