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 是无效的。会出现很多
要设置 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台机器。
我们看到上面的数据。
我解释下。
加粗的表示主分片。 我们给 my_index 设置了 100个分片 ,所以 有100个。
node-2 是备份 分片。 也是100 片 。 当然 master 挂了以后 我们 依然可以访问node-2拿到所有数据。
这个就是高可用。
mater-node1 里面是所有数据 实际上都有一个copy版本在 Node-2 里面
接着我们加到3台机器看下 。
可以看到 master-node 上的主分片 ,有部分 分到了 Node-3上。 说明下 加粗边框的表示 主分片, 没有加粗边框 表示 备份分片
node-2上的备份分片 种的一部分也到了 Node-3上。
备份分片和主分分片有个原则。就是同一个分片 ,主 ,备份 不会在同一台机器上,这个很好理解吧。 既然是备份,当然不要放到同一台机器上。
我们接着继续加多一台机器。看看结果
又有一些主分片 和 备份分片 分到了 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集群了。
数据会均匀分布到每个节点上。
假设总数据量 1000G, 备份1片 ,总共就是 2000G。 如果有 10个节点 来存放 , 则大概每个节点是存放 200G 的数据。