0

監視していない間にディスク容量の 95% まで増加した単一ホスト データベースがあります。この状況を改善するために、古いレコードを最大のコレクションから自動的に削除するプロセスを作成したため、データ使用量はディスク容量の約 40% に減少しました。データサイズが事前に割り当てられたファイルのサイズに近くならない限り安全だと思っていましたが、1 週間後には間違っていることが証明されました。

Wed Jan 23 18:19:22 [FileAllocator] allocating new datafile /var/lib/mongodb/xxx.101, filling with zeroes...
Wed Jan 23 18:25:11 [FileAllocator] done allocating datafile /var/lib/mongodb/xxx.101, size: 2047MB,  took 347.8 secs
Wed Jan 23 18:25:14 [conn4243] serverStatus was very slow: { after basic: 0, middle of mem: 590, after mem: 590, after connections: 590, after extra info: 970, after counters: 970, after repl: 970, after asserts: 970, after dur: 1800, at end: 1800 }

これは : の出力です(数値はスケールのためにMB 単位db.stats()であることに注意してください)

> db.stats(1024*1024)
{
    "db" : "xxx",
    "collections" : 47,
    "objects" : 189307130,
    "avgObjSize" : 509.94713418348266,
    "dataSize" : 92064,
    "storageSize" : 131763,
    "numExtents" : 257,
    "indexes" : 78,
    "indexSize" : 29078,
    "fileSize" : 200543,
    "nsSizeMB" : 16,
    "ok" : 1
}

質問: MongoDB が新しいデータファイルを割り当てないようにするにはどうすればよいですか?

新しいディスクをインストールする必要があるため、実行repairは困難です。ランニングはcompact役に立ちますか?はいの場合、定期的に実行する必要がありますか?また、いつ実行する必要があるかをどのように判断できますか?

更新:ここで何か基本的なことが欠けていると思います...データファイル、エクステント、コレクション、およびデータベース間の接続、および必要に応じてスペースがどのように割り当てられるかについて誰か詳しく教えてください。

4

1 に答える 1

2
  1. 2.2.2 へのアップグレード - 2.2.0 にはレプリケーションでべき等バグがあり、本番環境には推奨されなくなりました。
  2. 一般的な情報については、こちらをご覧くださいhttp://docs.mongodb.org/manual/faq/storage/#faq-disk-size
  3. mongodb からスペースを回復する唯一の方法は、ネットワークを介して新しいノードを同期することです。この場合、ドキュメントは新しいファイル システムを介してコピーされ、断片化せずに新たに保存されます。または修復コマンドを使用するには - ただし、そのためには、ディスクで使用しているディスク容量の 2 倍が必要です。データ ファイルがコピーされ、デフラグされ、圧縮され、元のファイルにコピーされます。圧縮コマンドは名前が悪く、デフラグのみを行います。mongo からディスク領域を回復することはありません。
  4. 今後は、usePowerOf2Sizes コマンドを使用します (2.2.x の新機能) http://docs.mongodb.org/manual/reference/command/collMod/ そのコマンドを使用して 800 バイトのドキュメントを割り当てると、1024 バイトが割り当てられます。ディスク。次に、そのドキュメントを削除して新しいドキュメント (たとえば 900 バイト) を挿入すると、そのドキュメントは 1024 バイトのスペースに収まります。このオプションを有効にしないと、800 バイトのドキュメントがディスク上に 850 バイトしかない可能性があります。したがって、それを削除して 900 バイトのドキュメントを挿入すると、新しいスペースを割り当てる必要があります。そして、それが削除された場合、最終的に 2 つの空き領域 - 850 バイトと 950 バイトが結合されない (compact または repair が使用されない限り) - になるため、1000 バイトのドキュメントを挿入し、ディスクの別のチャンクを割り当てる必要があります。usePowerOf2Sizes は、標準のバケット サイズを使用することで、この状況を大幅に改善します。
于 2013-01-25T11:09:59.877 に答える