ElasticSearch中副本和分片如何优化?
目录
1. ElasticSearch 分片(Shard)的概念与计算
• 分片的配置与计算
2. ElasticSearch 副本(Replica)的概念与配置
• 副本的配置
3. 分片、副本与节点的关系
• 节点与分片的关系
• 副本的数量和节点
4. 分片、副本配置的建议
5. 常见问题:分片数和副本数是否能够在创建索引后添加
• 分片数(Shards)在创建索引后是否能修改
• 副本数(Replicas)在创建索引后是否能修改
6. 如何设置分片数和副本数
• 设置分片数
• 设置副本数
• 副本数的限制
7. 总结
ElasticSearch 的分片(Shard)和副本(Replica)的数量与服务器节点(Node)密切相关,因为它们直接影响到数据的分布、查询性能和系统的高可用性。为了深入理解这个过程,我们需要分别了解分片、副本的概念,以及它们在集群中的运作方式,最后再讨论如何根据服务器节点的数量来合理地配置分片和副本。
1. ElasticSearch 分片(Shard)的概念与计算
ElasticSearch 中的分片是数据存储的基本单位。一个索引可以被分成多个分片,分片中的数据会被分布到不同的节点上。ElasticSearch 分片的概念可以类比为关系型数据库中的数据分区,通过将大数据集分片,可以提高数据存储的分布性和查询的并行性。
分片的配置与计算
在创建索引时,ElasticSearch 会默认配置分片的数量。每个分片的数量在索引创建时就必须设定,并且一旦创建索引,分片数量无法更改。一般来说,分片的数量取决于以下几个因素:
• 数据量:预计存储的数据大小决定了分片的数量。ElasticSearch 推荐每个分片的大小在 10-50GB 之间。超过此范围可能会导致性能下降或不稳定。
• 查询并发量:更多的分片能够分散查询压力,提升并发查询的性能。然而,分片过多也会导致集群维护开销过高。
• 节点数量:分片在集群中的各个节点上分布,因此分片数量与节点数相关。如果有较多节点,那么可以考虑更多的分片,以便更好地平衡节点负载。
举个例子:如果预计索引中有 500GB 的数据,并且每个分片设定大小为 25GB,那么合适的分片数量为 500/25 = 20 个分片。
2. ElasticSearch 副本(Replica)的概念与配置
副本(Replica)是分片的副本,用于实现数据的冗余和高可用性。每个主分片(Primary Shard)都可以有一个或多个副本分片(Replica Shard),这些副本分片在集群中存放在不同的节点上,从而在主分片不可用的情况下,副本可以自动切换为主分片,保证数据的可用性。
副本的配置
ElasticSearch 默认每个主分片有 1 个副本分片。副本数量与主分片的比例是 1:1,这意味着每个主分片会有 1 个对应的副本。你可以根据需要调整副本数量,但注意副本不能与对应的主分片放在同一个节点上。
副本的主要作用:
• 提高查询性能:副本分片可以分担查询的负载,特别是在读操作繁重的场景下,每个副本分片都可以响应读请求。
• 高可用性:如果某个节点宕机,ElasticSearch 会将该节点上的主分片的副本提升为主分片,继续对外提供服务,避免数据丢失。
3. 分片、副本与节点的关系
ElasticSearch 的集群是由多个节点组成的,每个节点在集群中可能会存储多个分片。分片和副本的数量与节点的数量直接相关,因为它们会影响集群的负载均衡和容错能力。
节点与分片的关系
• 主分片与节点:主分片会均匀地分布在集群中的各个节点上。理论上,如果集群中有 N 个节点,索引有 S 个主分片,那么每个节点上会分配 S/N 个分片。
• 副本与节点:副本分片不会和主分片放在同一个节点上。如果某个节点上存储了某个主分片,那么它的副本分片会存储在集群中的其他节点上,以保证数据的冗余和高可用性。
例如,在一个 5 个节点的集群中,如果索引有 10 个主分片和 1 个副本,那么集群中的 5 个节点将被分配总共 20 个分片(10 个主分片 + 10 个副本分片)。ElasticSearch 会尽量将分片和副本均匀分布在不同的节点上。
副本的数量和节点
• 如果你有 1 个副本分片,那么你至少需要 2 个节点来存储主分片和副本分片。如果只有 1 个节点,副本分片将无法分配。
• 如果你想要更高的容错能力,可以增加副本的数量。例如,如果你有 3 个节点并为每个分片设置 2 个副本,那么 ElasticSearch 可以在每个节点上分布主分片和副本分片。
4. 分片、副本配置的建议
在实际应用中,分片和副本的数量通常取决于集群的规模和业务需求。以下是一些建议:
• 分片数量:
• 如果数据量较大或查询较多,可以增加分片数量以提高并发查询的能力。
• 如果分片过多,可能会导致集群管理和维护的负担增大,推荐根据实际数据量来设定分片大小。
• 副本数量:
• 如果读操作较多,可以考虑增加副本数量,以便更多的分片可以响应读请求。
• 如果集群的高可用性要求较高,可以增加副本数量来确保即使多个节点故障,数据也不会丢失。
例如,假设你有一个集群由 5 个节点组成,并且你预计会存储 100GB 的数据。你决定每个分片的大小约为 20GB,因此你需要 5 个主分片。如果你希望有 1 个副本,那么集群中总共需要存储 10 个分片(5 个主分片 + 5 个副本分片),每个节点将分配 2 个分片。
常见问题:分片数和副本数是否能够在创建索引后添加
分片数(Shards)在创建索引后是否能修改
分片数在创建索引时是固定的,无法在索引创建后直接修改。这是 ElasticSearch 的设计限制之一,因为主分片的分布和数据存储是静态的,一旦数据写入主分片,分片数的更改会引发复杂的底层数据迁移问题,因此在创建索引之后,ElasticSearch 不允许直接改变主分片的数量。
如果在创建索引时设定的分片数不够,导致集群负载分布不均或者查询性能不佳,那么只能通过以下两种方案进行调整:
• 重建索引:最常见的方式是通过重新索引(Reindexing)。可以创建一个新的索引,并且在新索引中配置合适的分片数量,然后将数据从旧索引迁移到新索引。这种方法虽然麻烦,但是确保了数据的正确分布。
• 示例:
PUT /new-index
{
"settings": {
"number_of_shards": 10,
"number_of_replicas": 1
}
}然后使用 ElasticSearch 的 Reindex API:
POST _reindex
{
"source": {
"index": "old-index"
},
"dest": {
"index": "new-index"
}
}• 使用索引别名(Alias):可以为新的索引创建别名,这样应用程序可以无缝切换到新的索引,而无需修改查询代码。别名允许对多个索引进行查询,这是一种灵活的索引管理方法。
副本数(Replicas)在创建索引后是否能修改
与主分片不同,副本数是可以动态调整的,即可以在索引创建之后增加或减少副本分片的数量。这是因为副本是主分片的副本,ElasticSearch 能够在不影响主分片数据的情况下增加或删除副本,从而实现动态扩展和调整高可用性。
通过简单的 API 调用,可以在索引创建后随时调整副本数量:
PUT /index_name/_settings
{
"number_of_replicas": 2
}
这个操作会触发 ElasticSearch 在集群中的其他节点上重新分配副本分片,以保证副本分布的均匀性。
副本数的调整不会影响主分片的数据存储结构,但副本分片的分布仍然会受集群中可用节点的数量限制。需要注意的是,副本分片不能与其对应的主分片存储在同一节点上,因此在增加副本数时,必须确保集群中有足够多的节点来存放这些副本。
2. 如何设置分片数和副本数
设置分片数
分片数的设置在创建索引时通过配置参数 number_of_shards
来指定。ElasticSearch 默认每个索引有 5 个分片,但这一数量可以根据需求调整。
设置分片数的步骤:
1. 确定数据规模:估算你存储的数据总量,参考每个分片的最佳大小(通常在 10GB 到 50GB 之间)。
2. 决定并发量和负载分布:考虑查询的并发性,更多的分片可以分散查询负载。
3. 设置分片数:在创建索引时,使用
number_of_shards
参数指定分片数量。
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
上面的例子创建了一个有 3 个主分片和 1 个副本的索引。
设置副本数
副本数的设置同样在创建索引时通过 number_of_replicas
参数来指定,默认值为 1。副本数的调整比主分片灵活,可以在任何时候通过 API 调整。
设置副本数的步骤:
1. 确定高可用性需求:如果希望容忍多个节点故障,可以增加副本数。
2. 考虑读操作性能:增加副本也可以提升查询性能,因为每个副本分片都能处理读请求。
3. 动态调整副本数:可以通过
_settings
API 动态增加或减少副本。
PUT /my_index/_settings
{
"number_of_replicas": 2
}
通过上面的 API,将副本数调整为 2,这意味着每个主分片将有 2 个副本分片,系统可以容忍最多 2 个节点的故障。
副本数的限制
副本数的设置受集群中的节点数量限制。ElasticSearch 要求副本分片和对应的主分片存储在不同的节点上。因此:
• 如果你有 3 个节点的集群,并设置了 2 个副本数,那么 ElasticSearch 会将每个主分片和它的两个副本分布在不同的节点上。
• 如果集群中的节点数量不足,ElasticSearch 会将副本分片标记为未分配(Unassigned),直到集群中的节点数足够。
总结
ElasticSearch 中的分片和副本的配置确实与节点的数量密切相关。分片的数量决定了数据的分布和查询性能,而副本的数量则影响数据的冗余性和系统的高可用性。节点的数量决定了分片和副本可以分布的范围,因此,合理的分片和副本配置应该综合考虑节点数量、数据量、查询需求和高可用性要求。
欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。