es里的node和shard是一一对应的关系吗,可以多个shard分配到一个node上吗
不是一一对应关系,一个Elasticsearch node上可以分配多个shard。
详细解释
1. 概念
- Node:Elasticsearch 集群中的单个服务器(进程)。
- Shard:Elasticsearch 索引的分片。一个索引会被切分成若干个shard,每个shard实际就是一个Lucene实例,存储部分数据。
2. 分配关系
- 并不是一一对应。如下:
- 一个node可以承载多个shard。
- 一个shard只能位于一个node(即一个shard的“主本体”不会在多个node上,副本见下)。
- 通常我们把一份数据索引分成若干个shard后,Elasticsearch会将这些shard分布到集群中的多个node上以达到数据分布和并行能力的目的。
- 为了高可用,每个shard还可以有replica(副本),副本也会分配到其它node上(不会和主本体在一个节点)。
3. 举个例子
假设你有3台机器(3个node),你把索引分成5个shard(主分片),并每个分片1个副本。
- 15个shard(5主5副本=10)分布在3个node上,每个node上可以有若干shard。
- 也就是说,一个node可以有多个shard(来自同一个index或者不同index)。
4. 典型应用场景
- 在小型集群,只有几台机器时,shard数通常大于node数,所以必然多个shard分布在同一个node上。
- 比如:3个node,9个shard,则每个node大致有3个shard。
- 在Elasticsearch实际生产环境,一个node通常承载几十上百个shard,这完全正常。
总结
- es里的node和shard不是一一对应关系。
- 一个node上可以分配多个shard。