• 探索Elasticsearch的核心个问题


    Elasticsearch

    • Elasticsearch 索引的精髓:一切设计都是为了提高搜索的性能。

    1、分片(Shards)

    • 分片背景
      • 一个索引可以存储超出单个节点硬件限制的数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。
      • 为此目的,Elasticsearch将索引划分成多份,每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上
    • 解决方式
      • 1、水平分割 / 扩展你的内容容量。
      • 2、在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
    • 注意:Elasticsearch 7.xx版本之后,创建索引库的分片数默认为1片

    2、副本(Replicas)

    • 副本背景
      • 在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。
      • 为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
    • 两个重要原因
      • 1、在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意:到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。
      • 2、扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。

    3、路由计算

    • 问题:当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片1 还是分片 2 中呢 ?
    • 解答:根据公式计算分片位置
      • shard = hash(routing)%number_of_primary_shards
      • routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。
      • routing 通过hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。
      • 这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

    4、主分片数量问题

    • 问题:在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量,为什么?
    • 解答:
      • 1、因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
      • 2、所有的文档 API( get 、 index 、 delete 、 bulk 、 update 以及 mget )都接受一个叫做 routing 的路由参数 ,通过这个参数我们可以自定义文档到分片的映射。
      • 3、一个自定义的路由参数可以用来确保所有相关的文档(例如所有属于同一个用户的文档)都被存储到同一个分片中

    5、Es读/写数据的流程

    5.1、Es写数据的流程

    • 首先明确:
      • 新建索引删除 请求都是写 操作, 必须在主分片上面完成之后才能被复制到相关的副本分片
        -
      • 新建,索引和删除文档所需要的步骤顺序:
      • 1、 客户端向 Node 1 发送新建、索引或者删除请求。
      • 2、 节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到Node 3,因为分片0的主分片目前被分配在Node 3 上。
      • 3、 Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功

    5.2、Es写数据的一致性问题(consistency)

    • 在默认设置下,即使仅试图执行一个_写_操作之前,主分片都会要求 必须要有 规定数量(quorum)(或者换种说法,也即必须要有大多数)的分片副本处于活跃可用状态,才会去执行_写_操作(其中分片副本可以是主分片或者副本分片)。
    • 这是为了避免在发生网络分区故障(network partition)的时候进行_写_操作,进而导致数据不一致
    • 规定数量 计算公式:int( (primary + number_of_replicas) / 2 ) + 1
    • consistency 参数的值可以设为 one (只要主分片状态 ok 就允许执行_写_操作),all(必须要主分片和所有副本分片的状态没问题才允许执行_写_操作), 或quorum 。默认值为 quorum , 即大多数的分片副本状态没问题就允许执行_写_操作。
    • 规定数量 的计算公式中 number_of_replicas 指的是在索引设置中的设定副本分片数,而不是指当前处理活动状态的副本分片数。
    • 如果你的索引设置中指定了当前索引拥有三个副本分片,那规定数量的计算结果计算公式应该为如下:
      int( (primary + 3 replicas) / 2 ) + 1 = 3 (1+3) (4/2) (2+1)=3至少需要3个节点才能正常写操作
      如果此时你只启动两个节点,那么处于活跃状态的分片副本数量就达不到规定数量,也因此您将无法索引和删除任何文档。
  • 相关阅读:
    2022 CLion 中的Cygwin 配置(最全,最良心版)
    java程序通过监听端口获取电力104报文并解析104报文
    Mybatis generator实战:自动生成POJO类完整解决方案
    计算机毕业设计(附源码)python在线学习系统
    vue或webpack加载highcharts与highcharts-3d
    Android学习-下拉刷新、轮播图
    Kubernetes是什么?以及基础功能介绍(基础之精通)1
    地表温度LST计算教程
    动态规划三:区间动态规划(19182+11078+洛谷P4170+力扣877)
    如何处理系统漏洞
  • 原文地址:https://blog.csdn.net/pymxb1991/article/details/126157725