mongo数据库的迁移遇到的坑

  由于公司项目原因需要把大量图片导入到mongo中,于是乎用java写了个小脚本,遍历图片文件夹,把所有的图片导入mongo中,图片数量庞大100多万张。最开始单线程跑,跑了一会发现很慢,十多分钟传了几千张,一合计这得跑到猴年马月啊。分析了一下mongo服务器在本地测试环境,网络传输不是问题。那大部分时间应该消耗磁盘IO上了。于是乎启动了8个线程跑,果然速度上去了。后来又考究了下mongo批量传输,无果(哈哈哈,后面再研究)。20分钟全部导入到了mongo。  临近上线,需要把图片全部导入到云服务器上,小脚本又派上了场,但是这次很悲催,比之前单线程还慢。由于云服务器离我们很远,带宽又很小,大部分时间全消耗在网络IO上了。幸得大神提醒看有没有像mysql类似的导入导出功能。一顿百度mongo自带export和import。

mongo导出命令:mongoexport -d images -c fs.files -o /Users/admin/fs.files.json --type json
mongoexport -d images -c fs.chunks -o /Users/admin/fs.chunks.json --type json

mongo导入命令:mongoimport -d images -c fs.chunks --file /Users/admin/fs.chunks.json
mongoimport -d images -c fs.files --file /Users/admin/fs.files.json

10分钟搞定。

推到云上后,获取图片程序慢了很多,一张图片需要3-8秒钟才查出来。这叔可忍婶也忍不了啊。于是乎又陷入找问题中,本来就没用过mongo的人,各种推断。

本地是很快的只有20多毫秒。于是各种推测:

1:云服务器由于带宽慢,所以在本地请求慢。

于是乎使用curl 请求了下服务,发现同样很慢,排除了带宽问题。

2:云服务器上程序和mongo是放在不同服务器上的。服务器之间网络传输慢

云服务器之间也是内网,ping了一下,很快,排除。

3:mongo安装有问题;

对比本地mongo和云服务器上的mongo

1)云服务器上的mongo出于安全考虑加了auth认证,取消掉auth,还是很慢,排除。

2)云服务器上的mongo加了bindip,取消掉,依然很慢。排除。

忽然无解了。度之,没有类似的问题和答案。漫无边际的浏览着,忽然两个字眼入目:索引

发现了新大陆一般,查看本地mongo中是否有索引:db.fs.chunks.getIndexes(); 然后云服务器查询,果然在这藏着呢。对比之后建索引:

db.fs.files.createIndex({"_id":1},{"name":"_id_"})
db.fs.files.createIndex({"filename":1,"uploadDate":1},{"name":"filename_1_uploadDate_1"})

db.fs.chunks.createIndex({"_id":1},{"name":"_id_"});
db.fs.chunks.createIndex({"files_id":1,"n":1},{"name":"files_id_1_n_1","unique":true});

总结:mongo的export和import索引不会随着走,需要自己重新建。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

MongoDB——增加数据

建立两个对象j和t,并保存到集合中去.在例子里“”来表示是shell输入提示符j{name:"mongo"};{"name":"mongo"}t{x:3};{"x":3}db.things.save(j);db.things.

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移