使用Flume Log4j Appender正确的姿势

使用Flume Log4j Appender正确的姿势

我们使用Flume-ng的LoadBalancingLog4jAppender,将线上服务的日志实时传输到日志服务器,转交给告警系统和HDFS做存储。
FLume的Log4j Appender必须使用Log4j的异步加载器,否则一旦日志服务器挂掉,将会导致应用服务器宕机。

使用过程中的坑

问题1: Flume Log4j使用异步加载器,日志服务器宕机情况导致业务系统阻塞

在阅读了Flume的RPC源码以及LoadBalancingLog4jAppender的实现之后,发现问题原来在Log4j的异步加载器AsyncAppender。异步加载器的原理见这里
根本原因是、日志服务器宕机导致消费者消费能力不足,缓冲区满的情况下,AsyncAppender会阻塞程序。设置Blocking=false之后就可以了。

问题2:Flume Log4j失败重连策略异常

当其中一台日志服务器宕机,其他的日志服务器就会不停的接收到链接异常的日志。明显是重连的时间间隔太短。在LoadBalancingRpcClient中,

    while (it.hasNext()) {
      HostInfo host = it.next();
      try {
        RpcClient client = getClient(host);
        client.append(event);
        eventSent = true;
        break;
      } catch (Exception ex) {
        selector.informFailure(host); //宕机情况标志该主机异常
        LOGGER.warn("Failed to send event to host " + host, ex);
      }
    }

