aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

InfluxDB v2 のインストールや v1 からの移行について

f:id:apt-k-ueno:20220302181251p:plain

はじめまして。SRE チームの細谷です。

弊社製品 intdash のサーバーサイドでは、intdash Server と呼ばれるミドルウェアが動作しており、intdash の多様なデータパイプラインの構築を実現しています。

intdash Server の構成要素の 1 つに時系列データベースがあり、弊社では InfluxDB OSS を採用しております。
InfluxDB OSS は、v1(1.X)と v2(2.X)のバージョンがリリースされており、現在運用している intdash では v1 を利用しています。

SRE チームでは v2 への移行を検討しており、v1 との比較などを含め検証を進めています。今回は InfluxDB v2 の導入や移行などをご紹介いたします。

導入手順

今回は Amazon Linux 2 の EC2 インスタンス上にインストールします。インストールするバージョンは以下になります。

  • influxdb: 2.1.1
  • influx-cli: 2.2.1

インストール

influxdb をインストールします。systemd で起動するため、rpm パッケージ経由でインストールします。

wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.1.1-x86_64.rpm
sudo yum localinstall influxdb2-2.1.1-x86_64.rpm

起動前に config を設定します。 /etc/influxdb/config.toml1 に記述するか、環境変数を介して渡すことができます。詳細オプションは、公式ドキュメントをご覧ください。

設定が完了したら、influxdb を起動します。

sudo service influxdb start

続いて CLI でのセットアップのため、influx-cli をインストールします。

wget https://dl.influxdata.com/influxdb/releases/influxdb2-client-2.2.1-linux-amd64.tar.gz
tar xvzf influxdb2-client-2.2.1-linux-amd64.tar.gz
sudo cp influxdb2-client-2.2.1-linux-amd64/influx /usr/bin/

セットアップ

デフォルトの User や Bucket2、Org を作成します。

influx setup -f \
  --name default \ # 初期設定の名前
  --username influx \ # 初期ユーザー名
  --password influxpassword \ # 初期パスワード
  --token influxtoken \ # InfluxDB へ接続する API Token
  --org influx \ # 組織名
  --bucket intdash \ # 初期バケット
  --retention 0 \ # Retention Policy
  --shard-group-duration 168h0m0s # Shard Group Duration

ここで、--token オプションより influxdb に接続するための API Token 値を指定することができます(指定しない場合はランダムな値になります)。

設定を完了すると、以下のコマンドよりデフォルトの config3 が作成されていることが確認できます。

$ influx config ls
Active  Name    URL                     Org
*       default http://localhost:8086   aptpod

また、デフォルトの Bucket も作成されていることが確認できます。

$ influx bucket ls
ID                      Name            Retention       Shard group duration    Organization ID         Schema Type
14aed3a5dcc5af35        _monitoring     168h0m0s        24h0m0s                 06adc337029ceb21        implicit
58a8e876e4cf0bbf        _tasks          72h0m0s         24h0m0s                 06adc337029ceb21        implicit
61d8afb4a9e0413c        influx          infinite        168h0m0s                06adc337029ceb21        implicit

_monitoring_tasks は System Bucket と呼ばれ、1 インスタンス毎にデフォルトで作成されます。

その他、必要な Bucket は以下のコマンドで作成できます。

influx bucket create \
  --name influxdb2 \ # バケット名
  --org influxdb \ # 組織名
  --retention 0 \ # Retention Policy
  --shard-group-duration 168h0m0s # Shard Group Duration

v1 との互換性について

v2 では、主要言語にクライアントライブラリが提供されていますが、v1 クライアントライブラリとの互換性もあります。InfluxDB 側に v1 authv1 dbrp を作成することで、v1 クライアントライブラリを使用できます。

上記は influx-cli コマンドで作成可能です。(事前に必要となる Bucket を作成し、ID を控えておく必要があります。)

v1 auth

InfluxDB にBasic 認証で接続できる認証設定をします。--read-bucket--write-bucket オプションにて、read/write 可能な Bucket を指定します。

influx v1 auth create \
  --username <ユーザー名> \
  --password <パスワード> \
  --org <組織名> \
  --read-bucket <Bucket ID> \
  --write-bucket <Bucket ID>

