📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 7.13-8.x

1. 错误异常的基本描述 #

unable to parse [{}={}] as either percentage or bytes 表示 Elasticsearch 在解析某个配置项时,发现其值既不是合法的百分比格式,也不是合法的字节大小格式。该异常通常在节点启动、动态更新集群设置(cluster settings API)或加载 elasticsearch.yml 配置时抛出。

Elasticsearch 中有多个配置项同时支持百分比和字节两种写法,例如:

  • 磁盘水位线:cluster.routing.allocation.disk.watermark.low
  • 断路器设置:indices.breaker.total.limit
  • 缓存大小:indices.queries.cache.size

当这些配置项被赋予一个无法识别的值时,就会触发此异常。

常见现象 #

  • 节点启动失败,日志中出现 unable to parse 异常,节点无法正常加入集群。
  • 通过 PUT /_cluster/settings 动态更新配置时,API 返回 400 错误,提示无法解析设置值。
  • 配置值由自动化脚本或部署模板渲染生成时,变量为空或格式错误,导致写入非法值。
  • 异常日志中会明确打印出 settingName 和原始值,便于定位具体是哪个配置项出现问题。

典型报错与异常栈 #

illegal_argument_exception: unable to parse [cluster.routing.allocation.disk.watermark.low=85] as either percentage or bytes
Caused by: ElasticsearchParseException: unable to parse [cluster.routing.allocation.disk.watermark.low=85] as either percentage or bytes
	at org.elasticsearch.common.unit.ByteSizeValue.parseBytesSizeValue(ByteSizeValue.java:...)
	at org.elasticsearch.common.settings.Setting.parse(Setting.java:...)

2. 为什么会发生这个错误 #

该异常的根本原因是配置值未遵循 Elasticsearch 对百分比或字节格式的语法要求。常见原因包括:

  • 百分比格式错误:写成了 850.8585percent百分之85 等非标准写法,正确格式应为 85%
  • 字节格式错误:写成了 50 GB(含空格)、10mbs(单位不支持)、2gib(大小写错误)、500(无单位)等,正确格式应为 50gb10mb2g500b
  • 空值或变量未渲染:在自动化部署场景中,模板变量为空,最终配置项变成 setting= 的形式,值为空字符串。
  • 单位不支持:使用了 Elasticsearch 不支持的单位缩写,如 1kb 正确,但 1kib1k 在某些情况下不被接受。
  • 多值配置格式错误:磁盘水位线支持同时设置百分比和字节值(用逗号分隔),若分隔符或格式错误也会触发异常。

3. 如何排查和解决这个异常 #

建议按以下步骤排查:

  1. 从异常日志中确认具体的配置项名称(settingName)和当前值(value)。
  2. 对照 Elasticsearch 官方文档 确认该设置支持的格式。
  3. 检查配置来源:是 elasticsearch.yml 静态配置、还是通过 cluster settings API 动态设置,亦或是部署模板渲染结果。
  4. 如果是自动化脚本生成的值,打印最终渲染的配置字符串,确认变量替换是否正确。
  5. 在测试环境用标准示例值(如 85%50gb)逐个替换,确认合法格式后再应用到生产环境。

排查时需要注意的问题 #

  • 不要只看报错表面的配置项名称,要确认值的完整字符串,包括是否有不可见字符、空格或换行。
  • 如果配置由 Ansible、Terraform、Helm 等工具管理,检查模板文件和变量文件的对应关系。
  • 磁盘水位线等设置支持同时指定百分比和字节值(逗号分隔),确认分隔符是否为英文逗号,且两部分格式均正确。

4. 如何解决这个错误 #

常用修复思路 #

  • 百分比写法:统一写成 85%90% 这样的标准形式,不要省略 % 符号。
  • 字节写法:使用 Elasticsearch 支持的单位:bkbmbgbtbpb,且单位前不加空格,如 50gb500mb
  • 避免非法字符:确保配置值前后无空格、无不可见字符、无多余引号。
  • 多值配置:如磁盘水位线同时设置百分比和字节值,格式为 85%,50gb,两部分均须合法。
  • 自动化场景:为配置生成逻辑增加格式校验,在写入集群设置前验证值的合法性。

正确配置示例 #

# elasticsearch.yml 静态配置示例
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%

indices.breaker.total.limit: 70%
indices.queries.cache.size: 10%
# 通过 API 动态更新配置
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "85%",
    "indices.breaker.total.limit": "70%"
  }
}

后续注意事项与推荐建议 #

  • 在 CI/CD 流水线中加入配置文件格式校验步骤,避免非法值被推送到生产环境。
  • 对关键配置项(磁盘水位线、断路器、缓存大小)建立监控和告警,配置变更时主动通知。
  • 使用 INFINI Console 查看集群设置和变更历史,快速定位配置问题。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 适合查看集群健康度、节点指标、配置变更历史和错误趋势,帮助快速判断异常是配置问题还是系统性问题。
  • INFINI Gateway 适合部署在 Elasticsearch 前面做请求观测、限流和流量治理,减少因配置错误导致的集群不稳定风险。

5. 小结 #

unable to parse [{}={}] as either percentage or bytes 说明配置值既不符合百分比格式,也不符合字节大小格式。修复方法非常明确:确认具体配置项后,将其值改为 Elasticsearch 支持的标准格式(百分比加 %,字节加支持的单位且无空格),即可立即解决问题。

对于自动化部署场景,建议在配置生成环节增加格式校验,从源头避免此类问题的发生。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

}
}
try {
    return new RelativeByteSizeValue(ByteSizeValue.parseBytesSizeValue(value, settingName));
} catch (ElasticsearchParseException e) {
    throw new ElasticsearchParseException("unable to parse [{}={}] as either percentage or bytes", e, settingName, value);
}
}

public String getStringRep() {
    if (ratio != null) {