Fluentd入门教程

2017-02-05 by muzi

最近发生了一些不可描述的故事,艰难之中换到了现在的组,主要的工作内容是数据挖掘。也终于有机会学习新的知识:Ruby和Fluentd。本文将总结开源软件Fluentd的入门知识,包括如何安装,配置文件语法,插件简介等内容。Fluentd的官网内容非常详尽,内容的组织也尤其清晰,所以网络上关于Fluentd的文档很少。本文主要用于学习记录,也希望能帮助到英语不好的读者。

Overview

Fluentd是一个完全开源免费的log信息收集软件,支持超过125个系统的log信息收集。其架构图如图1所示。

fluentd

图1. Fluentd架构图

本质上,Fluentd可以分为客户端和服务端两种模块。客户端为安装在被采集系统中的程序,用于读取log文件等信息,并发送到Fluentd的服务端。服务端则是一个收集器。在Fluentd服务端,我们可以进行相应的配置,使其可以对收集到的数据进行过滤和处理,并最终路由到下一跳。下一跳可以是用于存储的数据库,如MongoDB, Amazon S3, 也可以是其他的数据处理平台,比如Hadoop。

Install

由于Fluentd的安装较为麻烦,所以业界流行的稳定安装版本其实是有Treasure Data公司提供的td-agent。本文将介绍的也是td-agent的安装和使用。

官网安装文档介绍了针对不同系统的安装办法。本文介绍“Ubuntu 14.04 LTS / Trusty 64bit/32bit“系统的安装:

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

安装完成之后,可运行以下的命令来启动Fluentd服务:

$ /etc/init.d/td-agent restart

$ /etc/init.d/td-agent status
td-agent (pid  21678) is running...

通过start, stop, restart等命令可以启动、关闭和重启Fluentd服务。此时默认的Fluentd配置文件的目录是/etc/td-agent/td-agent.conf文件。

Post Sample Logs via HTTP

默认情况下,/etc/td-agent/td-agent.conf文件已经对td-agent进行了基本的配置。可以接收通过HTTP Post的数据,并将其路由、写入到/var/log/td-agent/td-agent.log中。

可尝试通过以下curl命令来尝试post数据。

$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

执行之后,可在输出log的最后一行找到我们输入的测试数据。

Syntax of Config

在Fluentd中,配置文件非常重要,它定义了Fluentd应该执行的操作。其语法很简单,详细内容可点击配置语法

打开/etc/td-agent/td-agent.conf文件,可以看到配置文件的具体内容。配置文件中基本会出现的配置分为以下几种:

  • source: 定义输入
  • match:定义输出的目标,如写入文件,或者发送到指定地点。
  • filter:过滤,也即事件处理流水线,可在输入和输出之间运行。
  • system:系统级别的设置。
  • label:定义一组操作,从而实现复用和内部路由。
  • @include:引入其他文件,和Java、python的import类似。

source

Fluentd支持多输入。每一个输入配置必须包含类型/type,比如tcp数据输入,或者http类型输入。type将指定使用的input plugin。以下的示例中就定义了两个输入源,一个是从24224端口进入的tcp数据流,另一个是从9880端口进入的http数据。

# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
<source>
  @type forward
  port 24224
</source>

# http://this.host:9880/myapp.access?json={"event":"data"}
<source>
  @type http
  port 9880
</source>

Source指定的input插件将带有{tag, time,record} 三个属性的事件/event提交给Fluentd的引擎,完成数据的输入。

match

Match配置了数据流的匹配规则和匹配成功后所需执行的动作,和路由表项类似。比如以下的配置中就对匹配myapp.access标签成功的数据包执行file类型动作,将数据写入到路径为/var/log/fluent/access的文件中。

# Match events tagged with "myapp.access" and
# store them to /var/log/fluent/access.%Y-%m-%d
# Of course, you can control how you partition your data
# with the time_slice_format option.
<match myapp.access>
  @type file
  path /var/log/fluent/access
</match>

标准的动作有file和forward等。File表明写入文件,而forward表明转发到下一跳。

Match Pattern的设计与正常的正则匹配没有区别,具体的分类如下:

*: 匹配tag的某一部分,比如 a.* 可以匹配 a.b, a.b.c无法匹配成功。

