转载自 : https://blog.csdn.net/alan_liuyue/article/details/79585345

大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片?

在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如何优化,请继续往下阅读.

为什么要考虑分片数

分片分配是个很重要的概念, 很多用户对如何分片都有所疑惑, 当然是为了让分配更合理. 在生产环境中, 随着数据集的增长, 不合理的分配策略可能会给系统的扩展带来严重的问题.

同时, 这方面的文档介绍也非常少. 很多用户只想要明确的答案而不仅仅一个数字范围, 甚至都不关心随意的设置可能带来的问题.

当然,我也有一些答案. 不过先要看看它的定义和描述, 然后通过几个通用的案例来分别给出我们的建议.

分片定义

如果你刚接触ElasticSearch, 那么弄清楚它的几个术语和核心概念是非常必要的.

(如果你已经有ES的相关经验, 可以跳过这部分)

假设ElasticSearch集群的部署结构如下:

通过该图, 记住下面的几个定义:

集群(cluster):由一个或多个节点组成, 并通过集群名称与其他集群进行区分

节点(node):单个ElasticSearch实例. 通常一个节点运行在一个隔离的容器或虚拟机中

索引(index):在ES中, 索引是一组文档的集合

分片(shard):因为ES是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节,一个分片默认最大文档数量是20亿.

副本(replica):ES默认为一个索引创建5个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由5个主分片成本, 而每个主分片都相应的有一个copy.

对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求, 它们的唯一区别在于只有主分片才能处理索引请求.

在上图示例中, 我们的ElasticSearch集群有两个节点, 并使用了默认的分片配置. ES自动把这5个主分片分配到2个节点上, 而它们分别对应的副本则在完全不同的节点上. 对,就这是分布式的概念.

请记住, 索引的number_of_shards参数只对当前索引有效而不是对整个集群生效.对每个索引来讲, 该参数定义了当前索引的主分片数(而不是集群中所有的主分片数).

关于副本

本文中不会对ElasticSearch的副本做详细阐述. 如果想单独了解可参考这篇文章.

副本对搜索性能非常重要, 同时用户也可在任何时候添加或删除副本. 正如另篇文章所述, 额外的副本能给你带来更大的容量, 更高的呑吐能力及更强的故障恢复能力.

谨慎分配你的分片

当在ElasticSearch集群中配置好你的索引后, 你要明白在集群运行中你无法调整分片设置. 既便以后你发现需要调整分片数量, 你也只能新建创建并对数据进行重新索引(reindex)(虽然reindex会比较耗时, 但至少能保证你不会停机).

主分片的配置与硬盘分区很类似, 在对一块空的硬盘空间进行分区时, 会要求用户先进行数据备份, 然后配置新的分区, 最后把数据写到新的分区上.

2~3GB的静态数据集

分配分片时主要考虑的你的数据集的增长趋势.

我们也经常会看到一些不必要的过度分片场景. 从ES社区用户对这个热门主题(分片配置)的分享数据来看, 用户可能认为过度分配是个绝对安全的策略(这里讲的过度分配是指对特定数据集, 为每个索引分配了超出当前数据量(文档数)所需要的分片数).

Elastic在早期确实鼓吹过这种做法, 然后很多用户做的更为极端--例如分配1000个分片. 事实上, Elastic目前对此持有更谨慎的态度.

稍有富余是好的, 但过度分配分片却是大错特错. 具体定义多少分片很难有定论, 取决于用户的数据量和使用方式. 100个分片, 即便很少使用也可能是好的;而2个分片, 即便使用非常频繁, 也可能是多余的.

要知道, 你分配的每个分片都是有额外的成本的:

  • 每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源

  • 每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降

  • ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差

我们的客户通常认为随着业务的增长, 他们的数据量也会相应的增加, 所以很有必要为此做长期规划. 很多用户相信他们将会遇到暴发性增长(尽管大多数甚至都没有遇到过峰值), 当然也希望避免重新分片并减少可能的停机时间.

如果你真的担心数据的快速增长, 我们建议你多关心这条限制: ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.

