分片的原因

  • 允许水平分割 / 扩展你的内容容量。
  • 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。

    副本的作用

  • 在分片/节点失败的情况下,提供了高可用。

  • 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。

    分配

    image.png

    路由计算

    计算出数据保持到哪个分片
    image.png

    分片控制

    一般情况下就是轮询
    image.png

    数据流写

    image.png
    在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。有一些可选的请求参数允许您影响这个过程,可能以数据安全为代价提升性能。这些选项很少使用,因为 Elasticsearch 已经很快,但是为了完整起见, 请参考下文:
  1. consistency

即一致性。在默认设置下,即使仅仅是在试图执行一个写操作之前,主分片都会要求必须要有规定数量quorum(或者换种说法,也即必须要有大多数)的分片副本处于活跃可用状态,才会去执行写操作(其中分片副本 可以是主分片或者副本分片)。这是为了避免在发生网络分区故障(network partition)的时候进行写操作,进而导致数据不一致。 规定数量即: int((primary + number_of_replicas) / 2 ) + 1
consistency 参数的值可以设为:
one :只要主分片状态 ok 就允许执行写操作。
all:必须要主分片和所有副本分片的状态没问题才允许执行写操作。
quorum:默认值为quorum , 即大多数的分片副本状态没问题就允许执行写操作。
注意,规定数量的计算公式中number_of_replicas指的是在索引设置中的设定副本分片数,而不是指当前处理活动状态的副本分片数。如果你的索引设置中指定了当前索引拥有3个副本分片,那规定数量的计算结果即:int((1 primary + 3 replicas) / 2) + 1 = 3,如果此时你只启动两个节点,那么处于活跃状态的分片副本数量就达不到规定数量,也因此您将无法索引和删除任何文档。

  1. timeout

如果没有足够的副本分片会发生什么?Elasticsearch 会等待,希望更多的分片出现。默认情况下,它最多等待 1 分钟。 如果你需要,你可以使用timeout参数使它更早终止:100是100 毫秒,30s是30秒。
新索引默认有1个副本分片,这意味着为满足规定数量应该需要两个活动的分片副本。 但是,这些默认的设置会阻止我们在单一节点上做任何事情。为了避免这个问题,要求只有当number_of_replicas 大于1的时候,规定数量才会执行。

数据读取流程

image.png

文档刷写

image.png

ES硬盘优化

  • 使用SSD。
  • 使用RAID0。代表所有RAD级别中最高性能的存储,把连续的数据分散到磁盘中去存取。可以并行执行。
  • 不要使用远程挂载的存储。这个引入的延迟对性能来说完全是背道而驰的。

    分片策略

    合理的设置分片数

  • 一个分片的底层即为一个Lucene索引,会消耗一定文件句柄、内存以及CPU运转。

  • 如果多个分片处于一个节点,会造成资源的争抢。
  • 相似度的词项统计信息是基于分片的。如果有许多分片,每一个都只有很少的数据会导致很低的相关度。
  • 每个分片占用的硬盘容量不超过ES的最大JVM的堆空间设置(一般设置不超过32G)
  • 一般都是设置分片数不超过节点数的3倍。

    推迟分片分配

    对于节点瞬时中断的问题,默认情况,集群会等待1分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。这样就可以减少ES在自动再平衡可用分片时所带来的极大开销。
    通过修改参数delayed_timeout,可以延长再均衡的时间。

    路由选择

    不带routing查询

    在查询的时候因为不知道要查询的数据具体在哪个分片上,所以整个过程分为2个步骤

  • 分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。

  • 聚合:协调节点搜集到每个分片上查询结果,在将查询结果进行排序,之后给用户返回结果。

    带routing查询

    查询的时候,可以直接根据routing信息定位到某个分配查询,不需要查询所有分配,经过协调节点排序。

    内存设置

    ES安装后默认内存是1GB。