集群基本配置
集群版本: 7.17.6
索引与分片:
Documents 454,494,694,735
Disk Usage 747.0 TB
Primary Shards 26,160
Replica Shards 26,160
segments: 1083370
为什么要控制集群分片
- 为了实现高摄取率,您希望将活动索引中的分片分布到尽可能多的节点上。
- 为了获得最佳搜索和较低的资源使用率,您需要尽可能少的分片,但不希望分片太大而变得笨重。
- 如果集群总的状态数据很大,master处理这些任务就容易出现超时。
我的 Elasticsearch 集群中应该有多少个分片
- 搜索在每个分片的单个线程上运行
- 每个索引和分片都有开销
从 8.3 版开始,大幅减小了每个分片的堆使用量
最佳实践如何配置
#https://www.elastic.co/guide/en/elasticsearch/reference/7.17/size-your-shards.html#shard-count-recommendation
7.17版本:
1.分片大小没有硬性限制,但经验表明,10GB 到 50GB 之间的分片通常适用于日志和时间序列数据,分片过小会导致段过小,进而致使开销增加
2.堆内存最大不要超过31G,大多数生产环境,建议使用默认大小4G。将Xms和设置Xmx为不超过总内存的 50%,Elasticsearch 使用堆外缓冲区来实现高效的网络通信
3.数据节点可以容纳的分片数量与节点的堆内存成正比,每 GB 堆内存分片 20 个分片
8版本
经验表明,只要每个分片的文档数量保持在 2 亿以下,10GB 到 50GB 之间的分片通常适用于许多用例
经验表明,主节点上每 GB 堆的索引数应少于 3000 ,主节点 31G内存应该管理少于93000个索引
节点的堆至少需要基本开销:
1 GB 用于集群状态字段信息。
1 GB 用于数据节点字段的额外估计堆开销。
0.5 GB 额外堆用于其他开销。
综合上述-理论最佳配置(7.17版本):
- 分片大小:每个分片大小50GB
- 堆内存:31G(机器内存配置足够大)
- 节点分片数:20 个分片/堆内存GB
- "cluster.routing.allocation.disk.watermark.low":90%
机器选型: 【64G/16C 3.5T磁盘(32G*50GB*20分片 /90%)】* n (单台多节点)
可以调整,例如分片大小不一致 可以根据实际情况调整磁盘大小,cold、hot、Warm、frozen等需要的配置也不需要一致
每日提前创建索引,容易导致出现空索引,空分片,为什么还要每日提前创建?
es的segment合并是一个非常耗时的操作,系统在每天早上8点创建新索引的时,有大量的index创建并且大量数据写入,容易造成批处理超时,批量处理的超时时间默认设置为30s。 https://github.com/elastic/elasticsearch/issues/87001
优化(这些是可以写一些脚本来检查实现滴)
创建涵盖较长时间段的索引
例如,您可以每月创建索引,而不是创建每日索引。
删除空或不需要的索引
DELETE my-index-000001
合并较小的索引
POST _reindex
{
"source": {
"index": "my-index-2099.10.*"
},
"dest": {
"index": "my-index-2099.10"
}
}
DELETE my-index-2099.10.*
其他集群优化
避免节点成为热点增加集群的承载力
单个个节点对于索引量较高的索引包含太多分片,则该节点可能会出现问题。为了防止热点,请使用 index.routing.allocation.total_shards_per_node索引设置显式限制单个节点上的分片数量。--运维成本比较大
减少映射字段数量,提升查询速度,减少存储空间
为数据节点上每个索引的每个字段留出 1kB 的堆空间,还要为开销留出额外的空间-7.17版本
每个映射字段的具体资源使用情况取决于其类型,但经验法则是,每个数据节点持有的每个索引的每个映射字段允许大约 1kB 的堆开销。您还必须为 Elasticsearch 的基线使用以及工作负载(例如索引、搜索和聚合)留出足够的堆空间。额外留出 0.5GB 的堆足以满足许多合理的工作负载,如果您的工作负载非常轻,可能需要更少的空间,而工作负载繁重的话可能需要更多空间。
例如,如果一个数据节点持有来自 1000 个索引的分片,每个索引包含 4000 个映射字段,那么您应该为字段留出大约 1000 × 4000 × 1kB = 4GB 的堆空间,并为其分配另外 0.5GB 的堆空间用于工作负载和其他开销,因此该节点需要至少 4.5GB 的堆大小。
非高峰时段强制合并,减少段数量,提升查询速度,
单个分片的开销取决于段数量和段大小
由于单个分片的开销取决于段数量和段大小,所以通过 forcemerge 操作强制将较小的段合并为较大的段能够减少开销并改善查询性能。理想状况下,应当在索引内再无数据写入时完成此操作。请注意:这是一个极其耗费资源的操作,所以应该在非高峰时段进行。
#index settings
"merge" : {
"scheduler" : {
"max_thread_count" : "1"
}
},POST my-index-000001/_forcemerge
动态模板和性能优化。。。。
参阅:
size-your-shards
我在 Elasticsearch 集群内应该设置多少个分片?
如何减少 Elasticsearch 集群中的分片数量
Elasticsearch分片太大