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的应用中,为了提升应用的加载等待这段时间的用户感知体验,各种奇门遁甲之术层出不穷。其中,菊花图以及由它衍生各种加载动画是一个非常大的流派,如下图所示:由它衍生而出…

一日三项令人兴奋的Lucene功能

昨天是富有成效的一天:突然,Lucene有了三个令人兴奋的新功能。 表达式模块 昨天提交的第一个功能是新的expressions模块 。 这使您可以使用任意String表达式定义用于排序的动态字段。 内置了对JavaScript解析的支持,但是如果您想创建自己的语…

php date当天,php5中date()获得的时间不是当前时间的解决方法

自php5.10起加入了时区的设置,在php中显示的时间都是格林威治标准时间,因此便与中国的用户会差八个小时。修改php.ini中的 date.timezone 参数:复制代码 代码如下:[Date]; Defines the default timezone used by the date functions;date.tim…

listening for variable changes in javascript

https://stackoverflow.com/questions/1759987/listening-for-variable-changes-in-javascript转载于:https://www.cnblogs.com/wangjixianyun/p/9115336.html

JPA EntityListeners中的Spring注入的Bean

在使用JPA侦听器进行数据库加密中,我讨论了使用JPA EntityListener进行透明加密。 从某种意义上说,这种方法是透明的,因为JPA实体(几乎)完全不知道正在加密,而JPA EntityListener本身也不知道细节。 有一个…

php sql 去除重复数据,MSSQL_快速删除重复记录,SQL Server如何实现?,如果一张表的数据达到上百万 - phpStudy...

如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间……开发人员的噩梦——删除重复记录想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而…

Python运行的方式

Python的运行方式多种多样,下面列举几种: 交互式 在命令行中输入python,然后在>>>提示符后面输入Python语句,这里需要注意: 1 语句前面不能有空格,否则会报错 2 对于符合语句,前面会有...提示符,结…

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

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

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

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

php 状态码302,HTTP状态码302、303和307的故事

今日读书,无法理解HTTP302、303、307状态码的来龙去脉,决定对其做深究并总结于本文。《HTTP权威指南》第3章在讲解30X状态码时,完全没有讲清楚为什么要有302、303、307,以及他们的关系,一句“问题出在HTTP/1/1”让我一…

Codeforces 1070A Find a Number(BFS) 2018-2019 ICPC, NEERC, Southern Subregional Contest Problem A

Description You are given two positive integers ddd and sss. Find minimal positive integer nnn which is divisible by ddd and has sum of digits equal to sss.Input The first line contains two positive integers ddd and sss(1≤d≤500,1≤s≤5000)(1≤d≤500,1≤s…

luogu3807 【模板】 卢卡斯定理

题目大意 对于一个很大的$n,m,p$如何求$C_{nm}^m\mod p$? Lucas定理 若$n_i,m_i$分别是$n,m$在$p$进制下第$i$位的数字,则有 $$C_n^m\mod p\prod_{i0}^{\log_p m}C_{n_i}^{m_i}\mod p$$ 求法 按照定理式一个一个求组合数即可。 组合数并不用批量求。故预…

防止System.exit调用

在开发运行其他开发人员编写的代码的容器时,请谨慎防范System.exit调用。 如果开发人员无意间调用了System.exit并将其代码部署为由您的容器运行,则它将完全降低容器进程。 可以使用SecurityManager中的checkExit函数调用来控制。 根据SecurityManager …

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

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

JavaScript函数式编程学习

本文是我在函数式编程学习过程中,总结的笔记,也分享给想学函数式编程的同学。 函数式编程可能对于初学者来说,概念难以理解,入门比较难。所以本文从两部分去学习。 在你身边你左右 --函数式编程别烦恼 第一部分,你身…

读书印记 - 《沟通的艺术:一本手把手教你社交沟通的书》

一个教训是没上过榜也没什么好推荐的书有挺大概率不是本好书。我现在不太能耐心的去读这种指导手册,一是谈话的技巧需要在实战中才能有效提升,二是这方面对我来说不是关注的重点。所以几乎是刷刷的翻完了整本书。当然也不能说这本书就是烂书,…

Linux NTP

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

Java Web项目的保存和刷新

如何配置计算机以保存并刷新Java Web项目? 当您向开发人员提出此问题时,答案以“哦,好吧……”开头,并以某种可行的方式继续描述。 每个人都有自己的方式。 首先–为什么需要这个? 因为执行复制和重新启动服务器是生产…

mysql alter怎么用,mysql alter话语用法

mysql alter语句用法//主键ALTER TABLE tablename add new_field_id int(5) UNSIGNED DEFAULT 0 NOT NULL anto_increment,ADD PRIMARY KEY (new_field_id);//增加一个新列mysql>ALTER TABLE tablename ADD fieldname fieldtype如:ALTER TABLE t2 ADD d TIMESTAM…