VictoriaLogs声称可以用单节点替代之前 30 个节点的 ElasticSearch 集群

VictoriaLogs 是 VictoriaMetrics 团队发布的日志存储系统,声称可以用单节点替代之前 30 个节点的 ElasticSearch 集群,查询速度快,节省 CPU 和内存,具备极高的压缩比大幅节省存储。2024.11 发布了正式版,我们一起来了解一下。

VictoriaLogs声称可以用单节点替代之前 30 个节点的 ElasticSearch 集群

VictoriaLogs 特性

  • 它可以接受来自流行日志收集器的日志。比如对接 Vector、Logstash、Fluentbit、Promtail 等等
  • 与 Elasticsearch 和 Grafana Loki 相比,它的设置和操作要容易得多。组件比较少。
  • 它提供简单而强大的查询语言,可在所有日志字段中进行全文搜索。其检索语法称为 LogsQL,和 ElasticSearch 新提供的 EQL 有点像。
  • 它提供了用于查询VictoriaLogs的交互式命令行工具 – vlogscli。让你像是使用 UNIX 工具一样来查询日志。
  • 它可以与用于日志分析的优秀旧 Unix 工具无缝结合,例如 grep、less、sort、jq 等。其实大部分用户最核心的需求场景就是分布式检索。
  • 在相同的硬件上运行时,它可以处理比 Elasticsearch 和 Grafana Loki 大 30 倍的数据量。
  • 它为具有高基数(例如大量唯一值)的日志字段(例如 trace_id 、 user_id 和 ip 提供开箱即用的快速全文搜索。
  • 支持多租户。
  • 它支持无序日志的摄取,也称为回填。
  • 支持选择所选日志前后的周围日志。就类似 grep 的 -A -B 参数。
  • 它提供了用于查询日志的 Web UI。
  • 它提供了Grafana插件用于查询日志。
  • 它支持警报。

如上是从 VictoriaLogs 官方文档中摘录的特性,可以看到 VictoriaLogs 作为后起之秀,针对日志场景做了很多考虑。

VictoriaLogs 调优

VictoriaLogs 声称自己的默认参数基本就是最优的,默认值会根据可用的 CPU 和 RAM 资源自动调整,无需额外调整。操作系统也无需额外调优,只需要把允许打开的文件句柄数量调大即可。

推荐的文件系统是 ext4 ,推荐的持久存储是 GCP 上基于 HDD 的持久磁盘,因为它自身提供高可用机制,并且可以动态调整大小。如果您计划在 ext4 分区上存储超过 1TB 的数据或计划将其扩展至超过 16TB,则建议将以下选项传递给mkfs.ext4 :

mkfs.ext4 ... -O 64bit,huge_file,extent -T huge

VictoriaLogs 监控

VictoriaLogs 在 http://localhost:9428/metrics 暴露了其自身监控指标(符合 Prometheus 协议),可以通过 Prometheus 或者 vmagent 采集。VictoriaLogs 也提供了 Grafana 仪表盘 和 Prometheus 告警规则。

VictoriaLogs 将自己的日志发送到标准输出。建议在故障排除期间调查这些日志。

VictoriaLogs 升级

VictoriaLogs 只有一个二进制,只要 changelog 不做额外说明就可以直接替换二进制升级。停进程的时候别 kill -9,用 kill -INT 优雅退出。

VictoriaLogs 日志保留时间

默认情况下,VictoriaLogs 存储时间戳在时间范围 [now-7d, now] 内的日志条目,同时删除给定时间范围之外的日志。例如它使用7天的保留。可以使用 -retentionPeriod 命令行标志配置保留。该标志接受从 1d (一天)到 100y (100 年)的值。

例如,以下命令启动 VictoriaLogs 并保留 8 周:

/path/to/victoria-logs -retentionPeriod=8w

如果日志的时间戳超出配置的保留时间,VictoriaLogs 会在数据摄取阶段自动删除日志。删除的日志示例会与WARN消息一起记录,以简化故障排除。每次由于时间戳超出保留而删除摄取的日志条目时, vl_rows_dropped_total 指标都会递增。建议设置以下警报规则,以便在将具有错误时间戳的日志引入 VictoriaLogs 时收到通知:

rate(vl_rows_dropped_total[5m]) > 0

默认情况下,VictoriaLogs 不接受时间戳大于 now+2d 日志条目,即未来 2 天。如果您需要接受具有更大时间戳的日志,请通过 -futureRetention 命令行标志指定所需的“未来保留”。例如,以下命令启动 VictoriaLogs,它接受带有最多未来一年时间戳的日志:

/path/to/victoria-logs -futureRetention=1y

如果 -storageDataPath 目录中的数据总大小大于给定阈值,则可以将 VictoriaLogs 配置为自动删除较旧的每日分区 -retention.maxDiskSpaceUsageBytes 命令行标志。例如,以下命令启动 VictoriaLogs,如果总存储大小大于 100GiB,它将删除旧的每日分区:

/path/to/victoria-logs -retention.maxDiskSpaceUsageBytes=100GiB

VictoriaLogs 通常将日志压缩 10 倍或更多倍。这意味着就上面的参数而言 VictoriaLogs 在运行时可以存储超过 1 TB 的未压缩日志。

VictoriaLogs 至少保留最后两天的数据,以保证查询时可以返回最后一天的日志。这意味着,如果最近两天的数据大小超过 -retention.maxDiskSpaceUsageBytes,总磁盘空间使用量可能会超过 -retention.maxDiskSpaceUsageBytes

注意,-retentionPeriod 和 -retention.maxDiskSpaceUsageBytes 独立生效。如果你设置了 -retention.maxDiskSpaceUsageBytes,如果每天的数据量比较少,你肯定希望存储尽量多时间的数据,此时你可以设置 -retentionPeriod 为一个较大的值。比如:

/path/to/victoria-logs -retention.maxDiskSpaceUsageBytes=10TiB -retentionPeriod=100y

VictoriaLogs 存储目录

VictoriaLogs 将其所有数据存储在一个目录中 victoria-logs-data 。可以通过 -storageDataPath 命令行标志更改目录的路径。例如,以下命令启动 VictoriaLogs,它将数据存储在 /var/lib/victoria-logs :

/path/to/victoria-logs -storageDataPath=/var/lib/victoria-logs

如果 -storageDataPath 目录丢失,VictoriaLogs 会在第一次运行时自动创建该目录。

VictoriaLogs 高可用

目前 VictoriaLogs 没有提供集群版本,只有单机版本,所以高可用主要是靠双写来实现。

  • 日志收集器:日志收集器应支持将传入数据复用到多个输出(目的地)。Fluent Bit、Logstash、Fluentd 和 Vector 等流行的日志收集器已经提供了此功能。
  • VictoriaLogs 单节点实例:使用两个或更多实例来实现HA。
  • vmauth 或负载均衡器:用于从副本之一读取数据,以确保平衡和冗余访问。

VictoriaLogs 安装体验

VictoriaLogs 提供了多种安装方式,我这里使用二进制的方式安装,从下面的地址下载其发布包:

https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.0.0-victorialogs

我的环境是 Macbook M1 芯片,所以下载 victoria-logs-darwin-arm64-v1.0.0-victorialogs.tar.gz 这个包,解压后就是一个二进制文件 victoria-logs-prod,直接运行即可。

./victoria-logs-prod -syslog.listenAddr.tcp=:29514

我在运行的时候加了一个 -syslog.listenAddr.tcp=:29514 参数,这样 VictoriaLogs 就会监听 29514 端口接收 syslog 数据。可以方便我快速体验。启动 VictoriaLogs 之后,可以通过 http://localhost:9428/ 访问其 Web UI。

使用 rsyslog 发送日志到 VictoriaLogs

我本地还有一个虚拟机,我在虚拟机里配置一下 rsyslog,把日志发送到 VictoriaLogs。在 /etc/rsyslog.d/50-default.conf 最下面加了一行配置