1.分片和副本

1.1什么是分片

简单来讲就是咱们在ES中所有数据的文件块,也是数据的最小单元块,整个ES集群的核心就是对所有分片的分布、索引、负载、路由等达到惊人的速度。

分片是把索引数据切分成多个小的索引块,这些小的索引块能够分发到同一个集群中的不同节点。在检索时,检索结果是该索引每个分片上检索结果的合并。类似于数据库的分库分表

举例:

假设 IndexA 有2个分片,我们向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。

1.2分片的基本作用

假如索引Index可能存储了超过单个节点的硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。为了解决这样的问题,Elasticsearch提供了将索引细分为多个称为碎片(Shards)的功能,创建索引的时候就可以自定义碎片shards的数量,这些碎片shards本身都是功能齐全、可以托管到集群中任何节点的独立索引(index)。碎片的分布方式和如何将其文档聚合回搜索请求都是完全由Elasticsearch管理的并且这些都是对用户透明的。

分片(将索引分为一些碎片)最主要的原因有两个:

允许平行拆分/模块化内容容量;

允许跨分片(这些碎片可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量;

1.3分片的分配

已经切分为多份的索引块,索引块分发到同一个集群中的不同节点。这个把shard分发到node的过程就是分片的分配。分配的原则是主要还是基于提高读写性能,实现负载均衡,备份恢复快。

什么时候开始分片分配机制呢:

1.index的增删

2.node的增删

3.reroute操作

4.replica的设置更改

5.初始化恢复过程

1.4 分片的规则

es的分片规则主要分为以下几类:

一、负载均衡规则,从负载均衡角度出发的一些规则,常见的有

SameShardAllocationDecider类,该决策者不允许相同分片(primary\replication)出现在相同的节点上,重写了canAllocate方法。该类也考虑到了同一物理机多个es实例的情况(es可能多个虚拟机上,多个虚拟机在一台物理机上),通过cluster.routing.allocation.same_shard.host=true(默认false)来处理该情况。判断的依据是hostname和hostaddress。

ShardsLimitAllocationDecider类,限制同一个节点上shard的数目。可以限制同一节点上的shard总数、同一节点上同一index的shard数目,分别通过index.routing.allocation.total_shards_per_node、cluster.routing.allocation.total_shards_per_node实现。index级别可以覆盖cluster级别。在elasticsearh.yml文件中配置或者用update API实时更改。默认的值是-1,代表没有任何限制。需要注意,如降低该值会导致集群强制进行分片的重新分配,在集群平衡这个过程中引发额外的负载。

AwarenessAllocationDecider类,感知分配功能。更够感知服务器、服务机架等,尽量分散存储shard。有两类参数可以使用。第一类参数举例:我们通过参数设置分组cluster.routing.allocation.awareness.attributes: rack_id,一node启动设置了node.attr.rack_id:1,另外一node(两个node不在一个机架上)启动设置了node.attr.rack_id:2,所以shard会尽量分散到不同的rack_id上。第二类参数举例:cluster.routing.allocation.awareness.attributes: zone,cluster.routing.allocation.awareness.force.zone.values: zone1,zone2 如果zone1的机器上不能容纳所有的shard,并且zone2没有启动,剩余没有分配的shard则不会进行分配(zone1过载),直到等到zone2启动才进行分配。

二、并发数量规则

ConcurrentRebalanceAllocationDecider类,rebalance并发数控制类。配置cluster.routing.allocation.cluster_concurrent_rebalance来控制,该配置运行时可变,默认值为2,如果设置为-1,则表示无限制并发。

ThrottlingAllocationDecider类,在recovery过程中,恢复分片并发数。可动态设置控制参数配置:cluster.routing.allocation.node_initial_primaries_recoveries:这个属性的默认值为4,它用来描述单个节点上允许recovery操作的初始主分片数量;cluster.routing.allocation.node_concurrent_recoveries:它的默认值是2,它用来限制单个节点上进行recovery操作的并发数。

三、条件限制规则

FilterAllocationDecider类,通过include、exclude参数(可动态设置)控制shard的节点分配。参数:index.routing.allocation.require.、index.routing.allocation.include.、index.routing.allocation.exclude.、cluster.routing.allocation.require.、cluster.routing.allocation.include.、cluster.routing.allocation.exclude.。其中require表示必须,include表示允许,exclude表示禁止。注意Cluster的设置会重载掉index的配置,意味着如果根据index的配置该shard可以分配到此node,但是cluster的配置是不允许,那么此shard将不允许。filter被应用的顺序依次为required、include、exclude。

ReplicaAfterPrimaryActiveAllocationDecider类,该类保证只会在主分片分配完毕后才开始分配分片副本。

RebalanceOnlyWhenActiveAllocationDecider类,保证该索引的所有分片都在活跃状态才能进行rebalance过程。

ClusterRebalanceAllocationDecider类,根据shard的active状态来判断是否可以执行rebalance。使用参数cluster.routing.allocation.allow_rebalance(不能动态更改)来进行判断,参数值意义:①indices_all_active:它是默认值,表示只有集群中所有的节点分配完毕,才能认定集群再平衡完成。②indices_primaries_active:这个值表示只要所有主分片分配完毕了,就可以认定集群再平衡完成。③always:它表示即使当主分片和分片副本都没有分配,集群再平衡操作也是允许的。

DiskThresholdDecider类,通过磁盘空间阈值来控制是否分配。默认该功能是关闭的,通过cluster.routing.allocation.disk.threshold_enabled属性设置为true可以打开。cluster.routing.allocation.disk.watermark.low属性允许用户指定一个百分比阈值或者绝对数值来控制何时能够进行分片分配。比如默认值是0.7,表示当可用磁盘空间低于70%时,新的分片才可以分配到该节点上。cluster.routing.allocation.disk.watermark.high属性允许用户指定一个百分比阈值或者绝对数值来控制何时需要将分片分配到其它的节点。比如默认值是0.85,表示当可用磁盘空间高于85%时,ElasticSearch会重新把该节点的分片分配到其它节点。参数可以yml文件或者api动态设置。

上述三类分配规则的java类全部继承了AllocationDeciders抽象类,该类是负责shard的分配做一个决策结果(Decision类,决策结果类。有四中类型,ALWAYS、YES、NO、THROTTLE)。定义了canRebalance方法(给定的shard routing是否可以rebalance),canAllocate方法(给定的shard routing是否可以分配到指定的node),canRemain方法,给定的shard routing是否可以继续保留在指定的node;该类所有方法默认都返回ALWAYS。

1.5分片的数量和设置

分片个数是越多越好,还是越少越好了?根据整个索引的数据量来判断。

实列场景:

如果 IndexA 所有数据文件大小是300G,改怎么定制方案了?(可以通过Head插件来查看)

建议:(仅参考)

1、每一个分片数据文件小于30GB

2、每一个索引中的一个分片对应一个节点

3、节点数大于等于分片数

根据建议,至少需要 10 个分片。

结果: 建10个节点 (Node),Mapping 指定分片数为 10,满足每一个节点一个分片,每一个分片数据带下在30G左右。

SN(分片数) = IS(索引大小) / 30

NN(节点数) = SN(分片数) + MNN(主节点数[无数据]) + NNN(负载节点数)

1.6副本知识

副本分片的主要目的就是为了故障转移,正如在 集群内的原理 中讨论的:如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。

在索引写入时,副本分片做着与主分片相同的工作。新文档首先被索引进主分片然后再同步到其它所有的副本分片。增加副本数并不会增加索引容量。

无论如何,副本分片可以服务于读请求,如果你的索引也如常见的那样是偏向查询使用的,那你可以通过增加副本的数目来提升查询性能,但也要为此增加额外的硬件资源。

拥有两个主分片,加上每个主分片的一个副本,总共给予我们四个分片:每个节点一个,如图所示 图 一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展”

图 一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展

Elatsicsearch分片和副本相关知识的更多相关文章

  1. Elasticsearch分片、副本与路由(shard replica routing)

    本文讲述,如何理解Elasticsearch的分片.副本和路由策略. 1.预备知识 1)分片(shard) Elasticsearch集群允许系统存储的数据量超过单机容量,实现这一目标引入分片策略sh ...

  2. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  3. Python中元组相关知识

    下面给大家介绍以下元组的相关知识: ·元组可以看成是一个不可更改的list 1.元组的创建 # 创建空元祖 t = () print(type(t)) # 创建只有一个值的元组 # 观察可知元组中如果 ...

  4. Elasticsearch核心技术(2)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)

    Elasticsearch核心技术(2)--- 基本概念 这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Docume ...

  5. elasticsearch 集群、节点、索引、分片、副本概念

    原文链接: https://www.jianshu.com/p/297e13045605 集群(cluster): 由一个或多个节点组成, 并通过集群名称与其他集群进行区分 节点(node): 单个 ...

  6. Vim编译器的相关知识

    Vim编译器相关知识 1.关于Vim编译器 在热门Linux操作系统中都会默认安装一款超好用的文本编辑器——名字叫“vim”,vim是vi编辑器的升级版. vim 具有程序编辑的能力,可以主动的以字体 ...

  7. ES相关知识

    ElkStack介绍 对于日志来说,最常见的需求就是收集.存储.查询.展示,开源社区正好有相对应的开源项目:logstash(收集).elasticsearch(存储+搜索).kibana(展示),我 ...

  8. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  9. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

