测试:
- 直接使用副本集插入200张图像(300-800Ko / img)
- 使用相同的副本设置作为碎片插入200张图像(300-800ko / img)。
我意识到这些操作的执行时间确实不同...... - 使用副本集:约30秒内200张图片 - 使用分片:大约3秒./picture =>这些200张照片大约7-8分钟 !!!
==>我真的不明白为什么这些插件在分片时速度太慢......< ==
条件:
- Php司机
- GridFS:只有fs.chunks分片
- 写关注:多数人
- 只有1个线程:使用PHP,我解析一个包含图片路径的数组,然后使用GridFS将图片存储在MongoDB中。
资源:
(所有服务器都是Proxmox板式OpenVZ VM(全部在同一台机器上(用于测试)))
3 mongod :6Go RAM(插入时为50%),1CPU(插入时空闲率为99%)
2 arbiters :512Mo RAM(100Mo used),1CPU(100%空闲......)
1 config :2Go RAM(使用200Mo),1个CPU(100%空闲......)
1 mongos :512Mo RAM(100Mo使用),1CPU(插入时空闲率为98%)
备注:
插入时使用分片:
- 所有mongod,mongos和config_svr实例的~1 - >> 5%CPU利用率
- mongos / config_svr的~5%RAM利用率
- 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() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("518372e807be4a15fb391fab") } shards: { "_id" : "rs0", "host" : "rs0/192.168.36.101:27017,192.168.36.102:27017,192.168.36.103:27017" } databases: { "_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 shard key: { "files_id" : 1 } chunks: 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,port,priority,RS_name,...
在 repica set archi。 =>我使用副本集的名称和 3个第一个服务器构建连接池,按优先级排序。
在 分片状态。 =>我使用所有mongos 构建连接池
(连接池中的所有地址都格式化为ip:port)
有人可以帮我解决或向我解释一下吗?