MachbaseとInfluxDBのアーキテクチャ比較:インターフェースとデータモデル
概要
時系列データベースの違いに関心がある方に向けて、MachbaseとInfluxDBのアーキテクチャを比較します。
本稿執筆時点では、3〜4年前のバージョンによる性能比較はあり、当時のテストではMachbaseが高い性能を示しました。しかし、その後は両製品とも変化しており、最新条件での比較資料はまだ用意していません。過去の結果は参考として捉えてください。本稿の技術説明も、当時扱っていた構成を対象とします。
Machbaseについて
Machbaseは、時系列センサーデータの高速な取り込み、検索、集計を目指して開発されたDBMSです。
Raspberry Piなどのエッジ機器、一般的な単一サーバー、複数サーバーのクラスターに対応します。
時系列センサーデータとマシンログの処理に特化した機能とアーキテクチャを備えています。
InfluxDBについて
InfluxDBはInfluxDataが開発する時系列DBMSで、オープンソース版が提供されています。
時系列データ処理で広く知られる製品の一つです。クラスター機能の提供範囲は、製品の世代やエディションによって異なります。
MachbaseとInfluxDBのアーキテクチャ比較
両製品は時系列データ処理を目的としており、主な特徴を次の表にまとめました。
本稿では、使いやすさに関わる特徴を中心に見ていきます。インデックスや内部構造の性能については、実測を行った上で別の機会に紹介する予定です。

MachbaseとInfluxDBのアーキテクチャ比較
実装言語とクライアントインターフェース
本稿で扱うMachbaseでは、サーバーコードはC、ODBC/CLIや付属ツールはC++で実装されています。JDBC、C#、Scalaのライブラリーはそれぞれの言語で提供します。通信には、一般的なRDBMSで使うPrepare/Bind/Executeなどを扱う専用プロトコルを採用し、効率を重視して設計しています。
C#コネクターはMachbaseのGitHubで公開されており、内部の実装を確認できます。
比較対象のInfluxDBはGoで実装され、RESTを基盤とする通信インターフェースを提供します。各言語のクライアントライブラリーも、このHTTP APIを利用します。本稿で確認したC++ライブラリーでは、処理をRESTリクエストへ変換し、curlを使って送信する構成でした。従来のDBドライバーと同じPrepare/Bind/Execute方式ではありません。

RESTはWeb環境で扱いやすいインターフェースです。Webサーバーから問い合わせたり、多数のセンサーからデータを送ったりする際に便利です。MachbaseもRESTを提供しているため、この利便性はInfluxDBだけのものではありません。
一方、振動センサーのように短い周期で大量の値を生成する用途では、MachbaseのSQLAppendや、Prepare/Execute、配列バインディング、バッチ実行などのインターフェースが有効です。HTTPを使う方式とは処理や通信の仕組みが異なるため、継続的な大量取り込みでは、その違いが効率にどう影響するかを検証する必要があります。
この点の性能テストは、別途実施する予定です。
データモデル
Machbaseはリレーショナルモデルを採用しています。センサーデータ用のTAGテーブルでは、必須のセンサーID、時刻、値に加え、必要な列を定義できます。スキーマはDDLで明示します。
ここで扱うInfluxDBでは、measurement、タグ、フィールド、タイムスタンプでデータを表します。タグの組み合わせはtag setと呼ばれ、measurementとtag setによってseriesが識別されます。タグはインデックスの対象ですが、フィールドとは扱いが異なります。タイムスタンプを指定せずに書き込むこともでき、その場合はサーバー側で時刻が設定されます。次の例では、リレーショナルDBのように事前にCREATE TABLEを実行する必要はありません。

見慣れない形式かもしれません。同じ処理を、テーブルとインデックスの作成を含むMachbaseのSQLで表すと、次のようになります。

InfluxDBの書き込み形式では、タグ名やフィールド名を各データとともに指定します。次の部分に注目してください。

captain_idとvalueの間には空白があります。空白より前のcaptain_id=pirate_kingはタグの指定で、インデックスの対象になります。複数のタグを指定することもできます。

この例ではcaptain_idとother_tagがタグで、空白より後のvalueとvalue2はフィールドです。対象の構成では、フィールド条件だけの検索は多くのデータを走査する場合があります。また、ここで使うInfluxQLのGROUP BYでは、時間単位による集計とタグによるグループ化を扱い、フィールドをそのままグループ化キーにはできません。
このようにタグとフィールドをキーと値で表すモデルは、DDLで固定スキーマを定義するMachbaseのリレーショナルモデルとは異なります。
クエリ言語
MachbaseはSQLを基盤に、時系列処理向けの拡張構文を提供します。SQLに慣れたユーザーには取り組みやすい方式です。ここで紹介するInfluxDBのInfluxQLもSQLに似ていますが、独自のデータモデルに合わせた違いがあります。
簡単なクエリと、その結果を見てみましょう。

この例では、SELECTにtimeを明示しなくても、結果に時刻の列が含まれます。集計結果の時刻などは、元データの測定時刻そのものを表さないこともあるため、意味を確認する必要があります。識別子の引用方法などにも違いはありますが、SQLの経験があれば理解しやすい記法です。
InfluxDBにはFluxというクエリ言語もあり、利用できる言語は製品のバージョンや構成によって異なります。本稿の例は、前述のSQLに似たInfluxQLを対象としています。

MachbaseのSQLに変換すると、次のようになります。

まとめ
今回は、主にインターフェースとデータモデルの違いを紹介しました。どちらも時系列データを高速に扱うための製品ですが、Machbaseがリレーショナルモデルと従来のDBMSインターフェースを重視するのに対し、ここで扱ったInfluxDBは独自のタグ・フィールドモデルとHTTP APIを中心にしています。
主な違い
両製品は時系列データの効率的な処理を目指していますが、データの定義方法、クライアントの接続方法、問い合わせの表現が異なります。
MachbaseはCで実装され、ODBCやJDBCなどのインターフェースを提供します。比較対象のInfluxDBはGoで実装され、クライアントからHTTP APIを呼び出す構成で、従来のPrepare/Bind/Execute方式とは異なります。
MachbaseはDDLで定義したリレーショナルスキーマに従って処理します。InfluxDBはmeasurement、タグ、フィールドを使い、この例では明示的なテーブル作成なしにデータを書き込めます。
MachbaseはSQLと時系列向け拡張を提供します。InfluxQLもSQLに似ていますが、InfluxDB固有のデータモデルに対応した構文・制約があります。
本来は実測による性能比較まで紹介したかったのですが、今回は時間の都合で扱えませんでした。今後、別途取り上げる予定です。
ご質問や、追加で比較してほしい内容があればお知らせください。
お読みいただき、ありがとうございました。
著者:Machbase CRO Grey Shim


