【ELK】ElasticSearch 减少集群分片

集群基本配置

集群版本: 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分片太大
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值