
# Logstash写入失败
#### 问题描述
Logstash是一个数据处理管道，负责从来源（如Kafka、文件等）读取数据，进行转换，并将处理后的数据写入目标（如Elasticsearch、OpenSearch）。在Logstash将数据写入Elasticsearch/OpenSearch的过程中，如果遇到各种错误或异常情况，会导致写入操作失败。典型现象包括：
- Logstash日志中出现错误信息（如HTTP状态码 403、429，磁盘空间不足，内存溢出OOM等）。
- Logstash pipeline启动失败。
- 目标集群出现索引冻结、磁盘水满、节点不可用。
这将导致数据无法及时写入，造成数据积压，影响下游业务查询实时性。
#### 问题原因
- 目标集群可能问题：索引状态异常（如冻结或创建失败）；集群资源不足（分片限制、磁盘空间）；认证失败或账户锁定；网络连接中断；节点状态异常（red/yellow）。
- Logstash端可能问题：配置错误（如batch.size过大引发OOM）；磁盘空间不足（/opt/logstash/log满）；资源耗尽（CPU/内存/I/O竞争）；Pipeline启动或健康检查失败。
- 数据源或中间环节问题：上游数据源不稳定（如Kafka异常）；数据格式错误；Filter插件处理失败导致无效输出。
 
#### 解决方法
1. 确认Logstash Pipeline是否启动成功。
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   2. 在左侧导航栏，选择"集群管理 \> Logstash"。
   
   3. 在集群列表，单击目标集群名称，进入集群详情页。
   
   4. 选择"配置中心"页签。
   
   
   在配置中心页面查看Logstash Pipeline的运行状态显示为"运行中"。
   - 是，则执行下一步。
   
   - 否，可能是网络不通。处理方案请参见[场景一：网络不通]。
    
2. 检查Logstash配置文件的运行日志。 在配置中心页面单击"运行日志"，查看日志文件以排查错误信息。重点关注包含elasticsearch、action、pipeline、cluster_block_exception、disk、out的错误信息。
   示例错误信息的排查思路：
   - "retrying failed action with response code: 403 ... index preparing to close. "：索引冻结。处理方案请参见[场景三：索引冻结]。
   
   - "Blocked user \<username\>"：密码错误或账户锁定。处理方案请参见[场景五：密码认证失败/账户锁定]。
   
   - "max retries"或"cluster block"：磁盘水满或索引只读。处理方案请参见[场景四：索引只读（磁盘水满）]。
   
   - "Java Heap space"或"Out of Memory"：Logstash内存不足。处理方案请参见[场景六：Logstash节点内存OOM]。
    
3. 检查目标集群状态，确认是否为目标集群问题。 常用排查命令：
   ```
   GET /_cluster/health?pretty   // 查看集群整体健康状态（Green/Yellow/Red）。
   GET /_cat/indices?v 或 Kibana Stack Monitoring   // 查看目标索引是否存在、状态、健康、磁盘使用率
   GET /_nodes/stats?human&filter_path=**.fs.*   // 查看集群节点的磁盘使用情况
   GET /_cluster/settings   // 可以检查cluster.max_shards_per_node设置
   ```
   
不同场景的解决方案如下：
- **场景一：网络不通**
  配置Logstash集群路由：在Logstash集群添加Elasticsearch集群的内网IP地址或网段，确保Logstash能够成功连接到Elasticsearch集群。
  
- **场景二：分片数满，无法创建新索引**
  将目标集群的cluster.max_shards_per_node参数值增大。
  ![](https://support.huaweicloud.com/trouble-css/public_sys-resources/caution_3.0-zh-cn.png)
  此设置是集群级别的，并且会一直有效，直到被覆盖或清除。请确保新的值在所有节点硬件允许范围内。
  ```
  PUT /_cluster/settings
  {
    "persistent": {
      "cluster.max_shards_per_node": "<新的更大值>"
    }
  }
  ```
  配置成功后，需要等待Logstash重新尝试创建索引。
  
- **场景三：索引冻结**
  删除冻结的索引，Logstash将自动尝试重新创建该索引并继续写入。
  ```
  DELETE /<frozen_index_name>
  ```
  
- **场景四：索引只读（磁盘水满）**
  1. 检查磁盘空间，确认异常节点。 在集群智能运维页面，通过智能诊断，在诊断项"数据节点磁盘使用率检测"中查看磁盘水满的节点。
     
  
  2. 扩容磁盘：增加集群节点的磁盘空间。
  
  3. 清理磁盘： 删除旧快照、过期索引或手动清理文件。
  
  4. 等待磁盘空间释放后，索引状态将恢复为green。
  
  5. 索引不再处于只读状态，等待Logstash继续写入。
   
- **场景五：密码认证失败/账户锁定**
  修改Logstash配置文件中的集群账户和密码，确保Logstash能正常访问安全集群，再重启Logstash配置文件。如果账户已被锁定，需要先联系技术支持解除锁定。
  
- **场景六：Logstash节点内存OOM**
  方法一：扩容Logstash集群。增加Logstash节点数量，分散写入压力，避免单节点OOM。
  方法二：调整Logstash配置文件，修改运行参数，减小"pipeline.batch.size"参数值。降低批量大小可以减少单次写入的数据量，从而降低内存峰值，但可能会增加写入次数，影响吞吐量。
  
 
