多くの企業がMongoDBを使用してアプリケーションログを保存しているのを見てきました。そのスキーマフリーネスは、スキーマが時々変更される傾向があるアプリケーションログに対して非常に柔軟です。また、上限付きコレクション機能は、古いデータを自動的に削除してデータをメモリに収めるために非常に便利です。
人々は通常のGroupingまたはMapReduceによってログを集約しますが、それほど速くはありません。特に、MongoDBのMapReduceは単一のスレッド内でのみ機能し、JavaScriptの実行オーバーヘッドは膨大です。新しい集約フレームワークは、この問題を解決する可能性があります。
ロギングにMongoDBを使用する場合、懸念されるのは、高い書き込みスループットによるロックの競合です。MongoDBの挿入はデフォルトでファイアアンドフォーゲットスタイルですが、多くのinsert()を呼び出すと、書き込みロックの競合が激しくなります。これは、アプリケーションのパフォーマンスに影響を与え、リーダーが保存されたログを集約/フィルタリングできなくなる可能性があります。
1つの解決策は、 Fluentd、Logstash、Flumeなどのログコレクターフレームワークを使用することです。これらのデーモンは、すべてのアプリケーションノードで起動されることになっており、アプリプロセスからログを取得します。
ログをバッファリングし、MongoDB / PostgreSQLなどの他のシステムにデータを非同期的に書き込みます。書き込みはバッチで行われるため、アプリから直接書き込むよりもはるかに効率的です。このリンクは、PHPプログラムからFluentdにログを入れる方法を説明しています。
MongoDB+Fluentdに関するチュートリアルをいくつか紹介します。
MongoDBの問題は、データボリュームがメモリサイズを超えると速度が低下し始めることです。その時点で、ApacheHadoopやCassandraなどの他のソリューションに切り替えることができます。上記の分散ログレイヤーがある場合は、成長するにつれて別のソリューションに切り替えることができます。このチュートリアルでは、Fluentdを使用してログをHDFSに保存する方法について説明します。