● 允许水平分割 / 扩展你的内容容量。
● 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
● 在分片/节点失败的情况下,提供了高可用。
● 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
计算出数据保持到哪个分片
一般情况下就是轮询
在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。有一些可选的请求参数允许您影响这个过程,可能以数据安全为代价提升性能。这些选项很少使用,因为 Elasticsearch 已经很快,但是为了完整起见, 请参考下文:
- 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,如果此时你只启动两个节点,那么处于活跃状态的分片副本数量就达不到规定数量,也因此您将无法索引和删除任何文档。 - timeout
如果没有足够的副本分片会发生什么?Elasticsearch 会等待,希望更多的分片出现。默认情况下,它最多等待 1 分钟。 如果你需要,你可以使用timeout参数使它更早终止:100是100 毫秒,30s是30秒。
新索引默认有1个副本分片,这意味着为满足规定数量应该需要两个活动的分片副本。 但是,这些默认的设置会阻止我们在单一节点上做任何事情。为了避免这个问题,要求只有当number_of_replicas 大于1的时候,规定数量才会执行。
● 使用SSD。
● 使用RAID0。代表所有RAD级别中最高性能的存储,把连续的数据分散到磁盘中去存取。可以并行执行。
● 不要使用远程挂载的存储。这个引入的延迟对性能来说完全是背道而驰的。
● 一个分片的底层即为一个Lucene索引,会消耗一定文件句柄、内存以及CPU运转。
● 如果多个分片处于一个节点,会造成资源的争抢。
● 相似度的词项统计信息是基于分片的。如果有许多分片,每一个都只有很少的数据会导致很低的相关度。
● 每个分片占用的硬盘容量不超过ES的最大JVM的堆空间设置(一般设置不超过32G)
● 一般都是设置分片数不超过节点数的3倍。
对于节点瞬时中断的问题,默认情况,集群会等待1分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。这样就可以减少ES在自动再平衡可用分片时所带来的极大开销。
通过修改参数delayed_timeout,可以延长再均衡的时间。
在查询的时候因为不知道要查询的数据具体在哪个分片上,所以整个过程分为2个步骤
● 分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。
● 聚合:协调节点搜集到每个分片上查询结果,在将查询结果进行排序,之后给用户返回结果。
查询的时候,可以直接根据routing信息定位到某个分配查询,不需要查询所有分配,经过协调节点排序。
内存设置ES安装后默认内存是1GB。
确保Xms和Xmx的大小是相同的,其目的是为了能够在Java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。
● 不要超过物理内存的50%。
● 堆内存的大小最好不要超过32G。



