ES 集群、节点、分片、索引、备份 之间的概念:https://www.zhihu.com/question/26446020
1. 集群(cluster)
一个 ES 集群由一个或多个节点(Node)组成,每个集群都有一个 cluster name 作为标识
2. 节点(node)
一个 ES 实例就是一个 node,一个机器可以有多个实例。大多数情况下每个node 运行在独立的环境或虚拟机上
3. 索引(index)
一系列文档(documents)的集合
对于一个索引,除非重建索引否则不能调整主分片的数目,但可以随时调整备份分片的数目
4. 分片(shard)
- ES 是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上
- 分片有助于横向扩展,N 个分片会被尽可能平均的分配在不同的节点上。比如:有 2 个节点(node),4 个主分片(不考虑备份),那么每个节点会被分配到 2 个分片,如果后边增加 2 个节点,那么这 4 个节点上都会有 1 个分片,这个过程叫 relocation,ES 感知后自动完成
- 分片是独立的,对于一个 Search request 的行为,每个分片都会执行这个 request
- 每个分片都是一个 Lucene Index,所以一个分片只能存放
Integer.MAX_VALUE - 128
也就是pow(2,31)-1-128
个,由开发者规定,希望远小于 JVM 的 MAX_ARRAY_LENGTH 大小。https://issues.apache.org/jira/browse/LUCENE-5843 - 分片分为 主分片(primary shard)和备份分片(replica shard)。主分片和备份分片不会出现在同一个节点上(防止单点故障)
5. 集群状态
- Green:所有主分片和备份分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成 Yellow 状态
- Yellow:所有主分片准备就绪,但存在至少一个主分片 A 对应的备份分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好主分片 A 所在的机器挂了,并且只设置了一个备份分片,并且已处于未就绪状态,那么 A 的数据就会丢失(查询结果不完整),此时集群进入 Red 状态
- Red:至少有一个主分片没有就绪(直接原因是找不到对应的备份分片成为新的主分片),此时查询结果会出现数据丢失(不完整)
6. replica 的作用
- 容灾:主分片丢失,备份分片就会成为新的主分片,同时根据这个新的主分片创建新的备份分片,集群数据安然无恙
- 提高查询性能:备份分片和主分片的数据是相同的,所以对于一个查询既可以查主分片也可以查备份分片,在合适的范围内多个备份分片性能会更好(但相应资源占用也会提升)