Logstash数据写入问题排查方案

在使用阿里云Logstash将数据写入阿里云Elasticsearch(output指定为阿里云Elasticsearch)时,您可能会遇到网络不通、管道配置错误、负载高、管道正常启动但无数据写入目标端以及服务正常但缺少数据等问题,此时您可以参考本文的排查方案进行排查解决。

网络不通

排查方案

常见错误案例

建议解决方案

分别检查Logstash是否与源端和目标端服务在同一网络下。

说明

阿里云Logstash和阿里云Elasticsearch服务部署在专有网络环境下,建议您将业务部署在相同的专有网络下。

源端服务在公网环境下,而Logstash在专有网络环境下。

选择以下任意一种方式处理:

  • 借助网络产品功能,打通网络环境。

  • 参见配置NAT公网数据传输,配置NAT网关实现公网数据传输。

  • 重新购买同一专有网络下的Logstash和Elasticsearch实例,并重新配置管道。

检查NAT配置是否错误。

  • NAT条目地址或端口定义错误。

  • NAT网关类型不符合场景。

根据具体情况,按照以下方式处理:

  • 检查NAT条目地址和端口,确保网络互通。

  • SNAT和DNAT使用场景不一样,结合业务场景选择正确的网关转换方式:

    • SNAT:Logstash主动访问公网。

    • DNAT:公网服务向Logstash节点推送数据。

检查是否上传了正确的JDBC驱动插件。

PolarDB数据同步场景中,使用高版本的JDBC驱动,日志无报错,但数据写不到目标端,换成低版本后正常。

选择正确版本的JDBC驱动,详细信息请参见配置扩展文件

检查白名单或安全组是否有限制。

通过Filebeat将数据采集到Logstash中处理,Filebeat部署在用户侧ECS上,但ECS未在安全组开放监听端口。

根据具体情况,按照以下方式处理:

  • 在对应服务的白名单中,加入Logstash节点的IP地址。

    说明

    获取Logstash的IP地址的具体操作,请参见查看实例的基本信息

  • 在安全组中开启服务监听端口,具体操作请参见添加安全组规则

检查Logstash管道配置的源端或目标端是否涉及到RAM用户未授权,导致RAM用户无法访问对应服务。

  • Logstash的output配置中指定了RAM用户访问Elasticsearch ,但Elasticsearch上未对RAM用户设置索引权限。

  • Logstash主日志报错401。

根据具体情况,按照以下方式处理:

  • 为RAM用户授予对应的权限,具体操作请参见为RAM用户授权

  • 源端和目标端的用户名和密码使用正确,并且密码中不能包含特殊字符。如果密码中包含特殊字符,请修改源端或目标端的密码,请参见重置实例访问密码

管道配置错误

排查方案

常见错误案例

建议解决方案

参见查询日志,查看Logstash的主日志,检查日志是否存在报错。

未安装插件。例如日志中出现Couldn't find any output plugin named 'file_extend'错误提示时,说明集群中没有安装logstash-output-file_extend插件。

选择以下任意一种方式处理:

  • 安装插件。

  • 在管道配置中,删除该插件的配置信息。

配置中存在隐藏的特殊字符。

手动输入配置。

filter过滤代码有误,例如ruby代码存在错误。

选择以下任意一种方式处理:

  • 将filter模块配置精简到原始配置,逐步增加过滤配置,找到根因。并根据实际情况处理。

  • 借助第三方调试工具,调试正确后再上线。

管道参数名或参数值写入错误。例如logstash-output-elasticsearch插件中的hosts写成了host、RDS实例名称不正确等。

参见Logstash官方文档阿里云Elasticseatch官方最佳实践文档编写管道配置。

Logstash和源端或目标端连接超时。例如无法访问Elasticsearch时,会出现Elasticsearch Unreachable: [http://xxxx:9200/][Manticore::ConnectTimeout] connect timed out的错误提示。

确保Logstash和Elasticsearch网络互通,并输入正确的源端和目标端地址。

Elasticsearch开启了HTTPS协议,但Logstash管道配置时使用了http

修改管道配置,使用与源端和目标端相同的访问协议。

负载问题

排查方案

常见错误案例

建议解决方案

参见集群监控章节,检查节点磁盘使用率是否过高。

  • 在管道配置中,指定队列类型为永久型(PERSISTED),数据会永久存储在磁盘上,随着数据的积累,导致磁盘被打满。

  • 管道output配置中指定了stdout{}

根据具体情况,按照以下方式处理:

  • 将Logstash管道队列类型指定为默认的内存型(MEMORY),详细信息请参见通过配置文件管理管道

    重要

    由于阿里云Logstash暂时没有清理磁盘的入口,因此当您遇到磁盘打满的问题时,需要技术人员在后端为您处理。

  • 删除管道output配置中的stdout{}

    重要

    管道output配置不支持定义stdout{},否则会导致磁盘使用率过高的问题。

参见集群监控章节,检查节点内存是否溢出OOM(Out Of Memory)。

内存OOM,节点未拉起。

在控制台重启对应节点。

检查源端或目标端是否存在负载问题。

Elasticsearch集群不健康,影响写入。

暂停写入,优先恢复集群健康,建议扩容。

管道正常启动,但无数据写入目标端

排查方案

常见错误案例

建议解决方案

参见使用Logstash管道配置调试功能,开启Logsatsh的管道配置调试功能(需要安装logstash-output-file_extend插件),查看调试日志,判断是否有数据流入Logstash服务:

  • 无数据流入Logstash:检查源端配置信息是否正确。

  • 有数据流入Logstash:检查目标端配置信息是否正确。

无数据流入Logstash:

  • 源端配置信息中存在阿里云AccessKey信息,但AccessKey信息已经失效。

  • 源端无实时数据产生,例如Filebeat实时采集文件数据,文件无新数据产生。

根据具体情况,选择以下方式处理:

  • 检查配置信息,并修改不准确的信息。

  • 如果Logstash使用了实时流插件,需要确保源端存在实时写入的数据。

有数据流入Logstash:

  • 阿里云Elasticsearch实例未开启自动创建索引功能。

  • 目标端禁止写入,例如Elasticsearch索引禁止写入。

根据具体情况,选择以下方式处理:

  • 开启阿里云Elasticsearch实例的自动创建索引功能。

  • 确保目标端的可写性。

服务正常缺少数据

排查方案

常见错误案例

建议解决方案

根据管道配置场景,结合管道插件属性排查:

  • 检查JDBC查询语句是否正确。

  • 检查管道配置中的logstash-input-elasticsearch插件是否存在实时写入的数据。

JDBC场景:

  • 通过查询语句查询的结果中缺少数据。

  • 追踪字段为非递增数据,例如时间字段或ID。

  • JDBC和Elasticsearch集群不在同一时区。

根据具体情况,选择以下方式处理:

  • 在源端调试查询语句。

  • 检查追踪字段类型是否为官方建议字段类型,优先将字段类型设置为numerictimestamp

  • 检查时区差异性,并根据检查结果进行相应处理。

使用logstash-input-elasticsearch插件场景:

  • 源端数据存在实时写入。

  • 管道配置中,定时时间设置较小,数据存在大量的写入,导致目标端数据堆积。

Logstash不适用于数据实时同步场景。如果源端存在实时写入,建议通过拉长定时查询时间,减少频繁在源端和目标端查询和写入。

参见查询日志,查看Logstash慢日志,检查是否存在写入慢的问题。

源端和目标端压力均未达到瓶颈,但Logstash的管道工作线程数使用了官方的默认值。

增加Logstash的管道批大小和工作线程数,详细信息请参见通过配置文件管理管道