总结ES~~~

发布于:2024-04-19 ⋅ 阅读:(25) ⋅ 点赞:(0)

集群、节点、分片
  集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。es集群节点可以划分为三种:主节点、数据节点和客户端节点(协调节点)。主节点维护元数据,管理集群节点状态,不负责数据写入和查询;数据节点负责数据的写入与查询,压力大。客户端节点负责任务分发和结果汇聚,分担数据节点压力。
  索引实际上是指向一个或者多个物理分片的逻辑命名空间 。一个分片可以是主分片或者副本分片。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。主分片的数目在索引创建时就已经确定了下来,并且不能改变。一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。读操作(搜索和返回数据)可以同时被主分片或副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群。

数据文档
  每个文档都有一个版本号,当每次对文档进行修改时(包括删除), _version 的值会递增。文档是不可改变的,不能修改它们。对于update API,似乎对文档直接进行了修改,但实际上 Elasticsearch 会执行以下过程:1.从旧文档构建 JSON;2.更改该JSON;3.删除旧文档;4.索引一个新文档。当文档更新发生version冲突的时候,我们可以retry_on_conflict来定义更新重试的次数。

shard = hash(routing) % number_of_primary_shards,每个文档基于这个公式计算出要存储到哪个分片中。routing是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。一个自定义的路由参数可以用来确保所有相关的文档——例如所有属于同一个用户的文档——都被存储到同一个分片中。

分片数量规划
  分片数量规划可采取以下步骤:1.用跟生产环境一致的硬件创建一个拥有单个节点的集群。2.创建一个与生产环境相同配置的索引,但让它只有一个主分片无副本分片。3.索引实际的文档(或者尽可能接近实际)。4.运行实际的查询和聚合(或者尽可能接近实际)。基本来说,你需要复制真实环境的使用方式并将它们全部压缩到单个分片上直到它挂掉。挂掉的定义也取决于具体场景:有些场景需要所有响应在 50 毫秒内返回;另一些则允许等上 5 秒钟。一旦你定义好了单个分片的容量,很容易就可以推算出整个索引的主分片数量,用你需要索引的数据总数加上一部分预期的增长,除以单个分片的容量,结果就是你需要的主分片个数。

请求流程
写单个文档的流程
客户端向 Node 1 发送新建、索引或者删除请求。
节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。