Filebeat写ElasticSearch故障排查思路(下)

#作者:程宏斌

接上篇:链接: link

文章目录

  • 三、Filebeat组件排查
    • (一)配置检查
      • [3.1.1 是否启用了有效的输入配置](#3.1.1 是否启用了有效的输入配置)
      • [3.1.2 output输出配置检查](#3.1.2 output输出配置检查)
    • (二)日志检查
      • [3.2.1 是否有报错日志(如connection relastic searchet、timeout、bulkfail、403、429等)?](#3.2.1 是否有报错日志(如connection relastic searchet、timeout、bulkfail、403、429等)?)
      • [3.2.2 filebeat采集状态](#3.2.2 filebeat采集状态)
      • [3.2.3 Harvester状态(每个日志文件的读取状态)](#3.2.3 Harvester状态(每个日志文件的读取状态))
      • [3.2.4 Output(ElasticSearch写入状态)](#3.2.4 Output(ElasticSearch写入状态))
  • 四、ElasticSearch组件排查
    • (一)配置检查
      • [4.1.1 集群健康状态](#4.1.1 集群健康状态)
      • [4.1.2 索引配置(如字段限制、刷新间隔)](#4.1.2 索引配置(如字段限制、刷新间隔))
  • [curl -X GET "localhost:9200/my-index/_settings"](#curl -X GET "localhost:9200/my-index/_settings")
      • [4.1.3 磁盘空间和资源使用](#4.1.3 磁盘空间和资源使用)
      • [4.1.4 安全设置(如用户认证、权限)](#4.1.4 安全设置(如用户认证、权限))
      • [4.1.5 索引模板和映射](#4.1.5 索引模板和映射)
    • (二)日志检查
  • 五、修复建议

三、Filebeat组件排查

(一)配置检查

3.1.1 是否启用了有效的输入配置

filebeat.inputs:

复制代码
  - type: log
    enabled: true
    paths:
      - /var/log/*.log

(1)检查是否 enabled: true。

(2)paths是否正确(是否存在文件、路径通配是否合理)。

3.1.2 output输出配置检查

(1)hosts es地址是否正确,能否连通?

(2)username/password是否有写权限?认证方式是否匹配?

(3)ssl.*是否启用了SSL,证书是否配置完整?

(4)pipeline若配置了Ingest Pipeline,pipeline是否存在且有效?

(5)index索引是否符合命名规范、无冲突?

(6)bulk_max_size是否设置过小导致频繁 flush(默认 50)

(7)并发worker数是否合理?(默认 1)

(二)日志检查

3.2.1 是否有报错日志(如connection relastic searchet、timeout、bulkfail、403、429等)?

3.2.2 filebeat采集状态

复制代码
"filebeat": {
  "events": {
    "added": 2417,
    "done": 2417
  },

added:采集到的事件数

done:已处理完成的事件数

说明filebeat已成功处理这2417条日志。

3.2.3 Harvester状态(每个日志文件的读取状态)

复制代码
"harvester": {
  "files": {
    ...
    "/var/log/dnf.log": {
      "read_offset": 564955,
      "size": 564955,
      "last_event_published_time": "...",
      ...
    }
  },
  "open_files": 6,
  "running": 6,
  "started": 6
}

有6个文件在被采集,且都有read_offset和 last_event_published_time,没有卡死或跳过,说明文件被正常读取和处理。

3.2.4 Output(ElasticSearch写入状态)

复制代码
"output": {
  "type": "ElasticSearch",
  "events": {
    "acked": 2391,
    "total": 2391
  },
  "write": {
    "bytes": 1962961
  }
}

acked = total表示ElasticSearch成功确认写入约2MB数据,若有问题,通常会看到retry、failures数值上升,但这里没有。

整理日志检查项:

四、ElasticSearch组件排查

(一)配置检查

在检查es的配置时,关注以下几个方面:

4.1.1 集群健康状态

复制代码
# curl -X GET "localhost:9200/_cluster/health?pretty"
  • 绿色 (green):所有分片都分配并且副本分片也存在。
  • 黄色 (yellow):所有分片都已分配,但副本分片未分配(可能因为只有一个节点)。
  • 红色 (red):有分片没有分配。
  • 如果集群的状态为red,需要排查分片分配、节点故障或其他问题。

4.1.2 索引配置(如字段限制、刷新间隔)

  1. ElasticSearch的index.mapping.total_fields.limit限制
    如果一个索引的字段数目过多,可能会超过ElasticSearch的默认限制index.mapping.total_fields.limit,从而导致写入失败。可以检查并增加此限制。

  2. 查看当前的限制:

    curl -X GET "localhost:9200/_settings"

如果需要增加字段限制,可以修改ElasticSearch.yml中的配置,或者为特定索引设置更高的字段限制:

复制代码
# curl -X PUT "localhost:9200/my-index/_settings" -H 'Content-Type: application/json' -d '{
  "settings": {
    "index.mapping.total_fields.limit": 2000
  }
}'
  1. ElasticSearch的index.translog.durability配置

    ElasticSearch会使用事务日志(translog)来确保数据一致性。如果index.translog.durability配置不当,可能导致数据丢失或写入失败。通常,默认的translog.durability设置为async,如果遇到写入问题,可以考虑调整此设置。

  2. 查看当前设置:

    curl -X GET "localhost:9200/_settings"

修改设置为async(如果它是request,可能导致每个请求都等待写入确认):

复制代码
# curl -X PUT "localhost:9200/my-index/_settings" -H 'Content-Type: application/json' -d '{
  "settings": {
    "index.translog.durability": "async"
  }
}'
  1. ElasticSearch的index.refresh_interval配置
    如果发现写入操作后,数据无法立即在搜索中显示,可以检查index.refresh_interval。默认情况下,它设置为1秒,如果配置为较长的时间,可能会影响数据的可见性。
    查看当前设置:

curl -X GET "localhost:9200/my-index/_settings"

如果需要调整refresh_interval,可以将其设置为1s:

复制代码
# curl -X PUT "localhost:9200/my-index/_settings" -H 'Content-Type: application/json' -d '{
  "settings": {
    "index.refresh_interval": "1s"
  }
}'

4.1.3 磁盘空间和资源使用

  1. 如果ElasticSearch的磁盘空间不足,集群可能会设置索引为read-only状态,导致无法写入数据。检查磁盘空间并确认是否有足够的空间。

  2. 确认索引是否处于只读状态:

    curl -X GET "localhost:9200/_cat/indices?v"

  3. 如果某个索引处于read_only状态,可以通过以下命令解除只读状态:

    curl -X PUT "localhost:9200/my-index/_settings" -H 'Content-Type: application/json' -d '{

    "settings": {
    "index.blocks.read_only": null
    }
    }'

4.1.4 安全设置(如用户认证、权限)

  1. 如果启用了ElasticSearch的安全功能(如X-Pack或其他认证方式),确保filebeat有正确的权限来写入数据。检查以下配置:

output.es.username 和 output.es.password确保在filebeat配置中使用了正确的用户名和密码。

  1. 检查ElasticSearch用户的角色,确保其有写入权限。如果使用了角色基础访问控制(RBAC),确保filebeat的用户有访问写入的权限。

    output.es:
    hosts: ["http://localhost:9200"]
    username: "elastic"
    password: "password"

4.1.5 索引模板和映射

elsticsearch可能会使用模板来自动创建索引。如果filebeat的日志字段与现有模板不兼容,可能导致写入失败。可以查看ElasticSearch的模板配置,并确保与filebeat的数据结构兼容。

查看索引模板:

复制代码
# curl -X GET "localhost:9200/_template/*?pretty"
如果需要修改模板或重新加载模板,可以使用以下命令:
# curl -X PUT "localhost:9200/_template/filebeat?pretty" -H 'Content-Type: application/json' -d '{
  "template": {
    "mappings": {
      "properties": {
        "message": { "type": "text" },
        "timestamp": { "type": "date" }
      }
    }
  }
}'

(二)日志检查

(1)index read-only/allow delete 磁盘位过高,索引被自动设置为只读

(2)mapper_parsing_exception 索引字段类型冲突

(3)unauthorized/forbidden 权限或认证配置错误

(4)circuit_breaking_exception 内存不足,超过JVM heap限制,写入被中断

(5)too_many_fields_exception 字段数量超过默认限制(默认1000)

(6)rejected execution 写入速率过高,线程池爆满

(7)bulk request failed 批量写入失败(可能是mapping错误或索引问题)

五、修复建议

相关推荐
深蓝易网3 小时前
3C电子企业柔性制造转型:如何通过MES管理系统实现快速换线与弹性生产?
大数据·运维·人工智能·重构·制造
Gss7773 小时前
Nginx 反向代理与负载均衡核心内容总结
运维·nginx·负载均衡
安审若无3 小时前
解决 sqlplus / as sysdba 登录缓慢问题
运维·服务器·数据库
szxinmai主板定制专家3 小时前
ZYNQ 平台下的四声道超声流量计设计与实现
运维·arm开发·人工智能·分布式·fpga开发
小哈里4 小时前
【后端开发】golang部分中间件介绍(任务调度/服务治理/数据库/缓存/服务通信/流量治理)
数据库·缓存·中间件·golang·后端开发
熙客4 小时前
Jenkins:持续集成和持续交付(CI/CD)工具
运维·ci/cd·jenkins
RoboWizard4 小时前
移动固态硬盘插入电脑后提示“需要格式化”或“文件系统损坏”如何修复?
linux·运维·服务器
m0_619731194 小时前
linux配置数据库
linux·运维·数据库
正在努力的小河4 小时前
platform设备驱动实验
linux·运维·服务器