fluentd 作为开源的数据收集框架。C/Ruby开发,支持使用JSON文件来统一日志数据。可插拔架构,支持各种不同种类和格式的数据源和数据输出。最后它也同时提供了高可靠和很好的扩展性,fluentd 的性能已在许多大型服务中得到检验。实际上,一个普通的 PC 机一次可以处理18,000 条消息/秒。
Treasure Data, Inc 对该产品提供支持和维护。fluent-bit 是一个用 C 写成的插件式、轻量级、多平台开源日志收集工具。它允许从不同的源收集数据并发送到多个目的地。这个两个日志收集组件完全兼容docker 和kubernetes 生态环境。随着 Kubernetes 的强势崛起,业务分布在多个计算节点,日志收集凸显重要,本文主要讲述本人在使用 fluentd 和 fluent-bit 中碰到的问题,以及解决方法。
1、td-agent 和 fluentd 有什么区别?
Fluentd |
td-agent |
|
支持 |
社区驱动 |
Treasure Data提供支持和维护 |
安装 |
Ruby gems |
rpm / deb / dmg 软件包 |
配置 |
自己配置 |
预配置了几个建议设置 |
其它组件 |
$ fluent-gem install fluent-plugin-xx |
$ /usr/sbin/td-agent-gem install fluent-plugin-xx |
/etc/init.d/ 脚本 |
无 |
有 |
内存分配方式 |
系统默认 |
优化(jemalloc) |
2、应该选择 fluentd 还是 td-agent?
td-agent 是基于 fluentd 核心功能开发,td-agent 优先考虑稳定性而不是新功能。如果您希望自己控制Fluentd功能和更新,建议使用 Fluentd gem。如果您是第一次使用 Fluentd 或在生产环境集群环境中使用它,建议使用td-agent。每2或3个月发布一次新版本的td-agent。
3、fluentd 界面在哪里?
不知道是不是我使用存在问题,不论是使用 fluentd 或者 td-agent3 的最新版本,界面的都是无法安装的,记得在使用 ruby gem 安装 fluentd 界面,一直在下载各种插件,最后提示下载失败 。安装 td-agent 时候官方直接说明 td-agent 最新版本界面和后台服务已经分离。
问题来了,分离之后界面如何获取呢?不知道,没有找到文档说明。如果登录 github 上面确实把 ui 分离出来了,但是不知道是不是我本地网络原因,一直没有安装成功。
为了验证界面功能,后来我在文档上找到 2.5 版本的介绍,安装完成后,启动 td-agent-ui 界面是可以正常使用的。
具体参考:
https://docs.fluentd.org/v/0.12/articles/install-by-rpm
# td-agent 2.5 or later. Only CentOS/RHEL 6 and 7 for now.
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.5.sh | sh
# td-agent 2.3 or earlier
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
其实总结起来说呢,界面提供了配置和日志检索界面,没有权限管理概念,囿于程序员本身更是喜欢在 linux vim 下查看日志,暂时放弃界面功能;只把它用作后台日志集中收集功能。
4、fluentd 基于 file 的缓存问题
fluentd 本身支持内存和文件两种缓存方式,但是在使用基于文件的缓存过程中,你会发现一个问题是 tag 标签不能被替换,原因大概是因为,特定日志数据在没有到来之前 缓存 tag 已经生成,但是它不知道用什么名字来替代 tag,所以干脆直接使用 ${tag}, 但是生成之后的文件目录确实是正常的,当然如果你是基于内存,或者把 fluentd 收集完成的日志发送到 ES 等存储中,则没有此类问题。官方也有说明,新版本会有其它的解决方式,但并不完美,具体请参考:
https://docs.fluentd.org/output/file
5、fluentd 启动错误
如果使用 td-agent 的方式进行安装 fluentd,它自身会生成开机自启动脚本,但是日志文件必须是 td-agent 用户,否则的话,启动会出现下面错误
2018-12-06 19:12:05 +0800 [warn]: secondary type should be same with primary one primary=“Fluent::TreasureDataLogOutput” secondary=“Fluent::Plugin::FileOutput”
2018-12-06 19:12:05 +0800 [error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error=“out_file: /var/log/fluent/access.20181206_**.log is not writable”
其实修复也很简单,赋予 td-agent 用户读写权限即可。
chown td-agent:td-agent /var/ -R
或者不使用 td-agent 默认启动脚本,直接使用 td-agent 启动。本身的安装方式非常简单,当然你也可以基于镜像进行启动。
具体可以参考:
https://docs.fluentd.org/installation/install-by-rpm
6、使用 file 作为 output 总是输出到不同文件
大多使用场景,是把多个节点上的日志汇总到一个节点,然后同样的方式生成本地日志文件,但是会发现,每次都新生成一个文件,可能更希望把同类的日志输出到一个文件,按照预想的方式进行分割文件,而不是直接生成,其实 fluentd 指令中有一个叫做 append 的指令,默认是 false ,配置成 true 即可。
具体请参考:
https://docs.fluentd.org/output/file
7、fluentd 和 fluent-bit 的关系
在当今社会日志收集场景和需求多变和出乎意料的,为了满足日志收集的灵活性,我们会根据需求选择不同的插件,比如:ELK常见解决方案,当前我们主要介绍 fluentd 和 fluent-bit 两个开源项目之间的关系。fluentd 和 fluent-bit 都是有 Treasure Data 公司赞助开发,目标是解决日志收集、处理和转发。
这两个项目有很多相似之处,fluent-bit 完全基于 fluentd 体系结构和一般设计的设计和经验。从体系结构的角度来看,选择使用哪个取决于使用场景,我们可以考虑:
fluentd 是日志收集器,处理器和聚合器。
fluent-Bit 是一个日志收集器和处理器(它没有 fluentd 等强大的聚合功能)。
fluentd |
fluent-bit |
|
范围 |
容器/服务器 |
容器/服务器 |
语言 |
C和Ruby |
C |
内存占用 |
约40MB |
约450KB |
性能 |
高性能 |
高性能 |
依赖关系 |
作为Ruby Gem构建,主要依赖gems |
除了一些安装编译插件(GCC、CMAKE)其它零依赖。 |
插件支持 |
超过650个可用插件 |
大约35个可用插件 |
许可证 |
Apache许可证2.0版 |
Apache许可证2.0版 |
根据两个组件不同特点可以考虑将 fluentd 主要用作聚合器,将 fluent-bit 作为日志转发器,两个项目相互补充,从而提供了完整的可靠轻量级日志解决方案。fluent-bit 支持平台如下表所示:
操作系统 |
平台 |
cpu架构 |
Linux |
Centos 7 |
x86_64 |
Debian 8 (Jessie) |
x86_64 |
|
Debian 9 (Stretch) |
x86_64 |
|
Raspbian 8 (Debian Jessie) |
AArch32 |
|
Raspbian 9 (Debian Stretch) |
AArch32 |
|
Ubuntu 16.04 (Xenial Xerus) |
x86_64 |
|
Ubuntu 18.04 (Bionic Beaver) |
x86_64 |
从体系结构支持的角度来看,fluent-bit 在基于 x86,x86_64,AArch32 和 AArch64 的处理器上具有全部功能。Fluent Bit 也可以在OSX 和 * BSD 系统上工作,但并非所有插件在所有平台上都可用。官方支持将根据社区需求而扩大。至于 fluent-bit 的使用之前做过一定总结,这里不再赘述。
可以参考:
K8S集群模式下fluent-bit日志收集方案设计和实践
轻量级日志收集转发 | fluent-bit外部插件详解(三)
轻量级日志收集转发 | fluent-bit配置详解(二)
轻量级日志收集转发 | fluent-bit指令详解(一)
一文了解日志收集工具fluent-bit
面对海量日志,为什么选用fluentd作为核心组件?
fluent-bit 自身具有高性能,占用内存低的特点,用的过程暂时没有发现什么问题,如果非要说问题,大多是自身使用的问题,因为使用 fluent-bit 的用户基本上都是结合 Kubernetes 进行使用的,而 fluent-bit 每次收集日志之所以能记住偏移量,是得益于自身集成的 sqllite 数据库,这个小型数据库切记要挂载到宿主机,否则会出现收集数据重复的问题;如果出现其它问题,烦请查看日志,大多都是犯了低级错误。
推荐:
Kubernetes排障指南
深入探究 K8S ConfigMap 和 Secret
Jenkins 配合 Kubernetes 实现服务持续集成的实践和建议
Kubernetes中如何使用ClusterDNS进行服务发现?
Kubernetes入门培训(内含PPT)
从Ice到Kubernetes容器技术,微服务架构经历了什么?
原创不易,随手关注或者”在看“,诚挚感谢!