このトピックでは、LindormTSDB を使用してデータモデルを作成する方法について説明します。
Lindorm 時系列データベースの作成
Lindorm インスタンスを作成すると、default という名前のデータベースがインスタンスに自動的に作成されます。デフォルトでは、インスタンスに書き込まれたデータはこのデータベースに格納されます。 default データベースは削除できません。
LindormTSDB では、複数のデータベースを作成できます。異なるデータベースに格納されているデータは物理的に分離されています。異なるデータベースに対して、異なるデータの有効期間(TTL)、パーティション間隔、ホットデータとコールドデータの境界を設定することもできます。データベースの作成方法の詳細については、「CREATE DATABASE」をご参照ください。
例
DB1 という名前のデータベースを作成し、DB1 のデータが期限切れにならないように指定します。
CREATE DATABASE DB1;DB2 という名前のデータベースを作成し、DB2 のデータ TTL を 60 日に設定します。
CREATE DATABASE DB2 WITH (ttl=60);DB3 という名前のデータベースを作成し、DB3 のデータ TTL を 60 日、ホットデータとコールドデータの境界を 30 日に設定します。
CREATE DATABASE DB3 WITH (cold_boundary=30, ttl=60);説明データ TTL とホットデータとコールドデータの境界は日単位で測定されます。
ホットデータとコールドデータの境界の値は、データ TTL の値よりも小さくする必要があります。
時間に基づいてデータベースをパーティション化する
LindormTSDB データベースを時間ごとにパーティション化できます。異なる時間範囲内のデータは、異なるパーティションに格納されます。各パーティションには、時系列データと時系列のインデックスが含まれています。
定期的な時系列を作成し、多数の時系列が生成される場合は、同じパーティションのインデックスが大きくなりすぎないように、データベースを時間ごとにパーティション化することをお勧めします。デフォルトのパーティション間隔は 30 日です。パーティション間隔を 7 日または 30 日に設定することをお勧めします。時間に基づいてデータベースをパーティション化する方法の詳細については、「CREATE DATABASE」をご参照ください。
データベース内のデータをクエリする場合、指定された時間範囲内のデータが格納されているパーティションのみがクエリされます。
例
DB4 という名前のデータベースを作成し、パーティション間隔を 30 日に設定します。
CREATE DATABASE DB4 WITH (partition_interval=30);既存のデータベースの場合、partition_interval パラメーターを変更することで、パーティション間隔を変更できます。
ALTER DATABASE DB4 WITH (partition_interval=60);重要データベースのパーティション間隔を変更した後、新しいパーティション間隔はすぐに有効になりません。パーティション間隔が変更されると、LindormTSDB は、データが現在のパーティションに書き込まれた最後の日をパーティションの終了時刻として指定し、その日の後にデータベースに書き込まれたデータを格納するための新しいパーティションを作成します。新しいパーティション間隔は、間隔が変更された後に作成されたパーティションに対してのみ有効になります。既存のパーティションのパーティション間隔は変更されません。
たとえば、データベース DB4 のパーティション間隔が 30 日から 60 日に変更されたとします。間隔が変更された時点で、50 日以内のデータは、DB4 内の Partition1 と Partition2 という名前の 2 つのパーティションに個別に格納されています。 Partition1 は、1 日目から 30 日目までに DB4 に書き込まれたデータを格納します。 Partition2 は、31 日目から 50 日目までに DB4 に書き込まれたデータを格納します。パーティション間隔が変更された後、51 日目以降に DB4 に書き込まれたデータは、パーティション間隔が 60 日である新しいパーティションに書き込まれます。 Partition1 と Partition2 のパーティション間隔は変更されません。
ホットデータとコールドデータの境界を指定する
LindormTSDB では、ホットデータとコールドデータを異なるストレージメディアに個別に格納できます。 cold_boundary パラメーターを設定することで、データベースのホットデータとコールドデータの境界を日単位で指定できます。境界よりも長い期間格納されているデータは、より費用対効果の高いコールドストレージに転送されます。
ホットデータとコールドデータを個別に格納するには、データベースのコールドストレージを有効にする必要があります。詳細については、「コールドストレージの有効化」をご参照ください。
コールドストレージに転送されたデータは、ホットストレージに戻すことはできません。
データはバックグラウンドで非同期的にコールドストレージに転送されます。したがって、境界が設定または変更された後、コールドストレージのサイズが変更されるまでにある程度の時間がかかります。
例
DB5 という名前のデータベースを作成し、ホットデータとコールドデータの境界を 30 日に設定します。 DB5 に 30 日以上格納されているデータは、コールドストレージに転送されます。
CREATE DATABASE DB5 WITH (cold_boundary=30);既存のデータベースの場合、cold_boundary パラメーターを変更することで、ホットデータとコールドデータの境界を変更できます。
ALTER DATABASE DB5 WITH (cold_boundary=30);
時系列テーブルの作成
時系列テーブルを作成する前に、テーブルのデータモデルを作成し、テーブル内のタグ、タイムスタンプ、およびフィールド列を決定する必要があります。一般に、LindormTSDB はタグ列を使用してクエリ内の時系列を照合し、各タグ列の転置インデックスを作成します。
さらに、テーブルの主キーをパーティションキーとして使用できます。 LindormTSDB は、パーティションキーを使用してデータをパーティション化し、データのハッシュに基づいて異なるストレージノードにデータをルーティングします。クエリで指定された条件がパーティションキーと一致する場合、LindormTSDB はすべてのノードのデータをスキャンする代わりに、対応するノードのデータのみをクエリします。モノのインターネット(IoT)シナリオのデバイス ID など、一意の値を含む列を主キーとして使用することをお勧めします。
詳細については、「データモデル」および「時系列テーブルの設計」をご参照ください。
例
sensor という名前のサンプルテーブルを作成します。
CREATE TABLE sensor ( device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity DOUBLE);センサー情報を格納するテーブルを作成し、device_id 列を主キーとして指定します。
CREATE TABLE sensor ( device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity DOUBLE, PRIMARY KEY(device_id));
テーブルの自動作成
LindormTSDB は、強い制約、弱い制約、制約なしの 3 種類のスキーマ制約ポリシーを提供します。Java 用 Lindorm ネイティブ SDK、InfluxDB ラインプロトコル、または TSDB API と互換性のある複数値データモデルを使用してデータを書き込むときに、スキーマ制約ポリシーを指定できます。弱い制約ポリシーが指定されているシナリオでは、データを書き込もうとするテーブルまたは列が存在しない場合、LindormTSDB はテーブルまたは列を自動的に作成するか、列が存在する場合は、データを書き込もうとする列のデータ型を検証します。詳細については、「スキーマの制約ポリシー」をご参照ください。
単一値データモデルと複数値データモデル
OpenTSDB プロトコルまたは TSDB API を使用してテーブルに書き込まれた単一値は、単一値モデルを使用して格納されます。 LindormTSDB は、単一値データのテーブルを作成しません。 LindormTSDB は、効率的なデータ読み取りのために複数値データの基になるストレージを最適化します。さらに、LindormTSDB は、弱い制約ポリシーが指定されている場合でも、複数値データのテーブルを自動的に作成します。したがって、複数値データモデルを使用してデータを格納することをお勧めします。