总之, 不要现在就为你可能在三年后才能达到的10TB数据做过多分配. 如果真到那一天, 你也会很早感知到性能变化的.

尽管本部分并未详细讨论副本分片, 但我们推荐你保持适度的副本数并随时可做相应的增加. 如果你正在部署一个新的环境, 也许你可以参考我们的基于副本的集群的设计.这个集群有三个节点组成, 每个分片只分配了副本. 不过随着需求变化, 你可以轻易的调整副本数量.

大规模以及日益增长的数据场景

对大数据集, 我们非常鼓励你为索引多分配些分片--当然也要在合理范围内. 上面讲到的每个分片最好不超过30GB的原则依然使用.

不过, 你最好还是能描述出每个节点上只放一个索引分片的必要性. 在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个.

随着数据量的增加,如果你通过集群状态API发现了问题,或者遭遇了性能退化,则只需要增加额外的节点即可. ES会自动帮你完成分片在不同节点上的分布平衡.

再强调一次, 虽然这里我们暂未涉及副本节点的介绍, 但上面的指导原则依然使用: 是否有必要在每个节点上只分配一个索引的分片. 另外, 如果给每个分片分配1个副本, 你所需的节点数将加倍. 如果需要为每个分片分配2个副本, 则需要3倍的节点数. 更多详情可以参考基于副本的集群.

Logstash

不知道你是否有基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 我建议你只需要为索引分配1个分片.

如果使用ES的默认配置(5个分片), 并且使用Logstash按天生成索引, 那么6个月下来, 你拥有的分片数将达到890个. 再多的话, 你的集群将难以工作--除非你提供了更多(例如15个或更多)的节点.

想一下, 大部分的Logstash用户并不会频繁的进行搜索, 甚至每分钟都不会有一次查询. 所以这种场景, 推荐更为经济使用的设置. 在这种场景下, 搜索性能并不是第一要素, 所以并不需要很多副本. 维护单个副本用于数据冗余已经足够. 不过数据被不断载入到内存的比例相应也会变高.

如果你的索引只需要一个分片, 那么使用Logstash的配置可以在3节点的集群中维持运行6个月. 当然你至少需要使用4GB的内存, 不过建议使用8GB, 因为在多数据云平台中使用8GB内存会有明显的网速以及更少的资源共享.

总结

再次声明, 数据分片也是要有相应资源消耗,并且需要持续投入.

当索引拥有较多分片时, 为了组装查询结果, ES必须单独查询每个分片(当然并行的方式)并对结果进行合并. 所以高性能IO设备(SSDs)和多核处理器无疑对分片性能会有巨大帮助. 尽管如此, 你还是要多关心数据本身的大小,更新频率以及未来的状态. 在分片分配上并没有绝对的答案, 只希望你能从本文的讨论中受益.

附加分片处理实例

添加分片:

 
  1. //新增索引的同时添加分片,不使用默认分片,分片的数量

  2. //一般以(节点数*1.5或3倍)来计算,比如有4个节点,分片数量一般是6个到12个,每个分片一般分配一个副本

  3. PUT /testindex

  4. {

  5. "settings" : {

  6. "number_of_shards" : 12,

  7. "number_of_replicas" : 1

  8. }

  9. }

修改副本:

 
  1. //修改分片的副本数量

  2. PUT /testindex/_settings

  3. {

  4. "number_of_replicas" : 2

  5. }

本文转载于(译) https://segmentfault.com/a/1190000008868585

此文的原文为 https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index

