天天看点

elasticsearch中分片(Shards)的理解

分片重要性

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

分片是什么?

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

实列场景:

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

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

分片的设置 settings

PUT my_index
{
  "settings": {
    "index": {
      "refresh_interval": "1s",
      "number_of_shards": "3",
      "analysis": {
        "analyzer": {
          "ik_max_html_word": {
            "char_filter": [
              "html_strip"
            ],
            "tokenizer": "standard"
          }
        }
      }
    }
  },
  "mappings": {
    "dynamic_templates": [
      {
        "int": {
          "match": "*",
          "match_mapping_type": "long",
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "cn": {
          "match": "*",
          "match_mapping_type": "string",
          "mapping": {
            "type": "text"
          }
        }
      }
    ],
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "@version": {
        "type": "text"
      },
      "app_push": {
        "type": "text"
      }
    }
  }
}      

注意

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

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

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

实列场景:

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

建议:(仅参考)

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

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

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

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

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

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

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

Settings 和 Mappings的联系和区别

简单地说,就是

  settings是修改分片和副本数的。