随机推荐

  1. .mata. _root_ (转)

    HRegionServer 里面存放了很多的HRegion,而且每一个HRegion都有一个唯一标识(表名+开始主键+唯一ID),这个唯一标识符在每一个HRegion中都有存储. .mata.表存的数 ...

  2. 转: Genymotion使用及离线镜像的安装

    Genymotion是一套完整的工具,它提供了Android虚拟环境.由于它比Android自带的模拟器要流畅好多,所以它简直就是开发者.测试人员.推销者甚至是游戏玩家的福音.支持Windows.Li ...

  3. RealProxy AOP过滤方法的参数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  4. Oracle的substr函数简单用法与substring区别

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  5. shiro设置session超时

    通过api:Shiro的Session接口有一个setTimeout()方法 //登录后,可以用如下方式取得session SecurityUtils.getSubject().getSession( ...

  6. erlang 最大公约数

    一般面试会遇到问一些算法,什么排序,树,图等等,冷不丁还会问几个蛋疼的问题,我估计生产情况十有八九都用不上,只是题目罢了. 题目:求两个大数的最大公约数. 什么是最大公约数呢? 百度百科的答案这样的: ...

  7. js 判断 IE 浏览器

    遇到一些IE兼容问题,可以考虑在该浏览器环境下,用js控制样式,以下是判断IE版本的js代码 var browser=navigator.appName var b_version=navigator ...

  8. umbraco v7.6.4 surface controller not found 大深坑!

    注意在修改后台地址过程中对于web.config里的umbracoPath 如果你改成了~/admin,surface controller的路由就变成了 /admin/surface/{contro ...

  9. horizontalDragMaxWidth:0;就没有水平滚动条了

    jquery.jscrollpane.css JScrollPane工作所必须的基本的CSS样式.jquery.min.jsjQuery作为javascript库必须提前引入.jquery.mouse ...

  10. sql生成器(含凝视)问题修复版

    接上篇http://blog.csdn.net/panliuwen/article/details/47406455 sql生成器--生成含凝视的sql语句 今天我使用自己写的sql生成器了.自我感觉 ...