**: 匹配0个或者多个tag部分。比如 a.** 可以匹配a.b,a.b.c

{X,Y,Z}:匹配X, Y, or Z,或关系。

此外,他们还可以混用,比如a.{b,c,d}.*等等。当标签内,有多个匹配模式时,将支持或逻辑的匹配,即只要匹配成功人一个都执行对应的操作。比如:

<match a b> 匹配ab.
<match a.** b.*> 匹配a, a.b, a.b.c

Logging

Fluentd支持两种类型的logging 配置,一种是全局的,另一种是针对插件的。

  • global
  • Plugin

支持的log的输出级别有如下几种:

  • fatal
  • error
  • warn
  • info
  • debug
  • trace

介绍完Config file的语法之后,我们还需要了解config file配置的对象Fluentd的Plugin/插件。

Plugin

Fluentd有5种类型的插件,分别是:

  • Input:完成输入数据的读取,由source部分配置
  • Parser:解析插件
  • Output:完成输出数据的操作,由match部分配置
  • Formatter:消息格式化的插件,属于filter类型
  • Buffer:缓存插件,用于缓存数据

每一个类型都包含着多种的插件,比如input类型就包含了以下几种插件:

  • in_forward
  • in_http
  • in_tail
  • in_exec
  • in_syslog
  • in_scribe

由于篇幅限制,本文将不会对插件进行展开介绍,读者可以自行阅读官方文档

Route

Route指的是数据在Fluentd中的处理流水线,一般的流程为

  • input -> filter -> output
  • input -> filter -> output with label

即由输入插件获取数据,然后交给filter做处理,然后交给output插件去转发。同时,也支持数据包/事件的重新提交,比如修改tag之后重新路由等等。

  • reroute event by tags
  • reroute event by record content
  • reroute event to other label

Use case

此处将选择一个最简单的使用案例来介绍Fluentd的使用。Fluentd收集Docker的登陆信息案例。

首先创建一个config file, 用于配置Fluentd的行为,可命名为”in_docker.conf“。

<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<match *.*>
  type stdout
</match>

然后保存文件。使用以下命令运行Fluentd。

$ fluentd -c in_docker.conf

若运行成功则可见输出信息如下所示:

$ fluentd -c in_docker.conf
2015-09-01 15:07:12 -0600 [info]: reading config file path="in_docker.conf"
2015-09-01 15:07:12 -0600 [info]: starting fluentd-0.12.15
2015-09-01 15:07:12 -0600 [info]: gem 'fluent-plugin-mongo' version '0.7.10'
2015-09-01 15:07:12 -0600 [info]: gem 'fluentd' version '0.12.15'
2015-09-01 15:07:12 -0600 [info]: adding match pattern="*.*" type="stdout"
2015-09-01 15:07:12 -0600 [info]: adding source type="forward"
2015-09-01 15:07:12 -0600 [info]: using configuration file: <ROOT>
  <source>
    @type forward
    port 24224
    bind 0.0.0.0
  </source>
  <match docker.*>
    @type stdout
  </match>
</ROOT>
2015-09-01 15:07:12 -0600 [info]: listening fluent socket on 0.0.0.0:24224

然后启动docker containner。如果之前没有安装过docker engine,请读者自行安装。由于docker 本身支持Fluentd收集信息,所以可以通过启动命令来启动Fluentd的client/客户端。

$ docker run --log-driver=fluentd ubuntu echo "Hello Fluentd!"
Hello Fluentd!

以上命令中的ubuntu为一个镜像,如果本地没有,docker engine会自动下载,并在此镜像上创建容器。启动容器后,查看默认的输出信息文件:/var/log/td-agent/td-agent.log,可在最后一行查看到输出的信息。

总结

Fluentd是一个优秀的log信息收集的开源免费软件,目前以支持超过125种系统的log信息获取。Fluentd结合其他数据处理平台的使用,可以搭建大数据收集和处理平台,搭建商业化的解决方案。


探索西部世界:从2016走到2017

2017-01-06 by muzi

一转眼,来硅谷实习已经快半年了。半年来,都在不停地探索西部世界,但是除了优胜美地国家公园还不错以外,其他的都没有感觉太兴奋。。也许是因为我是一个岛民吧,对加州的阳光,沙滩,大海没有特别兴奋。

