• 欢迎来到小爱博客,一个分享互联网IT技术的网站,喜欢就收藏吧!

elasticsearch分片Shards理解

elasticsearch 小爱 2个月前 (08-12) 55次浏览 已收录 0个评论 扫描二维码

分片重要性

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

分片是什么?

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

实列场景:

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

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

分片的设置

创建 IndexName 索引时候,在 Mapping 中可以如下设置分片 (curl)

<code class="hljs bash has-numbering">PUT indexName
{
    <span class="hljs-string">"settings"</span>: {
        <span class="hljs-string">"number_of_shards"</span>: <span class="hljs-number">5</span>
    }
}</code>

注意

索引建立后,分片个数是不可以更改的

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

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

实列场景:

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

<code class="hljs  has-numbering">建议:(仅参考)

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

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

   3、节点数大于等于分片数</code>

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

结果: 建10个节点 (Node),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不提供此方式需要改源码。

<code class="hljs avrasm has-numbering">    <span class="hljs-comment">/** 
         * 指定分片 查询 
         */</span>  
        @Test  
        public void testPreference()  
        {  
            SearchResponse searchResponse = transportClient<span class="hljs-preprocessor">.prepareSearch</span>(index)  
                    <span class="hljs-preprocessor">.setTypes</span>(<span class="hljs-string">"add"</span>)  
                    //<span class="hljs-preprocessor">.setPreference</span>(<span class="hljs-string">"_local"</span>)  
                    //<span class="hljs-preprocessor">.setPreference</span>(<span class="hljs-string">"_primary"</span>)  
                    //<span class="hljs-preprocessor">.setPreference</span>(<span class="hljs-string">"_primary_first"</span>)  
                    //<span class="hljs-preprocessor">.setPreference</span>(<span class="hljs-string">"_only_node:ZYYWXGZCSkSL7QD0bDVxYA"</span>)  
                    //<span class="hljs-preprocessor">.setPreference</span>(<span class="hljs-string">"_prefer_node:ZYYWXGZCSkSL7QD0bDVxYA"</span>)  
                    <span class="hljs-preprocessor">.setPreference</span>(<span class="hljs-string">"_shards:0,1,2"</span>)  
                    <span class="hljs-preprocessor">.setQuery</span>(QueryBuilders<span class="hljs-preprocessor">.matchAllQuery</span>())<span class="hljs-preprocessor">.setExplain</span>(true)<span class="hljs-preprocessor">.get</span>()<span class="hljs-comment">;  </span>

            SearchHits hits = searchResponse<span class="hljs-preprocessor">.getHits</span>()<span class="hljs-comment">;  </span>
            System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(hits<span class="hljs-preprocessor">.getTotalHits</span>())<span class="hljs-comment">;  </span>
            SearchHit[] hits2 = hits<span class="hljs-preprocessor">.getHits</span>()<span class="hljs-comment">;  </span>
            for(SearchHit h : hits2)  
            {  
                System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(h<span class="hljs-preprocessor">.getSourceAsString</span>())<span class="hljs-comment">;  </span>
            }  
        }  </code>

小爱博客 , 版权所有
转载请注明原文链接:elasticsearch分片Shards理解
喜欢 (0)
【你的支持, 我的动力】
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址