• ElasticSearch--分片的路由原理


    原文网址:ElasticSearch--分片的路由原理_IT利刃出鞘的博客-CSDN博客

    简介

    本文介绍往ElasticSearch的索引中写入一条数据时,是如何路由到分片中的。

    粉丝福利:有很多粉丝私信问我有没有Java的面试及PDF书籍等资料,我整理了一下,包含:真实面试题汇总、简历模板、PDF书籍、PPT模板等。这些是我自己也在用的资料,面试题是面试官问到我的问题的整理,其他资料也是我自用的,真正实用、靠谱。资料可以从这里免费获取:资料地址

    原理概述

    索引一条数据(一个文档)时,这条数据会被存储到一个主分片中。Elasticsearch 如何知道一条应该存放到哪个分片中呢?

    首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的:

    shard = hash(routing) % number_of_primary_shards

    Routing 是一个可变值,默认是文档的_id,也可以设置成一个自定义的值。Routing 通过 Hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数。这个余数在 0 到 number_of_primary_shards-1 之间,它就是我们所寻求的文档所在分片的位置。

    这就是为什么创建好索引后就无法改变分片数量。因为如果数量变化了,所有之前路由的值都会无效,文档也再也找不到了。

    在 ES 集群中,每个节点通过上面的计算公式都知道集群中的文档的存放位置,所以每个节点都有处理读写请求的能力。在一个写请求被发送到某个节点后,该节点即为协调节点,协调节点会根据路由公式计算出需要写到哪个分片上,再将请求转发到该分片的主分片节点上。

    ES 为了提高写入的能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突的问题,ES 通过乐观锁的方式控制,每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。一旦所有的副本分片都报告写成功才会向协调节点报告成功,协调节点向客户端报告成功。

    写数据示例

    如上图所示,每个节点有5个分片,每个分片都在另一个节点上有一个副本。 

    1. 客户端向节点1(协调节点)发送写请求,通过路由计算公式得到值为 1,则当前数据应被写到主分片(1(主)) 上。
    2. 节点1将请求转发到主分片(1(主))所在的节点(节点2),节点2接受请求并写入到磁盘。
    3. 并发将数据复制到副本分片(1(副))上,其中通过乐观并发控制数据的冲突。
    4. 一旦所有的副本分片都报告成功,则节点2将向协调节点(节点1)报告成功
    5. 协调节点(节点1)向客户端报告成功。
  • 相关阅读:
    1分钟 Serverless 极速搭建真网站 领猫超卡之《极速搭建 Zblog 博客系统》场景体验
    K近邻分类算法实战教程
    c++ unordered_map和map的区别
    SQL实用功能手册
    【bug 回顾】上传图片超时
    计算机毕业设计django基于python的在线教育平台(源码+系统+mysql数据库+Lw文档)
    最短路-蓝桥杯
    YOLO v9训练自己数据集
    Vue之路由跳转,query传参,子路由,路由模式--hash&history,VueRouter router route三者区别区别
    Word控件Spire.Doc 【表单域】教程(三):如何在 C# 中创建 IF 字段
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/126426450