终于等到圣诞节,公司shut down10天之久,不出去转一圈就太浪费时光了。所以在放假之前,就招齐了人马,做好了计划,万事具备,只欠放假。我们甚至还要拍一个视频。作为一个梦想当导演的码农,终于找到机会好好实践一把,分镜本写起来。

分镜本
分镜本

每一次我们都租车自驾旅行,因为在美国租车实在是太便宜了!

从San Jose往南开,一路从阳光绿地,开到雪地,再到荒漠处,8小时后,终于到达第一个住处。路上还撞了一次车,还好只是轻轻亲了一下前车,没大碍就继续前行了。

加油站
你站在车边看风景,看风景的人在高处看你,夕阳装饰了你的眼睛,你装饰了别人的梦

雪地行车
开,往城市边缘开,你就会看到雪地

第一个住处是一间沙漠里的小房子。虽然房子在沙漠里,但是竟然有热水!有网络!还有暖气!再一次感叹美帝农村的发达。

旅行第一站是Joshua ...

read more

Solution: can not receive notification of OpenStack

2016-12-21 by muzi

If you set up a AMQP connection to listen to Rabbit message queue, and can not receive any notification when connection is correct. Stucking queue may be the reason of this problem. As I proposed in ask.openstack.org, you can purge the queue to clear all the message in ...

read more

Listen to OpenStack Notification

2016-09-30 by muzi

在许多应用场景下,需要监听OpenStack的消息来做一些操作,从而实现事件驱动/消息驱动的业务。本文将介绍如何使用kombu库来监听OpenStack的消息,包括neutron,nova等相关类型的notification。

Kombu, AMQP, RabbitMQ

Kombu是Python的消息库,封装来许多消息的报文,支持包括AMQP等多种消息协议。而在OpenStack端,Notification的发布系统由RabbitMQ实现。为了监听OpenStack发出的Notification, 我们需要在本地用Kombu库建立一个connection, 连接到OpenStack的消息发布系统。

Terminology

在学习过程中,会遇到Exchange, Queue等术语,此处将简要介绍这些概念:

  • Producers

    消息生产者,产生消息,并发送到交换器。

  • Exchanges

    消息交换器,接受生产者发送过来的消息,根据对应的routing_key,来将消息路由到对应的队列。

  • Queues

    队列接收来自交换器发来的消息,队列由消费者定义,自然也为消费者使用,用于存储消息。

  • Consumers

    消费者从队列中读取消息,并进行处理。消费者声明和定义队列,并将队列绑定到对应的exchange上。

  • Routing ...

read more

在barefoot拜访Nick McKeown教授

2016-09-13 by muzi

自学习SDN以来已经三年多了。虽然依然是没有实际的商业产品开发经验,学术水平也是渣渣,但是多少掌握了一些基础知识,学会了一些技术。在学习SDN的过程中,不得不提的就是Nick McKeown教授,他发表过很多著名的论文,比如OpenFlow、Mininet、P4的论文等。他也创建了ONF和ONRC等组织,推动SDN开源的发展,可谓是SDN届的领头羊,大师。所以作为一个学习SDN的学生,自然十分敬仰。

很幸运地得到了CIIP一年的实习机会,可以在思科美国总部实习一年,终于有机会在硅谷探索一翻,自然不能放过那些在书中和新闻里报道的地点和人物。在游览了斯坦福,berkeley等名校之后,就开始里知名创业公司和大师的拜访之旅。

很高兴自己的博客被barefoot的ron前辈看到,然后我们就建立了联系。刚好他也回到里硅谷,微信一约就决定了时间去参观barefoot和拜访Nick教授,顺便一起吃个饭,聊一聊技术。

一大早特别开心,直接就不去上班,uber过去拜访。手机号刚过期,在没有手机的情况下,利用xfinity的Wi-Fi让司机成功找到了我,太感谢xfinity和uber。

终于来到了位于PALO ALTO的barefoot,它就在斯坦福校园边上。和ron前辈碰头之后,他就领着去见了偶像Nick教授。

打开Nick教授的办公室门就看到了他,没想到他这么年轻,这么和善。没有那种官僚气息,更多的是一种工程师的感觉。见到偶像简直太开心了。我很高兴地自我介绍 ...

read more