ElasticSearch 数据分片

一、ElasticSearch 分片

ElasticSearch集群中有许多个节点(Node),每一个节点实例就是一个实例;数据分布在分片之间。集群的容量和性能主要取决于分片如何在节点上如何分配。将数据分片是为了提高可处理的容量和易于进行水平扩展,为分片做副本是为了提高集群的稳定性和提高并发量。每个分片之间是相互独立的,对于搜索request 每个分片都会执行。

二、分片

分片好比在 Mysql中 的分表,将数据分布在多张表中。

主分片(shard):主分片是数据的容器,文档保存在主分片内,主分片又被分配到集群内的各个节点里。每个shard都是一个lucene的索引文件(index)。

副本分片(replica):副本是对主分片的Copy,同步存储主分片的数据内容。为了达到高可用,当分片所在的物理节点宕机,ES可以使用副本机制进行恢复,从而避免数据丢失.。一个分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519个docs。

※:并不是副分片越多越好,因为每个分片都相当于一个索引文件,会占用一定的文件句柄、内存及cpu,并且分片间的数据同步也会占用一定的网络带宽。副本是乘法,越多消耗越大,但也越保险。分片是除法,分片越多,单分片数据就越少也越分散。

※:在主分片挂掉后,会从副本分片中选举一个升级为主分片,当副本升级为主分片后,由于少了一个副本分片,所以集群状态会从green改变为yellow,但是此时集群仍然可用。在一个集群中有一个分片的主分片和副本分片都挂掉后,集群状态会由yellow改变red,集群状态为red时集群不可正常使用。

※:由于elasticSearch 通过路由定位公式找到每一个数据对应的具体分片的。

shard = hash(routing)%number_of_primary_shards

routing的默认值就是这个document的_id(也可以手动指定),这也说明了主分片数一旦定下来就不能再改变的原因,因为分片数改变后,所有之前的路由值都会变得无效,之前的文档数据也就找不到了。

三、节点

Master节点:职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点,稳定的主节点对集群的健康是非常重要的。

节点对等:每个节点都能接收请求,每个节点接收到请求后都能把该请求路由到有相关数据的其他节点上,接收原始请求的节点负责采集数据并返回给客户端。

协调节点:一个写请求被发送到集群的一个节点后该节点称为协调节点。其职责是广播查询请求到所有相关分片并将它们的响应整合成全局排序后的结果集合后返回给客户端。

※:增加和删除节点,会自动平衡 shard 在剩余节点中的分配。

※:如果集群中只有一个节点,就没有地方分配副本,此时副本的状态就是unassigned(未分配的分片),也就是说主副分片不能存在于同一台机器上。

※:一旦集群中的节点发生变化,它们就会协商谁将成为主节点,ES中所有节点都有机会成为主节点,可以通过设置主节点的最小数量防止脑裂(split brain)问题,一般的规则是集群节点数除以2(向下取整)再加一。

四、查询和写入过程

查询:当协调节点收到查询 request 时,先在本地创建一个大小为 from + size 的空优先队列,然后将请求广播到索引的每个分片中,分片在本地执行查询并添加结果到本地有序优先队列中后返回给协调节点,协调节点将分片级的结果合并到自己的有序优先队列里并返回。

写入:通过 routing 以及协调节点确定写到具体的某个主分片上后,并发的向所有副本同步数据(乐观锁),所有副本同步完成后即为成功(类似 kafka 的ACK应答机制)

※:ElasticSearch 通过增加 translog日志保证数据存储可靠性。

当新增了一个文档数据后首先被写入内存中,如果此时宕机数据将会丢失,为此新增 translog 日志记录数据,translog 是追加写入,因此性能比较好。
通过不断的执行 refresh 操作(操作间隔大约1s),将数据以段 (segment) 的形式提交到文件缓存系统中,此时虽然还真正的落盘但是可以正常打开并读取文件。由于 refresh 操作会产生大量很小的段(segment),ES会对符合条件的segment进行合并操作,减少lucene中的segment个数,提高查询速度,降低负载。
随着 每30分钟或当translog达到一定大小,ES会触发一次flush操作,将所有内存中的 segment fsync到磁盘,数据就完成了持久化。

