テスト: -レプリカ セット
を直接使用して 200 個の画像 (300-800ko/img) を挿入します。 -シャードと同じレプリカ セット
を使用して 200 個の画像 (300-800ko/img) を挿入します。
これらの操作の実行時間はまったく異なります...
-レプリカ セットを使用した場合:約 30 秒で 200 枚の写真。
-シャーディングあり:約 3 秒/画像=>この 200 枚の画像で約 7 ~ 8 分!!!
==> シャーディングでこれらの挿入がなぜこんなに遅いのか、私は本当に理解していません... <==
条件:
- Php ドライバー
- GridFS : fs.chunks のみシャード
- 書き込み懸念 : 過半数
- 1 スレッドのみ : PHP で、写真へのパスを含む配列を解析し、GridFS を使用して MongoDB に写真を保存します。
リソース:
(すべてのサーバーは Proxmox プレートフォーム上の OpenVZ VM です (すべて同じマシン上 (テスト用)))
3 mongod : 6Go RAM (挿入中に 50%)、1CPU (挿入中に 99% アイドル状態...)
2アービター: 512Mo RAM (100Mo 使用), 1CPU(100% アイドル ...)
1構成: 2Go RAM (200Mo 使用), 1 CPU(100% アイドル ...)
1 mongos : 512Mo RAM (100Mo 使用), 1CPU (挿入中は 98% アイドル状態です...)
注:シャーディングによる
挿入中:
- すべての mongod、mongos、および config_svr インスタンスの CPU 使用率が ~1->5%
- mongos/config_svr の RAM 使用率が ~5%
- mongod の ~50%
-ネットワーク スループット(mongod で取得されたメトリック) : mongos <--> プライマリ mongod: ~300Kb/s
シャーディングなしで挿入中(レプリカを直接設定):
-ネットワーク スループット(mongod で取得したメトリック): ホスティング ピクチャ サーバー <--> プライマリ mongod: ~30Mb/s
Php クラス: pastebin.com_[mongodb-class] (MongoDB とやり取りするためのすべてのコードが含まれています)
クラスの先頭に追加しました:
mongoLog::setLevel(mongoLog::all)
mongoLog::setModule(mongoLog::all)
display_errors=1
error_reporting=-1
クライアントはこのクラスの storefile() メソッドを直接呼び出し
ます...結果ページはここ: pastebin.com_[resultPage]
挿入されるドキュメントは次のように単純です: MongoID, picture_binaries_dataメタデータ
はなく、保存プロセス中に MongoDB が生成するものだけです。
mongos でのsh.status()の結果は次のとおりです。
mongos> sh.status() --- シャーディング ステータス --- シャーディング バージョン: { "_id": 1, 「バージョン」: 3, "minCompatibleVersion": 3, 「現在のバージョン」: 4, "clusterId" : ObjectId("518372e807be4a15fb391fab") } シャード: { "_id": "rs0", "ホスト": "rs0/192.168.36.101:27017,192.168.36.102:27017,192.168.36.103:27017" } データベース: { "_id": "admin", "partitioned": false, "primary": "config" } { "_id": "test"、"partitioned": false、"primary": "rs0" } { "_id": "bepics_gallery", "partitioned": false, "primary": "rs0" } { "_id": "bepics_images", "partitioned": true, "primary": "rs0" } bepics_images.fs.chunks シャードキー: { "files_id" : 1 } チャンク: rs0 9 { "files_id" : { "$minKey" : 1 } } -->> { "files_id" : ObjectId("5183926028d40965190000ea") } on : rs0 { "t" : 1, "i" : 1 } { "files_id" : ObjectId("5183926028d40965190000ea") } -->> { "files_id" : ObjectId("5183a1be28d409051e000004") } on : rs0 { "t" : 1, "i" : 3 } { "files_id" : ObjectId("5183a1be28d409051e000004") } -->> { "files_id" : ObjectId("5183a2a728d409051e00008f") } on : rs0 { "t" : 1, "i" : 5 } { "files_id" : ObjectId("5183a2a728d409051e00008f") } -->> { "files_id" : ObjectId("5183b70328d409cc1e00008f") } on : rs0 { "t" : 1, "i" : 7 } { "files_id" : ObjectId("5183b70328d409cc1e00008f") } -->> { "files_id" : ObjectId("5183c6f728d409e526000037") } on : rs0 { "t" : 1, "i" : 9 } { "files_id" : ObjectId("5183c6f728d409e526000037") } -->> { "files_id" : ObjectId("5183c76028d409e526000076") } on : rs0 { "t" : 1, "i" : 11 } { "files_id" : ObjectId("5183c76028d409e526000076") } -->> { "files_id" : ObjectId("5183c7cb28d409ea2600001f") } on : rs0 { "t" : 1, "i" : 13 } { "files_id" : ObjectId("5183c7cb28d409ea2600001f") } -->> { "files_id" : ObjectId("5183c84e28d409ea2600006d") } on : rs0 { "t" : 1, "i" : 15 } { "files_id" : ObjectId("5183c84e28d409ea2600006d") } -->> { "files_id" : { "$maxKey" : 1 } } on : rs0 { "t" : 1, "i" : 16 }
クラスターに接続するには、IP、ポート、優先度、RS_name などのサーバー構成を格納する MySQL テーブルを使用します。=>レプリカ セットの名前で接続プールを構築し、最初の3 つのサーバーを優先度順に並べ替えます。シャーディング アーキで
。=>すべての mongosで接続プールを構築します。
(接続プール内のすべてのアドレスは、ip:port のようにフォーマットされます)
誰かがそれを解決するのを手伝ったり、私に説明したりできますか?