Document api

文档的读写

简介

索引为了保证分布式,引入了分片的概念,而分片又分为主分片和副本分片。主分片是所有索引操作的入口,负责验证请求保证请求的正确性,一旦主分片接受了请求操作同时主分片也要负责把这些操作复制给副本分片。

写文档模型

主分片接收到请求后可以对请求验证并且转发请求到副本分片,由于有的副本可能掉线等情况,因此不需要转发给每个副本。master节点会维护一个副本集,叫做in-sync copies,这个集合里面的副本都是健康的可执行的。因此转发的请求只需要传给副本集里面相应的副本即可。
主分片写文档的基本流程是:

  • 验证请求的合法性,拒绝一些非法结构的请求(如:数据字段类型跟mapping不一致)
  • 在主分片执行该请求,同时也会验证字段内容的合法性(如:字段值太长不符合lucene索引的要求)。
  • 转发请求到副本集里面的副本分片。如果主分片有多个分片,则并进行并发操作。
  • 一旦在所有的分片上执行成功,主分片把请求执行成功的消息返回给客户端。

失败处理

索引过程中可能会出现许多问题 - 磁盘可能会损坏,节点可能会断开连接,尽管在主分片上执行成功但是因为某些配置的问题依然可能造成在副本分片上执行失败。这些问题不常见,但主分片必须去处理并响应这些问题。

  • 主分片执行请求失败。在这种情况下,主分片所属的节点会把信息反馈给master节点,然后等待master节点重新分片一个主分片,请求会等待master节点分配主分片(默认等待1分钟),一旦分配好新的主分片请求将会转发给它。 当然,master节点也可以主动的监控节点及分片的健康状态并且决定是否降级主分片(如:当节点因为网络问题与集群断开时)
  • 副本执行请求失败。一般情况下因为网络原因可能会造成副本没有收到请求或者主分片没有收到副本执行完成的响应信息,无论哪种情况全部归为失败。一旦遇到这种情况主分片会向master请求把该副本从副本集(in-sync copies)中删除,一旦收到master的删除响应,整个执行才认为是成功。同时,master节点会从其他节点新建一个副本从而恢复整个集群的状态。
  • 主分片通过转发请求确定自己的地位是否改变。一个主分片因为一些原因(网络问题,long GC)被master节点降级了,当恢复的时候这个主分片可能还认为自己是主分片从而能够接受到请求,这个时候当主分片转发的请求给副本的时候就会被副本拒绝,拒绝原因就是该分片不再是主分片了,这个时候该分片会给master节点发请求确认此问题并且学习目前的集群状态从而把请求转发给真正的主分片。

    读文档模型

    Elasticsearch中的读取可以通过ID进行非常轻量级的查找,或者通过具有复杂聚合的重度搜索请求(很消耗CPU)。primary-backup model的优点是它保持所有分片副本数据相同。因此,这种方式足以提供读取请求。
    当节点接收到读请求时,该节点负责将其转发到相关分片的节点,收集响应并且把响应返回给客户端。我们称该节点为该请求的协调节点。基本流程如下:

  • 把读数据请求转发给相应的分片。请注意,如果是多个分片,每个分片搜索到不同的数据集。

  • 从分批中选择一个具体分片执行搜索请求,这个分片可以是主分片也可以是副本分片,选择的策略是对分片(分片也叫做 replication copy即主分片和副本分片的合集)进行轮询。
  • 把请求发送给选择好的具体分片。
  • 收集每个分片的结果集然后响应给客户端。如果如果是通过id搜索数据,则只有一个相关分片,则此步骤会跳过。

失败处理

当某个分片不能响应读请求时,协调节点将从replication group中重新选择分片并且把请求转发给该分片。如果没有好的分片接受请求,elasticsearch是可以接受部分请求结果的,错误分片信息会放到响应头信息的_shards字段中。

简单的提示

  • 为了高效的读,一般一个replication group不会有两个分片收到同一个搜素请求,除非是一个请求失败了。
  • 由于主要首先在本地进行索引,然后复制请求,所以并发读取可以在存数据确认之前已经看到新索引的数据。
  • 只保留两个数据副本达到容错的目的。 这与大多数分布式系统相反,它们的容错的最小份数为3。

失败的提示

  • 因为索引数据时,要等所有的副本都返回索引成功的请求整个索引请求才算成功,因此一个分片执行请求过慢会造成整个请求变慢。同样对于所搜请求,如果路由到的分片执行请求太慢也会造成整个请求响应慢。
  • 脏数据,如果一个主分片因为网络原因被降级,那么他可能并不知道这种情况,因此主分片收到请求的时候回在本分片索引数据,然后转发请求给其他副本(这个时候才会意识到自己被降级了)。如果此时刚好有数据请求路由到该被降级了的主分片,就会被索引到数据。elasticsearch通过所有的分片都需要感知到master节点才能执行索引请求来降低这种情况发生的概率(默认情况下,每秒中ping一次)。

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/docs-replication.html

猜你喜欢

转载自blog.csdn.net/fsz9065/article/details/78945094