top of page

大規模な時系列データベースを構築する前に考えるべきこと

55 分前
読了時間: 5分

時系列データベースの保存システムは、どのように最適化されているか


保存システムの最適化を、処理にかかる時間と、保存に必要な空間の2つの観点から見ていきます。


取り込みと読み出しの時間を短縮するために、バッファードI/O、データの局所性を高める保存構造、キャッシュなどを使います。


バッファードI/Oは、パーティションごとにデータをメモリへまとめてからファイルに書き込み、取り込み速度を高めます。


Machbaseのタグテーブルは、関連するデータをまとめて配置し、検索時に必要なデータを中心に読み込みます。そのために、時刻とタグをキーとする複合索引を採用しています。


頻繁に参照するデータはメモリにキャッシュできます。負荷の大きいディスクI/Oを省くことで、応答時間を短縮します。



保存容量を抑える一般的な方法は、データを圧縮してファイルへ書き込むことです。


型を考慮せず行全体をまとめて圧縮すると、圧縮効率が下がる場合があります。また、検索で不要な列まで読み込むことになり、余分なI/Oが発生します。


列指向の保存方式は、これらの問題を改善します。


データ型ごとに適した圧縮方式を選べるため、全体の圧縮効率が高まります。検索時は必要な列だけをメモリへ読み込み、ディスクI/Oとメモリ使用量を抑えられます。


データベースの負荷をどう解消するか

EXPLAINを使い、クエリ実行に関する情報、リソースの使用状況、所要時間などを確認します。その結果からボトルネックを探し、改善策を検討します。


主な方法は、クエリの調整、データベース設定の調整、OS設定の調整、ハードウェアの増強、DBMSソフトウェア自体の改善です。


用途ごとに適したデータベースは

金融・経済:為替や株式市場の分析

  • 金融分野は、短期的な視点と長期的な視点の両方から考える必要があります。

  • 情報が連続して発生し、即座に分析する必要がある場面では、低遅延で処理できるインメモリデータベースが有効です。

  • 長期的な傾向を分析するには、大量のデータを不揮発性ストレージに保持し、効率よく処理する必要があります。SQL on Hadoopなどのビッグデータ基盤は、そのための選択肢の一つです。

環境・行政・福祉:データ間の関係を分析する

  • レコード間の関係が重要なら、RDBMSが適しています。データ量が増えるにつれ、関係の検索に向くRDBMSと、大量データの保存・集計に向く列指向DBMSを組み合わせる構成も増えています。

  • 比較的少量の補足情報をRDBMSに保存し、大量に発生する観測データを列指向DBMSへ保存する、ハイブリッド構成が一つの方法です。

SNS:大量で多様なデータを管理する

  • SNSは、利用者同士のコミュニケーション、情報共有、人脈の拡大を通じて、社会的なつながりを作るプラットフォームです。

  • グラフ理論では、データをノードとエッジで表します。利用者をノード、利用者間の関係をエッジとすれば、SNSのつながりを自然に表現できます。

製造業:時間の流れに沿ってデータを見る

  • 製造業は、時系列データベースに適した分野です。自動化とともにデータ量が増え、リアルタイムの検索・分析に加えて、長期間の傾向や時間帯ごとの比較も必要になります。

  • 従来のRDBMS、Hadoop、NoSQL、RTDBなどの構成では、こうした負荷に対応するため多くのハードウェアが必要となり、費用が増える場合があります。

  • 時系列データベースは、この用途に合わせて設計されています。比較的少ないリソースで高い性能を得られれば、安定したシステムを低い費用で構築できます。

新しいクエリ機能は、どのような基準で追加するか


例えば、顧客から機能追加の要望があった場合、対応の可否や方法をどう判断するのでしょうか。


基本的なSQL仕様と既存のアーキテクチャに合う要望は、積極的に取り入れます。


短期間で対応できる変更は課題管理システムに登録し、次のパッチへの収録を検討します。時間のかかる機能はプロジェクトとして登録し、ロードマップ会議を経て将来の版に組み込みます。


顧客の要望から生まれた機能は、今後の使い方の記事で紹介する予定です。例えば、次のようなものがあります。


  • Machbaseのシーケンス列の利用

  • PIVOT

Machbaseでは、高速な処理を実現するために、次の開発手法を採用しています。


1つ目は、中核部分をC言語で開発していることです。


C言語ではコンパクトな実行ファイルを作れ、仮想マシンを介さずOS上で動作します。OSのAPIも直接呼び出せるため、低レベルの処理を効率よく実装できます。


メモリの確保と解放を開発者が明示的に制御でき、用途に合わせた効率化が可能です。


JavaやPythonなどは自動メモリ管理により実装しやすい一方、メモリを回収するタイミングの制御方法が異なります。Cでは、エンジン側が解放の時点をより直接的に管理できます。


2つ目は、並行処理を効率化する手法です。


一般に、並行処理のクリティカルセクションを保護するため、ロックを使います。


ロックはデータの破損を防ぎますが、競合や同期が性能低下の原因にもなります。


Machbaseでは、適切な箇所にロックを回避する手法やロックフリーのアルゴリズムを取り入れ、性能を改善してきました。


3つ目は、Machbaseの負荷に合わせた独自のメモリ管理機構です。


メモリの断片化を抑え、使用パターンに応じて柔軟に確保・解放できる構造にしています。


4つ目は、データの利用方法に適した保存構造です。


最後に、取り込み性能を最大化するため、標準ODBC仕様の範囲を超える非同期インターフェースも提供しています。


各インターフェースの詳細は、次のマニュアルを参照してください。


 
 
電話
英語
bottom of page