如何合理分配Elasticsearch的分片和副本相关推荐

  1. Elasticsearch的分片和副本

    Elasticsearch是一个分布式搜索和分析引擎,其设计目标是在分布式环境下处理海量数据.为了实现这个目标,Elasticsearch将数据分割成多个分片,并在多台服务器上进行存储和处理.每个分片 ...

  2. es的分片和副本_Elasticsearch 集群分配多少分片合理

    Elasticsearch 是一个非常通用的平台,支持各种用户实例,并为组织数据和复制策略提供了极大的灵活性.但是,这种灵活性有时会使我们很难在早期确定如何很好地将数据组织成索引和分片,尤其是不熟悉 ...

  3. Elasticsearch 分片和副本策略

    Elasticsearch 基本概念 Cluster 集群,一个ES集群是由多个节点(Node)组成的,每个集群都有一个cluster name 作为标识 `cluster.name: [elasti ...

  4. elasticsearch - 节点、集群分片及副本、CRUD

    分布式系统的可用性和扩展性 高可用性 服务可用性 :允许有节点停止服务 数据可用性 :部分节点丢失,不会丢失数据 可扩展性 请求量提升 / 数据的不断增长(将数据分布都所有接点上) 分布式特性 ela ...

  5. es的分片和副本_Elasticsearch 索引分片与副本设置技巧

    Elasticsearch虽然搜索很快,但如果分片设置不当,当数据量达到一个量级后,查询速度也会直线下降. 如果一个索引具有很大的数据量,它的数据量可能会超出单个节点的容量限制(硬盘容量),而且单个节 ...

  6. es动态分配分片_ES集群分片及副本调整

    分片shardsES是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配 副本replica ...

  7. mangodb—分片和副本集架构部署

    mangodb-分片和副本集架构部署 三台服务器20.0.0.18(19)(20) **服务器18 **服务器19 **服务器20 mongos mongos mongos config server ...

  8. MongoDB 分片(sharding)+副本集(replSet)集群搭建

    文章目录 MongoDB安装 Windows平台安装 1.下载 2.安装 3.启动MongoDB服务 4.进入MongoDB后台 Linux平台安装MongoDB 1.下载 2.安装 3.创建数据库目 ...

  9. es的分片和副本_Elasticsearch的分布式存储与分片内部原理

    1.文档如何存储 1.1 分片与路由 当索引一个文档的时候,文档会被存储到一个主分片中.Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存 ...

  10. 2021年大数据Kafka(七):Kafka的分片和副本机制

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的分片和副本机制 一.分片机制 二.副本机制 三. ...

最新文章

  1. Linux C编程--string.h函数解析
  2. 跑步app保活_android判断不同手机厂商,打开允许后台运行APP弹窗
  3. Apache部署网页-Ubuntu16.04
  4. java数据类型(整型、浮点型、char类型、boolean型、类型转换)
  5. 2篇word文档比较重复率_继续教育 | 你该知道的论文小技巧——重复率检测
  6. AI深入应用,生态越加开放,开发者的机会在哪里?
  7. linux下C结构体初始化
  8. SAP License:做系统要关注业务过程
  9. 一只青蛙跳向三个台阶_Java版剑指offer编程题第9题--变态跳台阶
  10. 清北学堂模拟day4 捡金币
  11. 3500常用字+字母+数字+表单符号
  12. arcpy 土地整治报备坐标文件导出(解决内环问题)
  13. ajax status code 415,Ajax向后台传json格式的数据出现415错误的原因分析及解决方法...
  14. oracle导出自增设置,教程方法;oracle中如何设置自增主键电脑技巧-琪琪词资源网...
  15. sqlserver 附加数据库方法
  16. tensorflow2计算flops
  17. 360秒抓取收录批量提交程序
  18. openfeign接口启动报错: is not assignable to interface feign.hystrix.FallbackFactory
  19. 什么是Java SE、Java EE、Java ME?
  20. 文本行高——line-height属性

热门文章

  1. ThinkPHP的pathinfo模式、路径访问模式及URL重写
  2. Hadoop I/O
  3. 分布式数据库中间件–(1) Cobar初始化过程
  4. Spring配置bean文件的底层实现方式
  5. 算法笔记(二)抽牌法产生随机全排列
  6. Refactoring Page Head
  7. yoga710怎么进入bios_重装系统看不懂bios?超详细中英文翻译,教你1分钟识别bios各项...
  8. 计算机相关技能简历,简历计算机技能有哪些
  9. FRR BGP 协议分析2 -- 创建对等体的命令分析
  10. CentOS 6系统FreeSwitch和RTMP服务 安装及演示(一)