0

どこにも情報がなかったのでここで質問します。

コンテキスト:
- 3 台のサーバーを使用する replicaSet アーキテクチャ。
- メイン言語としての PHP
- 画像の平均サイズは約 2Mo
- 使用法: storeFile() PHP ドライバーの関数を使用して、多くのギャラリーを mongodb に保存します。

プライマリ サーバーがクラッシュしたときとその後のストレージが心配です。
storeFile() を使用して 80Mo の 1 つのファイル全体を保存すると、クライアントはクエリを replicaSet のプライマリに送信し、データの保存を開始します。
ここで、書き込み操作が 60% 完了し、プライマリに障害が発生した場合、書き込み操作はどうなりますか?
例外が発生することはわかっていますが、それをキャッチして操作を再試行します。しかし、すでに書き込まれたデータはどうなるでしょうか?

データベースに既存のファイルがありますが、これは元の画像の一部であり、破損していますか?
または、トランザクションのように機能し、エラーが発生した場合、mongodb は操作をロールバックして例外をスローしますか?

Google グループの私のスレッドへのリンク: Google グループのスレッド

4

1 に答える 1

0

PHP MongoDB ドライバーは、失敗した GridFS への書き込みを「クリーンアップ」しようとしますが、プライマリがクラッシュした場合、プライマリにアクセスしてクリーンアップ ルーチンを実行することはできません。

したがって、データは引き続きチャンク コレクションに存在しますが、メタデータ (および実際のファイル情報) は、GridFS 書き込み全体が正常に完了するまで書き込まれないため、存在しません。

一般に、多くのフェイルオーバーが発生することはないはずなので、これは問題ではありません。ただし、これが、実際にはアクセスできない数メガバイトのデータを保存しているという実際の懸念である場合は、チャンク コレクションを反復処理して孤立したチャンクを検出する、ある種のバックグラウンド/cronjob タスクを作成する必要があります。ただし、現在作成されているチャンクを削除したくないので注意してください:)

于 2013-04-22T22:22:05.930 に答える