特定插件故障排除
编辑特定插件故障排除
编辑Kafka 问题及解决方案
编辑Kafka 会话超时问题(输入)
编辑症状
吞吐量问题和重复事件处理 Logstash 日志警告
[2017-10-18T03:37:59,302][WARN][org.apache.kafka.clients.consumer.internals.ConsumerCoordinator] Auto offset commit failed for group clap_tx1: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member.
后续调用 poll()
之间的时间长于配置的 session.timeout.ms
,这通常意味着轮询循环花费太多时间处理消息。您可以通过增加会话超时或通过使用 max.poll.records
减少 poll()
返回的批次最大大小来解决此问题。
[INFO][org.apache.kafka.clients.consumer.internals.ConsumerCoordinator] Revoking previously assigned partitions [] for group log-ronline-node09 `[2018-01-29T14:54:06,485][INFO]`[org.apache.kafka.clients.consumer.internals.ConsumerCoordinator] Setting newly assigned partitions [elk-pmbr-9] for group log-pmbr
背景
Kafka 跟踪消费者组中的各个消费者(例如,多个 Logstash 实例),并尝试为每个消费者提供主题中正在消费的数据的一个或多个特定分区。为了实现这一点,Kafka 会跟踪消费者(Logstash Kafka 输入线程)在其分配的分区上是否取得进展,并重新分配在设定时间内未取得进展的分区。
当 Logstash 从 Kafka Broker 请求的事件数量超过其在超时时间内能够处理的数量时,它会触发分区的重新分配。分区的重新分配需要时间,并且可能导致事件的重复处理和严重的吞吐量问题。
可能的解决方案
- 减少 Logstash 在一个请求中从 Kafka Broker 轮询的每个请求的记录数;
- 减少 Kafka 输入线程数;和/或
- 增加 Kafka 消费者配置中的相关超时时间。
详细信息
max_poll_records
选项设置在一个请求中要提取的记录数。如果它超过默认值 500,请尝试减少它。
consumer_threads
选项设置输入线程的数量。如果该值超过 logstash.yml
文件中配置的管道工作程序数量,则肯定应该减少它。如果该值大于 4,如果客户端有时间/资源,请尝试将其减少到 4
或更少。尝试从 1
开始,然后逐步递增以找到最佳性能。
session_timeout_ms
选项设置相关超时时间。将其设置为一个值,以确保可以在时间限制内安全地处理 max_poll_records
中的事件数。
EXAMPLE Pipeline throughput is `10k/s` and `max_poll_records` is set to 1k =>. The value must be at least 100ms if `consumer_threads` is set to `1`. If it is set to a higher value `n`, then the minimum session timeout increases proportionally to `n * 100ms`.
实际上,该值必须设置得远高于理论值,因为管线中输出和过滤器的行为遵循分布。该值也应该高于您预期输出停滞的最大时间。默认设置为 10s == 10000ms
。如果您遇到输出因负载或类似影响(例如 Elasticsearch 输出)而定期停滞的问题,则将此值大幅增加到例如 60s
几乎没有什么缺点。
从性能角度来看,降低 max_poll_records
值比增加超时值更可取。如果客户端的问题是由输出定期停滞引起的,则增加超时时间是您唯一的选择。检查日志中是否有输出停滞的证据,例如 ES output logging status 429
。
使用模式注册表时 Kafka 输入插件崩溃
编辑默认情况下,kafka 输入插件会在处理事件之前,在插件注册期间检查连接并验证模式注册表。在某些情况下,此过程在尝试验证已认证的模式注册表时可能会失败,导致插件崩溃。
该插件提供了一个 schema_registry_validation
设置来更改默认行为。此设置允许插件在注册期间跳过验证,这允许插件继续并处理事件。有关插件和其他配置选项的更多信息,请参阅 kafka 输入插件文档。
配置不正确的模式注册表仍会阻止插件处理事件。
auto
的默认设置在大多数情况下是最佳选择,不需要更改。
大量偏移提交(输入)
编辑症状
Logstash 的 Kafka 输入导致向偏移主题提交的次数远高于预期。通常,投诉还提到冗余偏移提交,其中重复提交相同的偏移。
解决方案
对于 Kafka Broker 版本 0.10.2.1 到 1.0.x:此问题是由 Kafka 中的错误引起的。 https://issues.apache.org/jira/browse/KAFKA-6362 客户端最佳选择是将其 Kafka Broker 升级到 1.1 或更高版本。
对于旧版本的 Kafka 或如果上述方法无法完全解决问题:此问题也可能是由于 poll_timeout_ms
的值相对于 Kafka Broker 本身接收事件的速度设置得太低(或者如果 Broker 在接收事件突发之间定期空闲)造成的。在这种情况下,增加 poll_timeout_ms
的设置值会成比例地减少偏移提交的数量。例如,将其提高 10 倍将导致偏移提交减少 10 倍。
Kafka 输入中的编解码器错误(仅限于插件版本 6.3.4 之前)
编辑症状
Logstash Kafka 输入随机记录来自配置的编解码器的错误和/或错误读取事件(部分读取、在多个事件之间混合数据等)。
Log example: [2018-02-05T13:51:25,773][FATAL][logstash.runner ] An unexpected error occurred! {:error=>#<TypeError: can't convert nil into String>, :backtrace=>["org/jruby/RubyArray.java:1892:in `join'", "org/jruby/RubyArray.java:1898:in `join'", "/usr/share/logstash/logstash-core/lib/logstash/util/buftok.rb:87:in `extract'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-codec-line-3.0.8/lib/logstash/codecs/line.rb:38:in `decode'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-input-kafka-5.1.11/lib/logstash/inputs/kafka.rb:241:in `thread_runner'", "file:/usr/share/logstash/vendor/jruby/lib/jruby.jar!/jruby/java/java_ext/java.lang.rb:12:in `each'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-input-kafka-5.1.11/lib/logstash/inputs/kafka.rb:240:in `thread_runner'"]}
背景
在多线程运行时 (consumer_threads
设置为 > 1),Kafka 输入插件处理编解码器实例的方式存在错误。 https://github.com/logstash-plugins/logstash-input-kafka/issues/210
解决方案
- 将 Kafka 输入插件升级到 v. 6.3.4 或更高版本。
- 如果(且仅当)无法升级,请将
consumer_threads
设置为1
。
设置 Kerberos SASL 的调试
编辑您可以设置您的机器来帮助您解决 Kafka 客户端中的身份验证失败。
-
在
config/jvm.options
中,添加-Dsun.security.krb5.debug=true
-
在
config/log4j2.properties
中,添加logger.kafkainput.name = logstash.inputs.kafka logger.kafkainput.level = debug logger.kafkaoutput.name = logstash.outputs.kafka logger.kafkaoutput.level = debug logger.kafka.name = org.apache.kafka logger.kafka.level = debug
Kerberos 的日志条目不会通过 Log4j 发送,而是直接发送到控制台。
Azure 事件中心问题及解决方案
编辑事件中心插件无法连接到存储 Blob(输入)
编辑症状
Azure 事件中心无法连接到 Blob 存储
[2024-01-01T13:13:13,123][ERROR][com.microsoft.azure.eventprocessorhost.AzureStorageCheckpointLeaseManager][azure_eventhub_pipeline][eh_input_plugin] host logstash-a0a00a00-0aa0-0000-aaaa-0a00a0a0aaaa: Failure while creating lease store com.microsoft.azure.storage.StorageException: The client could not finish the operation within specified maximum execution timeout.
插件无法完成注册阶段,因为它无法连接到在插件 storage_connection
设置中配置的 Azure Blob 存储。
背景
只有在配置了 Blob 存储连接设置后,Azure 事件中心插件才能与其他消费者共享消费者组的偏移位置。EventHub 使用 AMQP 协议传输数据,但 Blob 存储使用一个利用 JDK 的 http 客户端 HttpURLConnection
的库。要排除可能与代理设置相关的 HTTP 连接问题,必须提高 JDK 此部分的日志级别。问题是 JDK 使用 Java Util Logging 来满足其内部日志记录需求,这无法使用 Logstash 附带的标准 log4j2.properties
进行配置。
可能的解决方案
- 配置 Logstash 设置以启用 JDK 日志记录。
详细信息
在 Logstash 上启用 JDK 日志记录的步骤
- 创建一个包含 Java Util Logging (JUL) 日志定义的属性文件。
- 配置一个 JVM 属性以告知 JUL 使用此定义文件。
JUL 定义
创建一个可用于定义日志级别、处理程序和记录器的文件。例如,<LS_HOME>/conf/jul.properties
。
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler .level= ALL java.util.logging.FileHandler.pattern = <USER's LOGS FOLDER>/logs/jul_http%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.level=ALL java.util.logging.FileHandler.maxLocks = 100 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level = INFO # or put FINE java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter # defines the logger we are interested in sun.net.www.protocol.http.HttpURLConnection.level = ALL
日志文件将在用户定义的路径中创建 ( |
|
此配置启用 |
|
将日志级别设置为 |
JVM 属性
要告知 JUL 框架所选定义文件,必须评估一个属性 (java.util.logging.config.file
),这就是 Logstash 的 config/jvm.properties
发挥作用的地方。编辑文件并添加属性,指向创建 JUL 定义文件的位置
-Djava.util.logging.config.file=<LS_HOME>/conf/jul.properties
日志可能包含敏感信息(例如凭据),并且可能非常冗长,但应提供关于与 Azure Blob 存储的 HTTP 级别连接问题的提示。
其他问题
编辑即将推出,您可以提供帮助!如果您有需要添加的内容,请
- 在 https://github.com/elastic/logstash/issues 创建一个问题,或
- 使用您提出的更改在 https://github.com/elastic/logstash 创建一个拉取请求。
还可以查看 Logstash 讨论论坛。