测试:
- 直接使用副本集
插入 200 个图像(300-800Ko/img) - 使用与 shard 相同的副本集插入 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, “最小兼容版本”: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”:“测试”,“分区”:假,“主”:“rs0”} {“_id”:“bepics_gallery”,“分区”:假,“主要”:“rs0”} {“_id”:“bepics_images”,“分区”:真,“主”:“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 }
为了连接到集群,我使用 MySQL 表来存储服务器配置,如 ip、端口、优先级、RS_name ......
在repica set archi 中。=> 我用副本集的名称和前3 个服务器的名称构建连接池,按优先级排序。
在分片存档中。=> 我用所有 mongos构建连接池。
(连接池中的所有地址都被格式化为 ip:port)
任何人都可以帮我解决它或向我解释吗?