elasticsearch集群数据读写与分片设置

概念

  • 索引

ES将它的数据存储在一个或者多个索引中。用sql领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档,并通过ES内部使用的Lucene将数据写入索引或从索引中检索数据。索引是具有某些类似特征的文档集合,索引由名称标识(必须全部小写)。

  • 分片

ES会把查询文档集合分解为多个小的索引,每一个小的索引就叫做分片。每个分片都是一个独立的’索引’。 数据量非常大TB级别,数据分配到不同的分片,每个分片只包含一部分数据,只需要检索包含该数据的分片即可,提高了数据吞吐量。分片数在创建索引时指定,不可修改

  • 副本

是对分片的复制。目的是为了当分片/节点发生故障时,副本分片成为住分派你,提供高可用性,它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。创建索引时可以指定副本数,也可以不设置,副本可以修改的

数据写入

elasticsearch集群数据读写与分片设置_第1张图片

  • 1:客户端通过连接配置,动态连接到集群,其中一个节点提供服务,成为协调节点
  • 2:根据写入数据的_id的hash值与分片数量计算存储到那个分片上,假如在节点3上,协调节点将数据先写入节点3的主分片P3上

    shard = hash(_routing) % (num_of_primary_shards)

  • 3: 主分片P3写入成功后,会将数据同步到节点3的副本分片R3上
  • 4:副本分片R3完成数据同步后,会把写入成功后响应返回给协调节点
  • 5:协调节点将响应返回给客户端,写入完成

读取数据

  • 客户端读请求会先选择一个协调节点
  • 由协调节点根据数据的请求hash得知是放在哪个分片上的
  • 由于数据在主从分片上都有,并且数据一模一样,读取操作在主从上是采用轮询的方式
  • 因此副本分片多了后会提升分片的负载能力
  • 数据查询完毕后返回给协调节点,协调节点返回客户端

分片如何设置

  • 分配分片时主要要考虑的问题
  1. 数据集的增长趋势
  2. 分配的每个分片都是由额外的成本的,过大也不太好。
  3. 每个分片其实都是要存数据的,并且都是一个lucene的索引,会消耗文件句柄已经CPU和内存资源
  4. 当你进行数据访问时,我们的index就会去到所有的分片上去取数据
  5. 如果要取100条,如果你有100个分片,就会从100个分片上各取出100个数据然后进行排序给出最终的排序结果,取了100*100条数据
  • 主分片数据到底多少为宜呢?
    根据你的节点数来进行分片,3个Node,N*(1.5-3)

总结

查询与搜索都会涉及到分片,主分片一旦设置不允许修改,分片过多或者过少都会影响到系统吞吐量, ES会查询所有分片然后进行数据合并排序。因此分片设置一定要尽量合理

你可能感兴趣的:(elasticserach,elasticsearch)