皆さんこんにちは!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" タブに切り替えるだけで、vmagent
と victoriametrics
の "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.minScrapeInterval
を 1ms
で設定しなければならないとありますが、実際にはこれより大きな値を設定することも可能です。
また、これら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 ソフトウェアエンジニアの 田村 がまとめた記事が参考になると思いますので興味があるかたはぜひご覧ください。