标题

Tip: 为什么不直接刷到磁盘,而是写入文件缓存系统?

每30分钟或当translog达到一定大小(由index.translog.flush_threshold_size控制,默认512mb),ES会触发一次flush操作

fsync 操作代价很大,如果每次索引一个文档都去执行一次的话会造成很大的性能问题,但是这里新segment会被先写入到文件系统缓存,这一步代价会比较低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D_(游戏)2D坦克大战 像素版

2D坦克大战 像素版 游戏规则:  玩家通过上、下、左、右移动坦克,空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束,心脏上方三个单位障碍物设为刚体)    当玩家被击杀次数>3  或  心脏被子弹击穿  重新加载游戏…

认识Skeleton Screen【屏幕加载骨架】

一直以来,无论是web还是iOS、android的应用中,为了提升应用的加载等待这段时间的用户感知体验,各种奇门遁甲之术层出不穷。其中,菊花图以及由它衍生各种加载动画是一个非常大的流派,如下图所示:由它衍生而出…

使用Apache Zookeeper进行协调和服务发现

面向服务的设计已被证明是针对各种不同的分布式系统的成功解决方案。 如果使用得当,它会带来很多好处。 但是随着服务数量的增加,了解部署什么以及部署在何处变得更加困难。 而且,由于我们正在构建可靠且高度可用的系统,因此还需要…

微信小程序无埋点数据采集方案

作者:lxj,点餐终端团队成员前言 相信业务团队对这样的场景不会太陌生:打点需求: 每新上一个功能,数据产品便会同步加上打点需求,当数据打点上线后一段时间,数据产品/业务产品便会针对数据的转化…

php异步请求$.post,如何用PHP实现异步请求、忽略返回值

本篇文章的主要内容是用PHP实现异步请求、忽略返回值,具有一定的参考价值,有需要的朋友可以看看,希望能对你有帮助。项目需要,场景如下:某个条件下需要调用接口发送多个请求执行脚本,但是由于每个请求下的脚…

Linux NTP

ntpd服务的设置: ntpd服务的相关设置文件如下: /etc/ntp.conf:这个是NTP daemon的主要设文件,也是 NTP 唯一的设定文件。/usr /share/zoneinfo/:在这个目录下的文件其实是规定了各主要时区的时间设定文件,例如北京地区的时区设定文…

《React 学习之道》The Road to learn React (简体中文版)

通往 React 实战大师之旅:掌握 React 最简单,且最实用的教程。 前言 《React 学习之道》这本书使用路线图中的精华部分用于传授 React,并将其融入一个独具吸引力的真实世界 App的具体代码实现。 如何掌握 React 存在特别多的路线图。本书提…

vue.js(三)

这里该记到vue的组件了&#xff0c;组件基础篇 1.vue组件的基本书写方式 Vue.component(button-counter, {data: function () {return {count: 0}},template: <button v-on:click"count">You clicked me {{ count }} times.</button> }) 上面定义了一个名…

Nuxt中如何使用Vuex-Store异步获取数据

Nuxt是一个基于Vue.js的通用型框架&#xff0c;它集成了使用Vue开发的绝大数组件/框架。 长话短说如何在Vuex-store中获取异步数据呢&#xff1f; 在Nuxt中由于集合了Vuex还有其他的一些配置&#xff0c;大大的方便了我们使用Vuex&#xff1b;在Nuxt官方文档中写到&#xff1a;…

Struts2面试问答

Struts2是用Java开发Web应用程序的著名框架之一。 最近&#xff0c;我写了很多Struts2教程 &#xff0c;在这篇文章中&#xff0c;我列出了一些重要的Struts2面试问题以及答案&#xff0c;以帮助您进行面试。 什么是Struts2&#xff1f; Struts1和Struts2之间有什么区别&…

