はじめに
「ともにつくる、つぎをつくる。~いつでもどこでもお客様とともに~ グローバルトップのソリューションパートナー」東芝テック株式会社の加藤秀幸です。現在、リテール・ソリューション事業本部、ELERA™プラットフォーム開発部にてPOSシステムの開発を行っています。今回はMongoDBに関する話を投稿したいと思います。
時系列データベースとは
時系列データベースの概要や比較は @kanegoon の記事をご参照ください
この時点ではMongoDBは時系列データベースとしての機能はなかっため上記比較リストには上げられていません。現在では比較対象のデータベースのひとつになるでしょう。
時系列データベースとしてのMongoDB
実際には時系列データベースというより時系列コレクションになります。この機能は2021/07リリースのMongoDB v5.0より導入されました。
これにより、IoTデータ、金融データ、アプリケーションメトリクスなど、多様な時系列データに対応でき、それに特化した内部構造により、従来のコレクションと比べてストレージ効率とクエリ性能が向上しています。
利用例
今回は個人的な趣味と実益のために確認・導入したことについて記載していきます。
家庭での利用なのでパフォーマンス等の評価は行っていません。あくまでも「やってみた」レベルです。
温湿度データの保存
温湿度は代表的なセンサーIoTデータの一つになると思います。私は室内の温湿度を肌の感覚で感じるのも良いですが、実データとして把握したいタイプなので家にはいくつか温湿度センサーを設置しています。しばらく運用していませんでしたが、過去にはMRTGにて温度収集をしていました。今回、これをMongoDBの時系列コレクションに保存したいと思います。
技術スタック
実際に利用した技術スタックは下記の様になります。
- MongoDB Atlas M0 (Free Cluster)
- Python
-
Grafana Cloud Free
- 先述の通りMongoDBに保存したところで可視化できないと意味がないです。
- こちらも機能制限はありますが、無料で利用できます。
- 上記の機能制限に書かれた
"14 days retention"はGrafana標準のPrometheusに時系列データを保存する場合の話で、今回のMongoDBの様な外部データソースを利用する場合はこの制限がありません。
全部、無料の範囲で評価・運用ができます。やったね!
Pythonを使った時系列コレクションへの保存
ほとんど、公式のチュートリアルと変わり映えがしませんが書いていきます。あくまでもサンプルコードです。実運用するにはちゃんとエラーハンドリングを入れましょう。
PyMongoを接続ドライバとして利用しますのでpipによりインストールされていることが前提です。
コレクションの初期化・時系列化
from pymongo import MongoClient
# 払い出したMongoDBのコネクションストリング(ローカルなMongoDBでもOKです)
MONGODB_URL="mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/?appName=Cluster0"
# 時系列コレクションを作成するためのオプション設定
TIMESERIES_OPTIONS = {
"timeField": "timestamp", # 時系列コレクションの時間フィールド
"metaField": "device_id", # メタデータとしてセンサーデバイスのIDを格納するフィールド
"granularity": "seconds", # データの粒度(秒単位)
}
# TTLは5年としてみます。時系列コレクションを作成する際に使用
TTL_SECONDS = 5 * 365 * 24 * 3600
# MongoDBクライアントの作成
client = MongoClient(MONGODB_URL)
# データベースの取得
database = client.get_database("my_timeseries_db")
# 時系列コレクションの作成
collection = database.create_collection(
"sensor_data", # 時系列コレクションの名前
timeseries=TIMESERIES_OPTIONS, # 上記時系列オプションの指定
expireAfterSeconds=TTL_SECONDS # 上記TTLの指定
)
上記方法で、コレクションを作成すると、MongoDB AtlasのWebUIやMongoDB CompassでのUIから見た場合、通常コレクションのフォルダアイコンから時系列グラフのアイコンに変わり、時系列コレクションとして設定されたことがわかります。
センサーデータの挿入
温湿度センサーのデータはサンプルのためベタ書きです。実際にはデバイスから取得した値に置き換えてください。
from datetime import datetime, timezone
# ダミーデータ:実際はデバイスより取得してください
temperature = 25.3 # 温度センサーの値
humidity = 60.5 # 湿度センサーの値
device_id = "sensor_001" # センサーデバイスのID
timestamp = datetime.now(timezone.utc) # 現在のUTC時刻
# 時系列コレクション取得
collection = database.get_collection("sensor_data")
# ドキュメント(時系列データ)の作成
doc = {
"timestamp": timestamp,
"temperature": temperature,
"humidity": humidity,
"metadata": {"device_id": device_id},
}
# ドキュメント(時系列データ)の挿入
collection.insert_one(doc)
これで、MongoDB AtlasのWebUIあるいはMongoDB Compass等で見ると次の様にデータが挿入されていることがわかります(もちろんmongoshからfindでも良いでしょう)。
可視化
今回は時系列データベースとしてのMongoDBの話なので、GrafanaからMongoDBへのJavaScriptによるクエリーに関しては省略します。こちらを設定することにより次の様な可視化ダッシュボードを作成することができます。
まとめ
上記の様な手順でMongoDBを時系列データベース(コレクション)として活用できることがわかりました。ホビーユース・評価確認レベルなら無料での運用もできています。
なお、製品・サービスとしてプロダクションレベルで利用する場合はパフォーマンスの評価や運用の検証を行いましょう。運用での信頼性、バックアップ機能、ネットワークピアリングなどを考えると有償のクラスタになるかと思います。


