Elasticsearch 官方建议在每 GB 堆内存上保持 20-25 个分片,这是一个推荐值,并不是硬性限制,但设置得过高会带来性能风险。
因节点分片不够导致降采样失败案例:
江苏移动 ElasticSearch 策略日志在 9月19到10月8日都能按天汇聚(期间每天汇聚后有20-30万条,汇聚后每条索引占用 10-20MB),但到了10月9日就不再汇聚了,查看索引,本来每天生成一个索引的,但发现索引名称就停在10月9日,新的数据都往10月9日放了,之后就没有再按天创建新索引。进入此索引发现有报错信息:this action would add [5] shards, but this cluster currently has [999]/[1000] maximum normal shards open
。意思是说:这个集群当前已经有 999 个分片,接近最大限制(1000 个分片),只能再添加一个分片。但我的操作(创建新索引)尝试添加 5 个分片,超出了允许的分片总数上限,因此操作被拒绝。理解下来就是说:Elasticsearch 集群在分片数量上达到上限,导致创建新索引时失败了。因为创建新索引需要5个分片(number_of_shared),这应该是我在索引模板里指定了这个值。
客户这台服务器有754GB内存,可创建754Gx25=18850个分片。目前接入1个设备对应2个DataStream,由于降采样是按天的,因此每天会创建2个索引,一个索引分配5个分片,一年就需要7300个分片。
解决办法:由于数据要保存一年,因此客户那将每个索引的分片数调整到1,并且不再一天创建一个索引了,而是10天 roll over 一次,即10天创建一个索引。
通过 GET _cat/allocation?v
可以查看当前节点使用的分片数、磁盘使用情况,如图: