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