1.新建索引的时候 可以使用 命令 设置 分成多少个片。

PUT /my_index HTTP/1.1
Host: localhost:9200
Content-Type: application/json
Content-Length: 88

{
  "settings": {
    "number_of_shards":   100, 
    "number_of_replicas": 1
  }
}

已上命令 设置 索引 my_index 的 分片数量是 100 , 备份 1份, 其实也就是备份片也是有100 片了。 如果 number_of_replicas 写2 就是双备份的意思。 就会有200个片。

举例说明

假设my_index 有 10000条记录。 总计是 1个G ,既 10条记录占1 M 空间 假设。

假设只有一台机器 ,则 设置 number_of_replicas 是无效的。会出现很多

es 查询分片数 查看es分片数量_elasticsearch

要设置 number_of_replicas 起码得有2台机器,最少2台 ,replicas 是备份的意识, 一台机器,备份没有意义,挂了 还是权挂了。所以最少得有2台机器,一台挂了,另一台里面有所有的数据

copy 了1份。 如果 number_of_replicas 改成2 就copy 2份了。

也就是说

如果说。 replicas 的数量 最多也就是机器总量-1 才有意义。

比如你有5台机器, 你设置replicas 为 4 。但是这样会浪费太大的存储空间了。没有人会这么做一般。 一把情况下replicas 设置1即可, 如果对可用性要求很高 可以设置成2 。 既 有2个 备份

如果只有一台机器的时候,

设置了分片100 。 则 所有的 索引数据都会保存到一台机器上。

当然加入了新的机器以后。 比如2台机器。

es 查询分片数 查看es分片数量_es 查询分片数_02

我们看到上面的数据。

我解释下。

加粗的表示主分片。 我们给 my_index 设置了 100个分片 ,所以 有100个。

node-2 是备份 分片。 也是100 片 。 当然 master 挂了以后 我们 依然可以访问node-2拿到所有数据。

这个就是高可用。

mater-node1 里面是所有数据 实际上都有一个copy版本在 Node-2 里面

接着我们加到3台机器看下 。

es 查询分片数 查看es分片数量_搜索引擎_03

可以看到 master-node 上的主分片 ,有部分 分到了 Node-3上。 说明下 加粗边框的表示 主分片, 没有加粗边框 表示 备份分片

node-2上的备份分片 种的一部分也到了 Node-3上。

备份分片和主分分片有个原则。就是同一个分片 ,主 ,备份 不会在同一台机器上,这个很好理解吧。 既然是备份,当然不要放到同一台机器上。

我们接着继续加多一台机器。看看结果

es 查询分片数 查看es分片数量_es 查询分片数_04

又有一些主分片 和 备份分片 分到了 node-4上。

重要说明

假设项目 最开始只有一台机器 M1, 我们设置

PUT /my_index HTTP/1.1
Host: localhost:9200
Content-Type: application/json
Content-Length: 88

{
  "settings": {
    "number_of_shards":   10, 
    "number_of_replicas": 1
  }
}

一台机器的时候设置 number_of_replicas 是无效的,先不管。

设置了10个分片 。 假设插入了 100w条记录,占用磁盘 10G。

随着查询压力来越大,我们加入一台机器 S1 。做集群。

接着我们可以看到 之前的那台机器M1 上的 50%的记录 转移到了 S1上。

然后可以看到 M1的磁盘 本来占用10G的 ,结果呢 变成了 5G ,另外5G 到了S1上。 整个过程是copy的 比较快速。

一直不断你的加机器, 加到 10台。 最后的结果就是 每台机器上有10w 条记录 ,占用 1G的磁盘。

现在理解了 elasticsearch集群了。

es 查询分片数 查看es分片数量_大数据_05

数据会均匀分布到每个节点上。

假设总数据量 1000G, 备份1片 ,总共就是 2000G。 如果有 10个节点 来存放 , 则大概每个节点是存放 200G 的数据。