Loghouse 0.3-我们期待已久的Kubernetes日志系统更新

Flant有许多开源开发项目,主要是针对Kubernetes开发的,而loghouse是最受欢迎的之一。这是我们两年前推出的 K8s中央记录工具



正如我们在最近有关日志的文章中提到的那样,它需要改进,并且其相关性只是随着时间的推移而增长。今天,我们很高兴推出一个新版本的loghouse- v0.3.0有关她的详细资料-删减了。

缺点


一直以来,我们一直在许多Kubernetes集群中使用日志仓库,总的来说,此解决方案适合我们自己以及我们也提供访问权限的各种客户端。

它的主要优点是其简单直观的界面,执行SQL查询的能力,将数据插入数据库时​​良好的压缩和较低的资源消耗以及存储期间的低开销。作业期间日志库中

最痛苦的问题

  • 使用由合并表连接的分区表;
  • 缺乏可以消除日志突发的缓冲区;
  • 过时且可能易受攻击的Web面板gem
  • 流利的过时的(loghouse流利的:由于有问题的宝石集,最新的没有开始)。

另外,在GitHub上已经积累了很多问题,我也想解决。

日志库0.3.0的重大更改


实际上,我们已经积累了足够的更改,但是我们将重点介绍最重要的更改。它们可以分为3个主要组:

  • 改善日志存储和数据库架构;
  • 改进日志收集;
  • 监视的外观。

1.日志存储和数据库设计方面的改进


关键创新:

  • 日志存储方案已更改,可以转换为使用单个表,并且已拒绝分区表
  • 最新版本的ClickHouse中内置基本清理机制已开始应用
  • 现在,即使在群集模式下,您也可以使用外部ClickHouse安装

在实际项目中 比较新旧方案性能这是在流行的在线资源dtf.ru的应用程序日志中搜索唯一URL的示例

SELECT 
    string_fields.values[indexOf(string_fields.names, 'path')] AS path, 
    count(*) AS count
FROM logs
WHERE (namespace = 'kube-nginx-ingress') AND ((string_fields.values[indexOf(string_fields.names, 'vhost')]) LIKE '%foobar.baz%') AND (date = '2020-02-29')
GROUP BY string_fields.values[indexOf(string_fields.names, 'path')]
ORDER BY count DESC
LIMIT 20

选择发生在数千万条记录中。旧方案在20秒内解决:



新-14点:



如果您使用Helm-chart,则在更新日志仓库时,数据库将自动迁移为新格式。否则,您将必须手动进行迁移。该过程在文档中进行了描述简而言之,只需运行:

DO_DB_DEPLOY=true rake create_logs_tables

另外,我们开始将TTL用于ClickHouse表这使您可以自动从数据库中删除早于指定时间间隔的数据:

CREATE TABLE logs
(
....
)
  ENGINE = MergeTree()
  PARTITION BY (date)
  ORDER BY (timestamp, nsec, namespace, container_name)
  TTL date + toIntervalDay(14)
  SETTINGS index_granularity = 32768;

可在文档中找到ClickHouse的数据库模式和配置示例,包括使用CH群集的示例

改进日志收集


关键创新:

  • 添加一个缓冲区缓冲区用于在出现大量日志时消除突发事件。
  • 实现了从应用程序直接通过JSON格式通过TCP和UDP 将日志发送日志库的功能

日志库中的日志库电池是logs_buffer添加到数据库架构的新表该表在内存中,即 存储在RAM中(具有特殊类型的Buffer);是她应该平整基座上的负载。感谢您添加它提示索维戈

从应用程序直接将日志发送到日志库的实现使您甚至可以通过netcat做到这一点:

echo '{"log": {"level": "info", "msg": "hello world"}}' | nc fluentd.loghouse 5170

可以在流中安装了日志仓库的名称空间中查看这些日志net



发送数据的要求极低:消息必须是带有field的有效JSON log字段log又可以是字符串或嵌套的JSON。

监视日志子系统


一个重要的改进是通过Prometheus对流利性的监视。现在,日志仓库带有一个用于Grafana的面板,其中显示了所有基本指标,例如:

  • 流利的工人数量;
  • 发送到ClickHouse的事件数;
  • 可用缓冲区大小(以百分比为单位)。

文档中可以找到Grafana的面板代码

对于ClickHouse该面板的基础上,提出了一个现成的产品 -从f1yegor,为此许多感谢作者。

如您所见,该面板显示与ClickHouse的连接数量,缓冲区的使用,后台任务的活动以及合并的数量。这足以了解系统的状态:



fluentd的面板显示fluentd的活动实例。对于那些不希望/根本不会丢失日志的人来说,这尤其重要:



除了窗格的状态外,该面板还显示了将日志发送到ClickHouse的队列负载。反过来,您可以了解ClickHouse是否正在处理负载。在无法丢失日志的情况下,此参数也很关键。

对于我们提供的Prometheus Operator,面板示例更加清晰,但是,可以通过设置中的变量轻松对其进行修改。

最后,作为日志监视工作的一部分,我们将当前的Docker映像与Percona Labs发布的clickhouse_exporter 0.1.0 放在一起,因为原始clickhouse_exporter的作者放弃了他的存储库。

未来的计划


  • 使在Kubernetes中部署ClickHouse集群成为可能。
  • 使日志选择异步进行,并将其从后端的Ruby部分删除。
  • Ruby- , .
  • , Go.
  • .


很高兴看到loghouse项目吸引了观众,不仅赢得了GitHub(600多个)的称号,而且还鼓励真正的用户谈论他们的成功和问题。

在两年多以前创建了loghouse之后,我们不确定其前景,希望市场和/或开源社区会提供最佳解决方案。但是,今天我们看到这是一条可行的路径,我们自己仍然在许多服务的Kubernetes集群上选择并使用它。

我们期待在改进和开发日志库方面提供任何帮助。如果您在日志库中缺少某些内容,请在注释中写。另外,当然,我们很高兴能在GitHub上活跃起来

聚苯乙烯


另请参阅我们的博客:


All Articles