软件:ELK+filebeat 7.1.1

问题

不定期更新,记录平时遇到的ELK+filebeat日志系统的坑。


  • 请对logstash和elasticsearch使用集群
    单机部署的就没有命久的,总是启停很麻烦。logstash为多实例,es为集群。尽量保证一台机器部署一个logstash或者es实例。这两个都是吃内存大户。
    如果成本有所不足可以考虑es的热温冷架构。热节点使用ssd提升io,稳冷节点使用普通硬盘即可。

  • filebeat传输logstash启动负载均衡

    #vim filebeat.yml
    output.logstash:
    # The Logstash hosts
    hosts: %logstash_url_list%
    loadbalance: true

    loadbalance为false则会变成类似主备的方式向logstash输送数据。filebeat会自动检测想要传输数据的logstash是否忙,如果忙则传输到另一个logstash实例。

  • filebeat支持使用环境变量,结果环境变量是中文,linux系统编码是GBK,elk系统默认编码utf-8,最后传到es里面全是乱码
    终极解决办法:使用UTF-8编码方式写一个shell脚本。在脚本里面export需要的中文环境变量。然后脚本内部执行filebeat。
    别修改linux系统的编码了,修改完同机其他服务程序崩了。

    #!/bin/bash
    # encoding: utf-8
    export A="哈哈"
    nohup $PWD/filebeat -e -c filebeat.yml &

    如果filebeat的配置文件中使用了{A}这个环境变量,则此时编码正确。

  • 如上,elk+filebeat启动时候最好加上绝对路径启动
    使用ps -ef |grep ***查询elk+filebeat的进程时候,如果使用相对路径启动组件,则结果返回的也是相对路径。对于运维来说比较难管理,只有部署的人自己知道这个组件放在了哪里。

  • 能用shell脚本控制就用脚本控制
    shell脚本不只是说解决中文环境变量问题,可以使用脚本切换使用的jdk版本(logstash和es需要),也可以不用每次手动输入运行指令,也可以运行多个指令完成更为复杂的控制。能用一行命令解决的问题就别重复写多次。

  • 生产环境千万别用如下这个插件

    #cat one-pipeline.conf
    output{
    stdout {
    codec => rubydebug
    }
    }

    测试过不加这个,让我的性能提升了3倍。该语句会输出每条被处理的数据到控制台,会大幅降低logstash处理效率,并且该组件有未知bug导致logstash停止工作(具体在查看logstash日志时候会提示ruby output的未知错误并且提示用户重启logstash)。为了生产环境的稳定,别加入这种用于调试的输出插件。

  • 有logstash和es的jvm调优意识
    es和logstash为java程序,jvm默认1g内存占用,这完全不够用。按照官方建议不要超过32G,不要超过内存的50%。-Xms -Xmx 两个参数设置为相同

  • 请使用索引模板,设置生命周期管理,不然磁盘很容易满
    生命周期管理天然适配热温冷架构,生命周期管理一般与索引模板相结合使用,使用kibana设置索引模板,然后在kibana内就可以可视化自定义生命周期管理策略,并且绑定到索引模板上。
    对于日志系统来说,越久远的日志越无价值。因此使用生命周期管理可以及时删除过期日志数据。
    模板文件规定了分片,副本,字段映射与格式,生命周期,索引别名等配置。对管理es索引很有用,因此请在导入数据之前先规定好索引模板。

  • 如果logstash要处理不同日志格式的数据,建议还是使用pipeline吧
    对于多日志格式的解析,有一种解决办法是在filebeat中对不同的日志格式创建不同的tag,并且在logstash的filter组件中使用if条件判断是哪一种日志格式。这是一种单管道的处理方式,这种方式会导致logstash.conf处理管道配置文件变得繁琐并且可读性极差。万一管道出错停止运行,两种格式都无法解析。
    可以在pipelines.yml中配置多个管道,对于不同格式的日志文件各占据一个管道。唯一需要注意的是每个管道conf文件中的input beat端口需要不同。

    - pipeline.id: template1
    path.config: "%config_pipeline_path%/logstash-template1.conf"
    - pipeline.id: template2
    path.config: "%config_pipeline_path%/logstash-template2.conf"
  • logstash连接达梦数据库的jdbc组件写法,是模仿Oracle的

    input{
    jdbc {
    ...
    jdbc_driver_class => "Java::dm.jdbc.driver.DmDriver" //这里一定要加上Java::,mysql则不用加
    ...
    }
    }

    达梦一点文档没有,这我折腾了好久。。。后来无意中看到达梦是模仿Oracle写的,加上就发现好使了。