私はMongoDBの展開を計画している最中です。これが初めての運用環境であり、クラスター内の各シャードのディスクサイズについて質問があります。
このクラスター自体は、展開後すぐに毎年2TBのデータを蓄積する可能性のある時系列の建物センサーデータを格納するためのものです。
そのため、最初からクエリルーターと構成サーバーを配置しているため、2シャードクラスター(2 x 3ノードのレプリカセット)から始めることを計画しています。ただし、シャードごとに格納する必要があるデータの量を選択する方法について、いくつかのアドバイスを行うことができます。
各「シャードノード」には、48 GB以上のRAMがあり、IOPS要件を満たすのに適したディスク構成が明らかにあります。
このDBを使用するアプリケーションのIOPS要件を満たすことができる場合、シャードごとに2 TBのサイジングを停止するにはどうすればよいですか?単一のシャードが保持する必要があるデータの量、または私の意思決定プロセスを支援するためのガイドラインに制限はありますか?
データボリュームがホストあたりの利用可能なRAMを超える場合、パフォーマンスの問題について多く読んでいます。しかし、ディスクが十分なIOPSを提供しているのであれば、これは問題ではありませんか?ディスクはまだメモリよりもはるかに遅いと思いますが、RAMサイズを超えたときにMongoDBのパフォーマンスが低下した場合は、大規模なデータベースをどのように扱うのですか? RAM内にとどまるためにクラスターに小さな断片を追加し続けるコストは莫大です!
つまり、クラスターの拡張を最小限に抑えるために、IOPS要件を満たすことができる場合、単一のシャードに任意の量のデータを安全に格納できますか、それともはるかに低い推奨事項がありますか。
また、効率的なクエリ実行を確実にするために、インデックスサイズをRAMサイズ未満に維持する必要があることも知っています。次に例を示します。
データ量がシャードあたり1 TBで、各シャードノードに48GB RAMがある場合、インデックスサイズを推定する方法はありますか?これは、データベースに入るデータの合計ポイント数まで毎分更新されるデータロギングシステムであるため、ワーキングセットを推定することは困難です。その後、翌日に新しい30,000のドキュメントが作成され、更新されます。
チャンクサイズ(デフォルト:64MB)を増やす必要があります。そうしないと、そこに制限されます。
http://blog.mongodb.org/post/100676030403/sharding-pitfalls-part-iii-chunk-balancing-and
データベースサイズ
MMAPv1ストレージエンジンは、各データベースを16000以下のデータファイルに制限します。つまり、単一のMMAPv1データベースの最大サイズは32TBです。 storage.mmapv1.smallFilesオプションを設定すると、この制限が8TBに減少します。
データサイズ
バージョン3.0で変更されました。
MMAPv1ストレージエンジンを使用すると、単一のmongodインスタンスは、基盤となるオペレーティングシステムによって提供される最大仮想メモリアドレス空間を超えるデータセットを管理できません。
仮想メモリの制限:
Linux:64テラバイト(ジャーナリング)-128テラバイト(ジャーナルなし)
Windows Server 2012 R2/Windows 8.1:64テラバイト(ジャーナリング)-128テラバイト(ジャーナルなし)
Windows(それ以外の場合):4テラバイト(ジャーナル)-8テラバイト(ジャーナルなし)
(WiredTigerストレージエンジンはこの制限の対象ではありません。)
シャードのサイズを計画するのは簡単な作業ではありません。また、それを実行するための愚かでエラーのない方法はありません。
私がしがちなのは、シャードごとに期待されるデータの一定の割合をダミーデータとして作成することです。シャードが手元にあれば、完全に埋めます。
次のステップでは、一致する数のフロントエンドサーバーで予想される負荷の同じ割合を生成します。
次に、インデックスと全体のメモリ消費量を分析します。インデックスのサイズがわかっていれば、必要な最小のRAMが必要です。十分な警告時間と適切な量のRAMを接続に使用するには、セットと他のプロセス、RAMサイズの次の適切な値に切り上げます。これにより、RAMが簡単にいっぱいにならないように、 RAM)が不十分なためにスケールアウトが多すぎて、アプリケーションがデータベースによって抑制されない場合は、適切な警告時間が表示されます。
それを説明しましょう。平均オブジェクトサイズが1 KBをわずかに下回っており、1 TBのパーティションを作成する予定ですが、テスト用に256 GBのパーティションしかないため、2億5000万のオーダーのダミードキュメントを作成します。ここで、アプリケーション用に8つのフロントエンドサーバーを計画しているとしましょう。そのうち2つをセットアップします。
次に、負荷テストツール(多数あり、この回答の範囲外です)を使用して、2つのフロントエンドサーバーに負荷を生成します。
これを実行すると、全体的なメモリ消費量、インデックスサイズ、およびワーキングセットサイズが非常に正確に示されます。
インデックスのサイズが20GBで、300の接続が確立されていることがわかったとします。つまり、21GBとしましょう。したがって、シャードにはこのRAMの4倍の値が必要であり、次の適切な値に切り上げられます(コスト効率を考慮してください)。それで、96 GBであると仮定しましょう。
ここで、1つではなく2つのシャードを使用する方が理にかなっているかどうかを確認する必要があります。それぞれシャードは48GBのRAMとMongoDBのディスク容量500GBです)。これは、より大きなSSDは、過度に高価になる可能性があります。
私はあなたが絵を得たと思います:簡単な公式はありません、あなたは単にあなたの宿題をしなければなりません;)私の短所はあなたのために働くかもしれないし、しないかもしれません。そうでない場合は、自分で解決する必要があります。
ああ、そしてシャードを計画するときに何をするか:SSDで計画します。価値があります。