elasticsearch 分片(Shards)的理解


声明:本文转载自https://my.oschina.net/TOW/blog/1542018,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

elasticsearch 中分片(Shards)非常非常重要,直接和性能挂钩。以下仅为个人实际使用 elasticsearch 4年的理解,可能存在误解,一切以官方文档为准。

分片重要性

Es中所有数据均衡的存储在集群中各个节点分片中,会影响ES的性能、安全和稳定性, 所以很有必要了解一下它。

 

分片是什么?

简单来讲就是咱们在ES中所有数据的文件块。

实列场景:

咱们设置了索引A有2个分片,我们向索引A中插入10条数据,那么这10条数据分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。

和主流关系型数据库的表分区的概念有点类似,如果你比较熟悉关系型数据库的话。

 

分片的设置

创建Mapping的设置(curl)

PUT indexName {     "settings": {         "number_of_shards": 5     } }

注意

1、默认索引是5个分片

2、分片一定设置是不可以修改的,只能新建新索引解决

 

分片个数(数据节点计算)

分片个数是越多越好还是越少越好了?这个问题是根据数据量决定的,正确来说是根据数据入Es后文件大小决定的。

实列场景:

如果索引A总文件大小是300G,改怎么定制方案了?

建议:(仅参考)

1、保证每一个分片数据大小在30GB左右

2、每一个节点最多存放一个分片

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

 

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

结果: 建10个数据节点,Mapping 指定分片数为 10,满足每一个节点一个分片,每一个分片大小30G左右。

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

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

 

分片查询

我们可以指定es去具体的分片查询从而进一步的实现es极速查询。

1:randomizeacross shards

随机选择分片查询数据,es的默认方式

2:_local

优先在本地节点上的分片查询数据然后再去其他节点上的分片查询,本地节点没有IO问题但有可能造成负载不均问题。数据量是完整的。

3:_primary

只在主分片中查询不去副本查,一般数据完整。

4:_primary_first

优先在主分片中查,如果主分片挂了则去副本查,一般数据完整。

5:_only_node

只在指定id的节点中的分片中查询,数据可能不完整。

6:_prefer_node

优先在指定你给节点中查询,一般数据完整。

7:_shards

在指定分片中查询,数据可能不完整。

8:_only_nodes

可以自定义去指定的多个节点查询,es不提供此方式需要改源码。

    /**           * 指定分片 查询           */           @Test           public void testPreference()           {               SearchResponse searchResponse = transportClient.prepareSearch(index)                       .setTypes("add")                       //.setPreference("_local")                       //.setPreference("_primary")                       //.setPreference("_primary_first")                       //.setPreference("_only_node:ZYYWXGZCSkSL7QD0bDVxYA")                       //.setPreference("_prefer_node:ZYYWXGZCSkSL7QD0bDVxYA")                       .setPreference("_shards:0,1,2")                       .setQuery(QueryBuilders.matchAllQuery()).setExplain(true).get();                              SearchHits hits = searchResponse.getHits();               System.out.println(hits.getTotalHits());               SearchHit[] hits2 = hits.getHits();               for(SearchHit h : hits2)               {                   System.out.println(h.getSourceAsString());               }           }  

 

本文发表于2017年09月23日 08:37
(c)注:本文转载自https://my.oschina.net/TOW/blog/1542018,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 6160 讨论 0 喜欢 7

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1