v1 dbrp

Database と Retention Policy を、Bucket にマッピングする設定をします。

influx v1 dbrp create \
  --bucket-id <Bucket ID> \
  --db <DB 名> \
  --rp <Retention Policy>

以上で v1 クライアントライブラリを使用可能な状態になります。

v1 からの移行手順

移行手順は「Automatically upgrade」と「Manually upgrade」の 2 通りがありますが、「Manually upgrade」で移行する手順をご紹介いたします。
こちらは時系列データを line protocol ファイルで書き出してマイグレーションするといった内容になっており、初期セットアップした InfluxDB v2 への移行を想定しています。

事前準備

移行前の準備として、/etc/influxdb/config.toml を作成します。
v1 で設定していた config を元に、v2 の config を作成します。詳しいマッピングは公式ドキュメントをご確認ください4

時系列データのマイグレーション

InfluxDB v1 サーバー上で、各 DB ごとに以下のコマンドを実行します。
line protocol ファイル形式で時系列データをエクスポートしています。

influx_inspect export \
  -datadir /var/lib/influxdb/data \ # datadir を指定
  -waldir /var/lib/influxdb/wal \ # waldir を指定
  -database influxdb \ # DB 名
  -retention autogen \ # Retention Policy
  -out /var/tmp/influxdb.lp \ # line protocol ファイルを出力するパス
  -lponly

次に InfluxDB v1 をアンインストールして InfluxDB v2 をインストールします。5
その後、事前準備にて作成した /etc/influxdb/config.toml を配置して、上述した初期セットアップと Bucket 作成、v1 互換性の設定を実施します。

最後に、以下のコマンドから時系列データの書き込みを実行してマイグレーションは完了になります。

influx write \
  --bucket influxdb \ # バケット名
  --file /var/tmp/influxdb.lp # line protocol ファイルパス

クエリ言語について

v1 では クエリ言語として influxql が使用されていましたが、v2 では flux が使用されます。 (flux 言語自体は、時系列データベースだけでなく RDB や CSV などを扱うことができます。)

influxql も API から使用可能ですが、上述した v1 dbrp 設定をする必要がありサポートされているクエリが限られています。

また、Continuous queries は tasks という名前に置き換わり、flux での作成が必要です。詳細は公式ドキュメントをご覧ください。

Flux 言語によるクエリパフォーマンスの向上

Flux 言語では、Pushdowns という関数がサポートされています。

Pushdown とは 1 つ以上から成る関数であり、その関数はデータ操作をメモリ上で行わずデータソース上で実行します。
こちらを活用することで、CPU やメモリ使用率などの向上が期待できます。

実際に検証中のベンチマークテストにて InfluxQL と Flux の比較を実施しました。
参照するデータ量が大きいクエリを実行したところ、InfluxQL は OOM によって処理が止まってしまいましたが、Flux は正常に動作することが確認できました。

以下がメモリ使用率のグラフになります。

grafana influxdb v1 memory graph
InfluxQL 実行時のメモリ使用率

grafana influxdb v2 memory graph
Flux 実行時のメモリ使用率

顕著に差が出たのは、Pushdowns によるものと思われます。
長期間のデータ参照が必要なユースケースなどにおいて、Flux が有効な選択肢の 1 つとなることに期待できそうです。

さいごに

InfluxDB のインストールや構成についてご紹介いたしました。
今回は検証向けの手順などがベースの内容となっておりますが、SRE チームでは運用環境に対する移行環境の整備など検証を進めています。

今後も引き続き進展あれば InfluxDB についてご紹介していきたいと思います。


  1. json, yaml 形式でも記述可能です。

  2. v2 では Database が Bucket として置き換わり、各 Bucket に Retention Policy / Shard Group Duration が設定されます。

  3. ここでは Client 側(influx-cli)の config を指しています。検証では同一インスタンスに CLI をインストールしましたが、別インスタンスからもセットアップなどができます。

  4. v1 と v2 の config option は大幅に変更されており、v2 から使用不可のものもあります。

  5. 紹介した手順では、同一インスタンスを v2 に移行する内容を記載しています。運用中でダウンタイムなどを考慮して移行する場合は、Dual write などを活用することをお勧めします。