2

テスト: -レプリカ セット
を直接使用して 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 のようにフォーマットされます)

誰かがそれを解決するのを手伝ったり、私に説明したりできますか?

4

0 に答える 0