这篇博文是系列文章的一部分
简介
在 Uber 等用户将这款速度极快的数据库整合到他们的基础设施中之后,ClickHouse 已成为接收日志的热门后端。所有数据存储都面临的一个常见挑战是如何从各种来源摄取数据。值得庆幸的是,云原生计算基金会 (CNCF) 项目 Fluent Bit 已经为许多后端解决了这一挑战,例如 Amazon。Fluent Bit 是一款超快速、轻量级且高度可扩展的日志和指标处理器及转发器。
在本博客中,我们将逐步介绍如何在 5 分钟内设置 Fluent Bit 以将日志路由到 ClickHouse。在我们的下一篇文章中,我们将展示一个日常可观察性用例,即从 Kubernetes 收集和丰富日志。
环境
- 运行 ClickHouse 和 Calyptia Fluent Bit (创建者提供的 Fluent Bit LTS 版本) 的 Ubuntu 20.04 LTS
- Fluent Bit v1.9.9
对于 ClickHouse,我们建议试用我们的无服务器 ClickHouse Cloud,它提供慷慨的免费试用,足以完成这篇博文。或者,所有说明都应与大于 22.6 的自托管版本兼容。
创建 ClickHouse 数据库和表
我们的第一步是在 ClickHouse 中创建一个数据库,用于存储日志。我们可以通过 clickhouse-client 或通过您的 ClickHouse Cloud 控制台运行以下命令
CREATE DATABASE fluentbit
请注意,JSON 类型目前在 ClickHouse 核心数据库中是实验性的,并且默认情况下在 ClickHouse Cloud 中未启用。如果用户希望在 ClickHouse Cloud 中使用此功能,他们可以在启动服务后打开支持案例。
创建数据库后,我们需要通过实验性标志 allow_experimental_object_type
启用 JSON 对象类型
SET allow_experimental_object_type = 1
设置完成后,我们可以使用提供的结构创建表。这将创建一个字段 log
,其中包含所有 JSON 对象。
CREATE TABLE fluentbit.jsonlogs ( timestamp DateTime, log JSON ) Engine = MergeTree ORDER BY tuple()
创建完成后,我们可以配置 Fluent Bit 发送数据。
在 Ubuntu 上配置 Fluent Bit
以下说明使用开源版本的 Fluent Bit。如果您有兴趣使用具有其他高级功能的 LTS 版本,您可以在 Calyptia 的产品 此处找到更多信息。
为了示例目的,我们发送基本的 Nginx 访问日志,并假设用户正在使用 Ubuntu 系统。对于其他系统,说明可在此处找到
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
这将把 Fluent Bit 安装到 /opt/fluent-bit。如果您需要一些测试 Nginx 访问日志,您可以从此处下载一系列模拟访问日志,并将它们放在 /var/log/access.log
下。
sudo wget -O /var/log/access.log https://gist.githubusercontent.com/agup006/b936d299c11b60283bdaf05a12e334eb/raw/b87905c7ea1e21745dba87233666135ee61d0087/apache-access.log
sudo chmod a+r /var/log/access.log
作为 Fluent Bit 配置的高级介绍,我们指定了一组 输入 (Inputs)、过滤器 (Filters) 和 输出 (Outputs)。在输入端,我们将指定 tail
插件,它将读取访问日志并以众所周知的格式解析。
一旦解析了这些日志,我们将使用 Fluent Bit Nest Filter 将所有字段嵌套在字段 “log” 下,以便 ClickHouse 识别 JSON 对象将存放的字段。
最后但并非最不重要的一点,我们将使用 Fluent Bit 的 HTTP 输出插件,通过一些参数将这些日志路由到 ClickHouse。您可以从 URI 中看到我们正在使用之前创建的数据库和表。
Fluent Bit 配置
注意: 我们还需要指定默认用户的密码,以便 Fluent Bit 使用 HTTP 基本身份验证。对于 ClickHouse Cloud,我们指定端口 8443,并通过 tls on
参数启用 SSL。使用自托管 ClickHouse 的用户如果您的集群不安全,可能需要使用端口 8143。您还需要显式设置 http 的使用,即 tls off
参数。
将以下配置文件附加到 /etc/fluent-bit/fluent-bit.conf
。
[INPUT] name tail path /var/log/access.log read_from_head true parser nginx_access [FILTER] Name nest Match * Operation nest Wildcard * Nest_under log [OUTPUT] name http tls on match * host port 8443 URI /?query=INSERT+INTO+fluentbit.jsonlogs+FORMAT+JSONEachRow format json_stream json_date_key timestamp json_date_format epoch http_user default http_passwd
如果使用 ClickHouse Cloud,您的凭据将在您创建集群时可用,例如:
运行 Fluent Bit,并将日志发送到 ClickHouse,使用以下命令
/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf
在 ClickHouse 中搜索日志
在 ClickHouse 中,我们可以运行以下命令来查看我们的日志是否在运行。如果没有 FORMAT 选项,我们只能看到 JSON 的值。
SET output_format_json_named_tuples_as_objects = 1 SELECT * FROM fluentbit.jsonlogs FORMAT JSONEachRow

现在这些日志在 ClickHouse 中的一个好处是,我们可以运行临时查询进行分析,而无需指定任何模式。使用 DESCRIBE 命令,以及设置 describe_extend_object_types
,我们可以发现 jsonlogs 表中的可用字段。
DESCRIBE TABLE fluentbit.jsonlogs FORMAT Vertical SETTINGS describe_extend_object_types = 1 Row 1: ────── name: timestamp type: DateTime default_type: default_expression: comment: codec_expression: ttl_expression: Row 2: ────── name: log type: Tuple(agent String, code String, host String, method String, path String, referer String, remote String, size String, user String) default_type: default_expression: comment: codec_expression: ttl_expression: 2 rows in set. Elapsed: 0.001 sec.
我们可以运行以下命令来了解返回了多少错误代码 - 请注意我们如何通过其点分隔的 json 路径访问代码字段。
SELECT count(log.code) AS count, log.code AS code FROM fluentbit.jsonlogs GROUP BY log.code ┌─count─┬─code─┐ │ 26 │ 301 │ │ 9 │ 500 │ │ 397 │ 200 │ │ 17 │ 404 │ └───────┴──────┘ 4 rows in set. Elapsed: 0.003 sec.
对于有兴趣可视化这些日志的用户,我们推荐 Grafana 和官方支持的 ClickHouse 插件。更多详细信息可以在 此处找到,并在 之前的帖子末尾提供了一个可视化 JSON 日志的示例。下面我们在 Grafana 的 Logs 视图中显示了上述数据。

注意:确保您的 Grafana 实例可以通过适当的 IP 访问列表规则访问您的 ClickHouse Cloud 服务。
总结
在这篇文章中,我们使用 Fluent Bit 和 JSON 类型将 Nginx 日志加载到 ClickHouse 中。在本系列的下一篇文章中,我们将探讨一个常见的可观察性用例,即收集 Kubernetes 日志。
如果您对最新技术充满热情,并且对开源充满热情,我们目前正在为我们的集成团队招聘,并期待收到您的来信。