基于canvas的骨骼动画

最近学习到了一种关于canvas的骨骼动画&#xff0c;听这个名字就知道他和canvas之前的动画不同&#xff0c;不知道你有没有兴趣了解一下呢&#xff1f;关于骨骼动画最初是无意间在腾讯团队上看到的&#xff0c;但是由于他官网的教程是在是少之又少&#xff0c;也就仅有一个小de…

Python APSchedule安装使用与源码分析

我们的项目中用apschedule作为核心定时调度模块。所以对apschedule进行了一些调查和源码级的分析。 1、为什么选择apschedule&#xff1f; 听信了一句话&#xff0c;apschedule之于python就像是quartz之于java。实际用起来还是不错的。 2、安装 # pip安装方式 $ pip install ap…

NetBeans 7.4的本机Java打包

成为“ NetBeans 74 NewAndNoteworthy ”页面的NetBeans 7.4的新功能之一是“本机打包 ”&#xff0c;在该页面上被描述为“ JavaSE项目现在支持使用JavaFX提供的本机打包技术来创建本机包。 ” 我将使用一个非常简单的示例来演示NetBeans 7.4中的本机打包功能。 下一个代码清…

基于Vue开发一个日历组件

最近在做一个类似课程表的需求&#xff0c;需要自制一个日历来支持功能及展现&#xff0c;就顺便研究一下应该怎么开发日历组件。 更新 2.23修复了2026年2月份会渲染多一行的bug&#xff0c;谢谢深蓝一人童鞋提出的bug&#xff0c;解决方案是给二月份的日历做特殊处理&#xf…

php 打开word乱码怎么办,如何解决php word 乱码问题

php word乱码的解决办法&#xff1a;首先打开“/Writer/Word2007/Base.php”文件&#xff1b;然后添加“$objWriter->writeAttribute(‘w:eastAsia’, $font)”内容&#xff1b;最后保存修改即可。PHPword解决中文乱码一、增加东亚字体支持打开并编辑路径/Writer/Word2007/B…

Java开发人员访谈的MindMap

多年来&#xff0c;我曾在许多Java开发人员访谈中担任小组成员。 之前&#xff0c;我曾写过一篇标题为“成功进行软件工程师技术面试的7大技巧”的文章&#xff0c;其中涵盖了很少的一般准则。 在本文中&#xff0c;我将分享一个思维导图&#xff0c;其中包含Java开发人员访谈中…

送给大家一个好看的简历神器

很多人看到里边有好看的东西就习惯性的点进来看看&#xff0c;还一边点一边想 —— 好看的简历我见多了&#xff0c;你这个又能好看到哪里去。我想差不多可以&#xff1a; 哪里吧因为最近有在准备简历&#xff0c;就习惯性的找一找有没有现成的简历模板。结果全是付费的&#x…

PHP简单实现单点登录功能示例

1.准备两个虚拟域名 127.0.0.1 www.openpoor.com127.0.0.1 www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 123456789101112131415161718<?phpsession_start();?><!DOCTYPE html><html><head><meta charset"UTF-8"/&…

JUNG 计算图属性,中心度,偏心率,直径,半径

本文介绍利用Java的第三方API JUNG 计算图中&#xff1a; closeness centrality&#xff1b;// 图中某节点的 接近中心性/亲密中心性 betweenness centrality&#xff1b;// 图中某节点的 中介中心性/介数中心性 distance; // 图中两节点的最短距离 eccentricity; // 图中某节…

Java VM –提防YoungGen空间

您可能从我们以前的面向性能的文章中看到&#xff0c;健康的JVM是实现最佳应用程序性能和稳定性的最重要目标之一。 这样的健康评估通常仅关注主要收集的频率&#xff08;避免&#xff09;或检测内存泄漏的存在。 年轻一代空间或短寿命物体的大小和足迹如何&#xff1f; 本文…