VictoriaMetrics 入門

皆さんこんにちは!WESEEK ソフトウェアエンジニアの 増山 です。

今回のブログでは、時系列データベース VictoriaMetrics に入門したいと思います。

目次

はじめに

VictoriaMetrics は公式ドキュメントがしっかりと整備されているので基本的にはこちらを読んでいただければ大体のことはわかるかと思います。この記事では、入門するにあたって必要最低限わかっていればいいことだけに絞って手短に解説します。

また、VictoriaMetrics を使うときには Single version か Cluster version のうちどちらか1つの種類を選ぶことになりますが、Cluster の方さえ理解していれば Single も理解しているのと同じなのでこの記事では Cluster のことについてしか言及しません。

VictoriaMetrics 概要

原文: VictoriaMetrics is a fast, cost-effective and scalable monitoring solution and time series database.
和訳: VictoriaMetrics は、高速で費用対効果が高く、拡張性の高いモニタリングソリューションであり、時系列データベースです。

公式ドキュメント より引用。

VictoriaMetrics 本体は vminsert vmstorage vmselect の3つのコンポーネントで構成されています。それぞれの役割が明確に分かれていてとても理解しやすい印象です。

また、メトリックスを収集するコンポーネントとして vmagent があります。

vminsert

vmstorage にデータを書き込む役割を持つコンポーネント。

vminsert は取り込んだデータをそのメトリック名とラベルに基づいてハッシュを決定し、そのハッシュに対応する vmstorage にデータを書き込みます。

必須の起動時オプションは、--storageNode=<vmstorage の URL, ...> です。

データのレプリケーション

起動時のオプションを --replicationFactor=N と設定することで、書き込むデータを N 個に複製してそれぞれ違うストレージに書き込むことができます。これにより、N - 1 個の vmstorage が停止したとしても VM クラスタは完全なデータを維持できます。

--replicationFactor=N のとき 2*N - 1 個の vmstorage を用意する必要があることに注意してください。

詳しくは こちら をご覧ください。

vmstorage

データを保存したり、vmselect からのクエリに応じてデータを返したりする役割を持つコンポーネント。

リテンション

起動時のオプションを --retentionPeriod=N と設定することでデータの保存期間を設定できます。

vmselect

vmstorage にクエリを発行してクライアントに目的のデータを返す役割を持つコンポーネント。

重複排除

vmselect はクライアントから検索の命令を受け取ると、全ての vmstorage に同じクエリを発行して検索データを受け取ります。その後、特定のルールに従って重複排除を行うことで被ってしまったデータを排除したあと、PromQL で集計などを行い、最終的にクライアントに返します。

また、vmui という簡易的な web ui を持っているので、Grafana などの web ui ツールを入れなくてもメトリックスを確認できます。

検索のチューニング

VictoriaMetrics はデフォルト値で十分にチューニングされているとドキュメントでは言われています。

ただし大きなデータを検索したくなった場合には --search.max* オプションの値を大きくすることで限界を調整できます。

vmagent

メトリックスを収集して、ストレージに書き込む役割を持つコンポーネント。

Prometheus の scrape_config に基づいた設定ファイルをもとにスクレイピング対象やスクレイピングの間隔などを設定できます。

書き込みのフォーマットとして Prometheus remote_write を使用するので、Prometheus 互換のストレージに対して書き込みを行うことができます。

起動して使ってみる

簡単に使えるように docker-compose.yml を用意したのでこちらを使っていきます。

$ git clone https://github.com/hakumizuki/victoriametrics-docker-compose.git でクローンしてお使いいただけます。

クローンができたら $ docker compose up -f /path/to/docker-compose.yml で起動します。victoriametrics コンテナのポート番号は 9999 にしています。

vmui

http://localhost:9999/vmui/ にアクセスすることで vmui を使用できます。

"DASHBOARDS" タブに切り替えるだけで、vmagentvictoriametrics の "Per-job CPU usage", "Per-job RSS usage", "Per-job disk read", "Per-job disk write" を確認できます。

また、"CUSTOM PANEL" タブでは PromQL または MetricsQL を入力して実行するとそのグラフを描画してくれます。

vmui の詳しい説明は こちら

ややこしいオプションについて補足

ドキュメントを読んでいる中でいくつか理解が難しかったオプションがあったので少しだけ触れたいと思います。

--replicationFactor--dedup.minScrapeInterval

公式ドキュメントの Replication and data safety のセクションで登場するオプションです。

公式の文章だけを読むと、cluster version の VictoriaMetrics で--replicationFactor=N と設定した場合は、必ず --dedup.minScrapeInterval1ms で設定しなければならないとありますが、実際にはこれより大きな値を設定することも可能です。

また、これら2つのオプションには直接的な関わりはありません。"開発者の Roman さんの回答" にもある様に、あくまで vminsert はデータを複製して投入し、vmselect は取得したデータを重複排除してクライアントに返すという責務のみを持っています。

より具体的な処理の手順を確認したい場合は 重複排除のソースコードそのテストコード をお読みいただくことをお勧めします。

開発者の Roman さんの回答

実際のスレッド

-dedup.minScrapeInterval=1ms  and replicationFactor  flags aren't connected.
It is quite simple. Replication factor configures vminsert  to send N copies of data, where N is the replication factor. vminsert also ensures, that each copy will be sent to different storage. That's it.
Dedup flag configures vmselect  to leave only one data point for each specific time series on configured interval. So if you request metric foo  and it returns datapoints 1000 1 , 1010 2 , 1020 1  (where first number is a timestamp, and second is value) and your -dedup.minScrapeInterval=30ms  - then only 1020 1  will be returned and the rest is dropped. If you set dedup.minScrapeInterval=5ms  - all values will be returned, because interval of 5s does not intersect more than 1 datapoint.
When replication factor is set, we recommend setting dedup.minScrapeInterval=1ms  because vmselect will get N copies of identical data with equal timestamps.
If you omit setting dedup.minScrapeInterval=1ms  - you'll receive all datapoints without deduplication.

まとめ

ここまでお読みいただきありがとうございました。

今回は時系列データベース VictoriaMetrics に入門してみました。
質問等ありましたら 増山の Twitter に DM 送っていただければ答えられる範囲でお答えします。

皆さんも時系列データベースの候補として VictoriaMetrics を検討してみてはいかがでしょうか。

関連記事

【2022年保存版】気になるTSDBプロダクトを比較してみました <= こちらの WESEEK ソフトウェアエンジニアの 田村 がまとめた記事が参考になると思いますので興味があるかたはぜひご覧ください。