传统的日志查看方式
使用fluentd之后
Fluentd是一个开源的数据收集器,可以统一对数据收集和消费,以便更好地使用和理解数据。
几大特色:
使用JSON统一记录
简单灵活可插拔架构
最小的资源需求
内置可靠性
1. JSON统一记录Fluentd尽可能地将数据结构转化为JSON格式,这样可以使Fluentd统一处理日志数据的各个方面:收集,过滤,缓冲和输出多个源和目的地(Unified Logging Layer)的日志。JSON格式对于下游数据处理容易得多,因为它具有足够的结构可访问,同时保留灵活的模式。(在我们的日志集群架构中,fluentd担任了一个转发者角色。)
2. 可插拔架构Fluentd有一个灵活的插件系统,允许社区扩展其功能。社区提供了500多个的插件连接数十个data sources 和 data outputs,利用这些插件,我们可以更好的处理日志消息流。
3. 最小的资源需求Fluentd是用C语言和Ruby语言编写的,需要很少的系统资源。一个运行实例 使用30-40MB的内存,可以处理13,000个事件/秒/核心。Fluentd以Ruby编写,具有灵活性,性能敏感部分用C编写。(另外Fluentd还有一个mini版本叫Fluent Bit io。程序只有几十kb的大小,由于暂不支持输出消息到kafka。所以暂未考虑使用。)
4. 内置可靠性Fluentd支持基于内存和文件的缓冲(推荐配置文件中可添加buffer选项为file/production、memory/test),以防止节点间数据丢失。Fluentd还支持强大的故障切换功能(standby),可以设置高可用性。
二、插件介绍Fluentd有6种类型的插件:input,Parser,Filter,Output,Formatter和Buffer。
1. Input Plugins概述:Fluentd从外部来源检索和拉取日志事件,input 插件通常会创建一个线程socket和一个监听socket,它也可以从被定期写入的数据源中提取数据(如tail file_name)。
支持的input插件列表:
概述:输出插件又可分为三种类型:非缓冲、缓冲和时间切片(time sliced)
Non-Buffered 输出插件不会缓冲数据并立即写出结果
Buffered 输出插件维护一个队列(一个chunk是一个事件的集合),并且它的行为可以通过“chunk limit” 和 “queue limit”参数进行调整
Time Sliced 输出插件实际上是一种Bufferred插件,但是这些块是按时间键入的
输出插件的缓冲区行为(如果有),可以由一个单独的缓冲区插件定义。即为每个输出插件可以选择不同的缓冲区插件。有一些输出插件是完全定制的,不要使用缓冲区。
Non-Buffered 输出插件列表
Buffered 输出插件列表
out_exec_filter out_forward out_mongo or out_mongo_replsetTime Sliced 输出插件列表(我们用到了kafka)
out_splunk out_file out_forward out_secure_forward out_exec out_exec_filter out_copy out_geoip out_roundrobin out_stdout out_null out_s3 out_splunk out_kafka out_mongo out_mongo_replset out_relabel out_rewrite_tag_filter out_webhdfs 3. Buffer Plugins概述:Buffer plugins 被缓冲输出插件使用,如 out_file, out_forward等等。用户可以选择最适合系统架构性能和可靠性需求的缓冲区插件。
Buffer 结构
如上面所示,当顶部块超过指定的大小或时间限制时(分别为buffer_chunk_limit 和 flush_interval),一个新的空块将被推到队列的顶部。当新的块被推出时,底部块被立即写出。
如果底部的块未能写出,它将保留在队列中,并且Fluentd将在等待几秒钟后重试(等待时间,根据retry_wait参数设置)。如果重试限制尚未禁用(disable_retry_limit is false),并且重试次数超过指定的限制(retry_limit),这个块将被删除。每次重试等待时间加倍(1.0秒, 2.0秒, 4.0秒, …),直到达到max_retry_wait。如果队列长度超过指定的限制(buffer_queue_limit),则新事件将被拒绝。