热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch之allocation模块分析(1)

序这一章节主要分析allocation模块的结构和原理,分析allocation模块的工作过程前言在此之前先看看什么是分片,它在磁盘上是以什么形式

这一章节主要分析allocation模块的结构和原理,分析allocation模块的工作过程


前言

在此之前先看看什么是分片,它在磁盘上是以什么形式存储的

首先用postman发起创建索引请求

PUT localhost:9200/test02{"settings":{"number_of_shards":2,"number_of_replicas":1}
}

test02在后台代码中用随机UUID生成对应的index.uuid;

indexSettingsBuilder.put(SETTING_INDEX_UUID, UUIDs.randomBase64UUID());

请求结束后,本地节点data目录下:产生如下数据目录 

他们的相关参数在代码中对应的key如下json所示


{

    "client.type": "node", 

    "cluster.election.strategy": "supports_voting_only", 

    "cluster.name": "es-source-demo", 

    "http.type": "security4", 

    "http.type.default": "netty4", 

    "node.attr.ml.machine_memory": "16934494208", 

    "node.attr.ml.max_open_jobs": "20", 

    "node.attr.transform.node": "true", 

    "node.attr.xpack.installed": "true", 

    "node.name": "es-source-node", 

    "path.home": "E:\\installations\\es_tools\\elasticsearch-7.8.0-windows-x86_64\\elasticsearch-7.8.0", 

    "path.logs": "E:\\installations\\es_tools\\elasticsearch-7.8.0-windows-x86_64\\elasticsearch-7.8.0\\logs", 

    "transport.features.x-pack": "true", 

    "transport.type": "security4", 

    "transport.type.default": "netty4"

}


将数据目录梳理成树形结构如下所示: 


  • node.lock:该文件用于确保一次只能从一个数据目录读取/写入一个Elasticsearch实例。
  • index.uuid:对应的是索引的唯一标识,Elasticsearch内部是根据这个唯一标识来区分不同索引的。
  • shard_id:即为分片编号,从0开始递增
  • state-0.st:保存索引状态文件,如索引创建时间、设置等。也是二进制文件。state后面的编号是版本号,类似集群状态文件。

上面图片中的0/1就是所谓的分片,分片是一个物理概念,对应节点上的一个具体路径;其中分片0/1中也保存当前分片是主分片还是副本分片信息


一、什么是allocation

        分片分配就是把一个分片分配到集群中某个节点的过程。分配决策由主节点完成,分片决策包含两个方面


  • 哪些分片应该分配给哪些节点
  • 哪个分片作为主分片,哪些分片作为副分片

        对于新建索引和已有索引,分片分配过程不同;ES通过allocatorsdeciders两个组件完成分配工作;其中allocator尝试寻找最优节点分配分片,deciders负责判断并决定是否要进行这次分配

对于新建索引(分配)


  • allocators负责找出拥有分片数最少的节点列表,并按照节点拥有的分片数量升序排序,因此在这个列表中,分片较少的节点会被优先选择;
  • 对于新建索引,allocators的目标就是以更均衡的方式把新索引的分片分配到集群的节点中;deciders依次遍历allocators给出的节点,并判断是否把分片分配到该节点。
  • 注意allocator只关心每个节点上的分片数,而不关心每个分片的大小;因此deciders还有一部分职责就是阻止把分片分配到将超出节点磁盘容量阈值的节点上

对于已有索引


  • 对于主分片,allocators只允许把主分片指定在已经拥有该分片完整数据的节点上;这里作者也有疑问,该分片指什么?完整数据作何理解?
  • 对于副本分片,allocators则是先判断其他节点上是否已有该分片的数据的副本(即便数据不是最新的)。如果有这样的节点,则allocators优先把分片分配到其中一个节点。
  • 因为副本分片一旦分配,就需要从主分片中进行数据同步,所以当一个节点只拥有分片中的部分数据时,也就意味着哪些未拥有的数据必须从主分片中复制得到,这样可以提高副本分片的数据恢复速度


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 目录1、将mysql数据导出到SQL文件中(数据库存在的情况)2、将现有的sql文件数据导入到数据库中(前提数据库存在) 3、利用Navicat导出SQL文件和导入SQL文件1)从 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • Spring Boot 中 Java8 LocalDateTime 序列化问题
    LoginController页面如下:publicObjectlogin(@RequestBodyUseruser){returnxxxx ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
  • Android NDK开发的一点尝试
    写在前面笔者是一个“原始”的C++开发者,对Java编程虽说不上抵触但也没有C++那么顺手。而且,作为一个游戏引擎,不管是在什么地方,效率总是第一位的,尤其是在移动平台这样资源吃紧 ... [详细]
author-avatar
零摄氏度玫瑰_460
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有