">必赢国际437437.com_必赢国际437在线游戏_437必赢国际网站

您现在的位置:必赢国际437437.com_必赢国际437在线游戏_437必赢国际网站 > 试题库 > 历年真题 >  > 正文

笔者先后使用logstash

2018-10-16 22:13http://www.baidu.com四川成人高考网

  公司项目需要将分布在多台机器中的日志统一收集管理。笔者先后使用logstash,flume等开源项目。并最终自研一套基于Java语言的日志收集系统 Bloodhound。以下从项目关注的角度对开源系统与自研进行分析。

  Logstash 和 Flume 都是很成熟的日志收集平台,结构清晰,插件丰富,文档简明易懂,示例代码非常多。其中Logstash 侧重对字段的预处理,Flume 侧重不同的网络拓扑中日志的传递,通过Agent打通各个网络结点。

  公司的开发团队主要集中在 Java,Python。而 Logstash 的插件使用 Ruby,从团队角度,不太具备扩展性。在使用 logstash 增加一个插件比较痛苦,同时几个月使用下来,感觉性能偏低,启动时较慢。必赢国际437在线游戏

  Flume 每个 Agent 分为 source,channel,sink 等插件。每个插件都只启用单线程处理。如果任务是写数据库等 IO 操作,性能必然会被拖累。

  Source 线程在检测有新的更新,会一直读取推向 Channel,当所有的更新处理完毕,线程会退出。启动一个 Timer 线秒重新启动,如此反复。在这个过程中,没有充分利用 Java 的多线程通知机制,每次启动都有一些调度,排队,检测及任务初始化过程。影响性能。

  Flume 本身已对事各进行了优化,允许批量提交事件。但本质上还是需要检测Sink的处理结果,再进行 Commit 或 Roolback。

  如果将一个 agent 的任务处理串,source->

  channel->

  sink 理解为一个任务(这个任务是个抽象的概念,Flume 里并没有这个概念),那么 Flume 从业务脚度上看,就是单任务收集系统。如果需要同时处理两个任务,必须开启两个 Flume Agent 进程。随着收集任务的增加,必然会大大增加管理成本。

  此外,我们还有监控需求,统计需求,任务管理等。这些任务需要和我们的 grafana 平台打通。综合考虑下,我们选择自研日志收集系统。

  “嗅觉最灵敏的猎犬,寓意是能从包括流量在内的各种粗糙的原始数据中提炼中初步有价值的信息。”

  为了充分利用Flume的功能特性,我们也将Bloodhound拆分层source->

  channel->

  sink三个层次。这个设计是为了充分利用Flume中的丰富插件资源,请参照以下配置文件。

  source为数据输入,通常为文件,消息系统等。示例中的Source为Redis,Source为单独运行的线程,从Redis中指定的队列中获取输入,读取完成后则推向 Channel。当 Channel 中队列已满时,则 source 线程则进入等待。

  管理一个线程池,调度 Sink 任务。由于 Sink 通常较慢,因此整个核心模块中,只有 Sink 为多线程处理,其余均为单线程执行。

  控制QPS,可以使用令牌或漏斗,主要目的是保护高并发写入的环境下,Sink 对应的数据库或 Redis。不至于压力过大,影响正常业务请求。

  任务注册接口:可通过任务注册接口向整个进程提交一个任务,如配置所示,任务注册接口是通过一个 http post 方法提供注册并启动一个新的任务。

  数据提交接口:默认情况下,Source 是 pull 模式,从文件中,队列中拉取日志。同时也支持 http 方式提交。数据提交接口需要传递两个参数,jobName 和 events 。

  查看任务执行情况:在grafana中查看各个任务执行情况,这个数据由核心框架层提供。

  调度器:根据各个业务情况,使用调度任务对任务进行管理。调用任务管理中的任务启动,停止等。这一块和日志收集核心不太相关,就不再赘述。

  笔者从事过多个项目需要使用日志收集,同时也使用了 logstash, flume 等开源系统,总体感觉开源系统比较成熟,有大量插件,事务管理。但和自已业务系统结合不够紧密。自研框架工作量较大,也会有很多坑,优势是较好的和业务接轨。