Flume默认不启用back off,也就是说selector.informFailure(host)这行代码完全没用。简直坑爹。OrderSelector.java:

  public void informFailure(T failedObject) {
    //If there is no backoff this method is a no-op.
    if (!shouldBackOff) {
      return;
    }
    //将该主机暂时移除可用主机列表
    ...

所以解决办法:配置max back off

问题3:Flume Log4j失败重连策略异常

问题体现在,设置了max back off,重连时间居然一直是2000ms,看了一下它的算法,指数退避算法。在OrderSelector.java的informFailure函数中。

  public void informFailure(T failedObject) {
    //If there is no backoff this method is a no-op.
    if (!shouldBackOff) {
      return;
    }
    FailureState state = stateMap.get(failedObject);
    long now = System.currentTimeMillis();
    long delta = now - state.lastFail;
    long lastBackoffLength = Math.min(maxTimeout, 1000 * (1 << state.sequentialFails));
    long allowableDiff = lastBackoffLength + CONSIDER_SEQUENTIAL_RANGE;
    if (allowableDiff > delta) {
      if (state.sequentialFails < EXP_BACKOFF_COUNTER_LIMIT) {
        state.sequentialFails++;
      }
    } else {
      state.sequentialFails = 1;
    }
    state.lastFail = now;
    //Depending on the number of sequential failures this component had, delay
    //its restore time. Each time it fails, delay the restore by 1000 ms,
    //until the maxTimeOut is reached.
    state.restoreTime = now + Math.min(maxTimeout, 1000 * (1 << state.sequentialFails));
  }

最后生成的restoreTime即下一次进行重试的时间。我没有去设置avro connect time out 和request time out,默认都是20s,应该算是偏长了。根据他的算法,delta永远是大于40s,但是allowableDiff却一直是3s,4s.所以我直接改了判定条件,allowableDiff < delta,之后就正常。但是还存在一个问题,sequentialFails并不会在一段时间后reset.

问题4:Log4j异步加载器丢失日志数据

AsyncAppender默认缓冲区大小128,满了之后会丢失数据。调大缓冲区,avro connect time out 和request time out也得适当调一下

另外,由于我们的告警系统接收的告警日志必须是时间顺序的,所以我写了个FlumeFailoverAppender了

https://github.com/EdwardsBean/FlumeFailoverLog4jAppender

本博客已迁移至:http://edwardsbean.github.io

时间: 2024-08-26 03:39:09

使用Flume Log4j Appender正确的姿势的相关文章

修改Flume Log4j Appender

自定义Log4j Appender 要修改Flume Log4j Appender的实现,我们先了解一下Log4j Appender是如何自定义的. 自定义log4j appender需要继承log4j公共的基类:AppenderSkeleton 打印日志核心方法:abstract protected void append(LoggingEvent event); 初始化加载资源:public void activateOptions(),默认实现为空 释放资源:public void clo

预告:微软漏洞贡献榜中国第一人黄正——如何用正确的姿势挖掘浏览器漏洞|硬创公开课

       浏览器就像一扇窗,通过这扇窗,黑客可以攻入电脑的心脏. 就像情场高手,通过眼睛,融化一个人的心灵. 黄正,百度安全实验室 X-Team 掌门人.2016年,这个信仰"技术可以改变世界"的低调黑客大牛以一己之力挖掘无数浏览器漏洞,创下了排名微软 MSRC 2016 年度黑客贡献榜中国区第一(世界第八)的壮举. 从一个安全开发工程师华丽转身,成为安全研究员,黄正最终站在了中国浏览器漏洞挖掘的顶峰.本期硬创公开课,我们将会请到黄正为雷锋网(公众号:雷锋网)宅客频道的读者童鞋们奉

日志服务接入方式之loghub log4j appender

Loghub Log4j Appender介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输

如何以“正确的姿势”阅读开源软件代码

之前想过写这篇文章,但是没有想到一个好的内容.好的突破点.在<GitHub 漫游指南>指南里,我们提到过<如何在GitHub"寻找灵感(fork)">,但是并不是关于阅读源码的好文章. 我们并不建议所有的读者都直接看最新的代码,正确的姿势应该是: clone某个项目的代码到本地 查看这个项目的release列表 找到一个看得懂的release版本,如1.0或者更早的版本 读懂上一个版本的代码 向后阅读大版本的源码 读最新的源码 最好的在这个过程中,可以自己造轮子

MongoDB Driver:使用正确的姿势连接复制集

MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复制集时你需要知道的 MongoDB复制集里Primary节点是不固定的,当遇到复制集轮转升级.Primary宕机.网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换. 总而言之,MongoDB复制集里Primary节点是不固

三张图读懂Greenplum在企业的正确使用姿势

背景 很多使用数据仓库的朋友可能都有过这样的困惑,为什么数据仓库的资源经常会出现不可控,或者抢用的情况,严重的甚至影响正常的作业任务,导致不能按时输出报表或者分析结果. 这里的原因较多,最主要的原因可能还是使用姿势不对,MPP是用极资源的产品,一伙人在抢资源当然跑不好.你想想一个跑道能让多架飞机同时起飞或降落吗? 第一张 老外通常如何使用数据仓库 数据仓库的使用人员通常是数据分析师,一个成熟的分析模型的建立,可能需要多次的数据模型分析试错. 通常试错不会允许直接在任务库中执行,因为很容易干扰任务

易维帮助台:论工业产品售后服务升级转型的正确打开姿势

工业4.0自提出以来就引发产业的求变热潮.在"适者生,变者强"的新生态环境中,摸索一条行之有效的数字化转型路径以适应未来公司形态的业务服务需求,已经是一个很急迫的问题.且看中国变频器最大生产供应商,如何通过易维帮助台实现其售后服务的华丽转型. 浙江海利普电子科技,集研.产.销为一体的国家级高新制造技术企业,中国最大的变频器生产供应商,其产品广泛应用于纺织.石油化工.环保等多个行业,国内就有9大服务中心和38个服务网点."400电话报修不便;传真分派工单响应慢,管理难,售后服务

键盘鼠标正确使用姿势

我在大学的时后﹐曾经有一位审计学老师印象让我很深刻. 她非常的年轻﹐漂亮﹐而且又很有才华. 我常常在课堂上想如果她在企业界的话﹐那真的不得了. 然而有一天﹐她告诉我们一个故事. 她花了整整一堂课的时间﹐来恳求我们打字千万要注意姿势. 她说五年前她曾被升为某会计师事务所最年轻的经理. 没想到突然有一天晚上﹐当她在打查核报告时﹐她的左手开始 无法控制的发抖.她本来还想打完﹐确没想到越来越严重. 医生说她得了RSI﹐且在短期内恐怕无法康复. 医生也说她未来将无法再从事需要计算机或电子计算器操作的工作﹐

SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势

作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构.设计.开发经验.著有<SQL优化最佳实践>一书.   一.提示(Hint)概述   1为什么引入Hint?  Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段.那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担.   但有时