MongoDB使用GridFS 实现文件的分布式存储文件,使用replica sets + sharding 后,报can’t find a chunk! 错误

发布问题 回首页

MongoDB使用GridFS 实现文件的分布式存储文件,使用replica sets + sharding 后,报can’t find a chunk! 错误

★ 0 成为第一个关注这个问题的人

问题描述:
MongoDB基于GridFS 实现文件的分布式存储,使用replica sets + sharding 后,报can’t find a chunk! 错误

环境:
linux x86 64位

client : java

主机搭建信息:
shard1 192.168.1.189
mongod shard1_1:30000
mongod shard2_1:30001
mongod config1:30002
mongs1:30005

shard2 192.168.1.189
mongod shard1_2:40000
mongod shard2_2:40001
mongs2:40005

操作步骤:
1.使用如下命令搭建 replica sets + sharding
1.1 创建目录:
[root@localhost bin]# mkdir -p /root/Desktop/md/shard1_1
[root@localhost bin]# mkdir -p /root/Desktop/md/shard2_1
[root@localhost bin]# mkdir -p /root/Desktop/md/config1

[root@localhost bin]# mkdir -p /root/Desktop/md/shard1_2
[root@localhost bin]# mkdir -p /root/Desktop/md/shard2_2
[root@localhost bin]# mkdir -p /root/Desktop/md/config2

1.2 配置replica set shard1:
./mongod –shardsvr –replSet shard1 –port 30000 –dbpath /root/Desktop/md/shard1_1 –logpath /root/Desktop/md/shard1_1/shard1_1.log –logappend –fork
./mongod –shardsvr –replSet shard1 –port 40000 –dbpath /root/Desktop/md/shard1_2 –logpath /root/Desktop/md/shard1_2/shard1_2.log –logappend –fork

用mongo 连接其中一台机器的27017 端口的mongod,初始化Replica Sets“shard1”,执行:
./mongo –port 30000
config = {_id: ‘shard1′, members: [{_id: 0, host: '192.168.1.189:30000'},{_id: 1, host: '192.168.1.189:40000'}]}
rs.initiate(config)

1.3 配置replica set shard2:
./mongod –shardsvr –replSet shard2 –port 30001 –dbpath /root/Desktop/md/shard2_1 –logpath /root/Desktop/md/shard2_1/shard2_1.log –logappend –fork
./mongod –shardsvr –replSet shard2 –port 40001 –dbpath /root/Desktop/md/shard2_2 –logpath /root/Desktop/md/shard2_2/shard2_2.log –logappend –fork

用mongo 连接其中一台机器的27017 端口的mongod,初始化Replica Sets“shard1”,执行:
./mongo –port 30001
config = {_id: ‘shard2′, members: [{_id: 0, host: '192.168.1.189:30001'},{_id: 1, host: '192.168.1.189:40001'}]}
rs.initiate(config)

1.4 启动配置服务器:
./mongod –configsvr –dbpath /root/Desktop/md/config1 –port 30002 –logpath /root/Desktop/md/config1/config.log –logappend –fork
注意,如果路径(/root/Desktop/md/config1)错误,启动失败,报错:child process failed, exited with error number 1

启动路由服务器(–chunkSize 1):
./mongos –configdb 192.168.1.189:30002 –port 30005 –logpath /root/Desktop/md/mongos.log –logappend –fork
./mongos –configdb 192.168.1.189:30002 –port 40005 –logpath /root/Desktop/md/mongos.log –logappend –fork

备注:
启动路由服务器时BadValue need either 1 or 3 configdbs
mongos启动只能绑定一个或三个配置服务器。

1.5 配置Shard Cluster
./mongo –port 30005
use admin
db.runCommand({addshard:”shard1/192.168.1.189:30000,192.168.1.189:40000″});
db.runCommand({addshard:”shard2/192.168.1.189:30001,192.168.1.189:40001″});

1.6 激活数据库及集合的分片
mongos> use admin
switched to db admin
mongos> db.runCommand({ enablesharding:”picturesDB” })
{ “ok” : 1 }
mongos> db.runCommand({ shardCollection : “picturesDB.pictures3m.chunks” , key : { files_id : 1 } })
{ “collectionsharded” : “picturesDB.pictures3m.chunks”, “ok” : 1 }

备注:
1.6.1 执行分片命令分片,使用collcetion chunks(picturesDB.pictures3m.chunks).
1.6.2 请切换到admin数据库再 进行分片操作。

访问服务器端口30005 ,40005 。

2.使用java存储图片(存储4000张3M图片),大概代码如下(前面存了1000张,没分片前是正常的):
for(int i = 1000 ; i < 5000; i++)
{
try {
// 存储fs的根节点
GridFS gridFS = new GridFS(db, "picture3m");
GridFSInputFile gfs = gridFS.createFile(new File(System.getProperty("user.dir") + "/3m_image.JPG");
gfs.put("aliases", Integer.toString(i));
gfs.put("filename", Integer.toString(i));
gfs.put("contentType", "3M_image.jpg".substring(filename.lastIndexOf(".")));
gfs.save();
} catch (Exception e) {
e.printStackTrace();
System.out.println("存储文件时发生错误!!!");
}
System.out.println("finish i = " + i);
}

3.使用java获取图片
File file = new File("D:\\file\\3M-1273.jpg");
GridFSDBFile gf = p.retrieveFileOne(, );//".jpg"
try {
// 获取fs的根节点
GridFS gridFS = new GridFS(db, "picture3m");
GridFSDBFile dbfile = gridFS.findOne("1273");
if (dbfile != null) {
return dbfile;
}
} catch (Exception e) {
// TODO: handle exception
}
long l = gf.writeTo(file);
System.out.println("result = " + l );

问题:
步骤执行到第三步时,获取id为1275的图片为null,并且报 can't find a chunk! file id: 557847e40e03135574e2fe34 chunk: 9 。

问题补充:
1.获取1274图片已经不完整,只有半张图片。

请帮忙查看下,是内部bug,还是其它问题?

miyatang 在大约 之前添加了 状态
  • 提问于
  • Answers6 个
  • 浏览 966 次
  • 最新活跃于

6 个回答6

0
eshujiushiwo answered about

HI
正如TJ所说,复制集的成员数应为3个。
应该是查询请求无法分发到目标shard分片的可用primary导致。
这时候还可以看下该mongos的报错,来进一步定位具体原因。

0
zhongbiqing@163.com answered about

问题已经解决,由原来的复制集由原来的两个改成三个就好了。

0
TJ answered about

是不是你的磁盘满了

zhongbiqing@163.com 在大约 之前评论了回答
1 Comment
  • 磁盘没有满。 [root@kenny config1]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_kenny-lv_root 50G 49G 0 100% / tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 485M 37M 423M 9% /boot /dev/mapper/vg_kenny-lv_home 240G 104G 125G 46% /home -

0
zhongbiqing@163.com answered about

设置下mongodb的write concern为journal后,再尝试下。

client 设置journal后报下面异常:
com.mongodb.MongoException: new file allocation failure

0
alpha answered about

设置下mongodb的write concern为journal后,再尝试下。

zhongbiqing@163.com 在大约 之前评论了回答
1 Comment
  • Page 1 of 2
  • 1
  • 2

问题状态

  • Open

类别

4个参与者

MongoDB使用GridFS 实现文件的分布式存储文件,使用replica sets + sharding 后,报can’t find a chunk! 错误》有14个想法

  1. 谢答,但个人认为不准确,1.mr我觉得不适合实时计算,更贴合后期数据统计需求,2.aggregate必须支持自定义函数,就好像你定义个abc(1,2)一样肯定是计算了,现在的问题是abc(1,2)这个参数我想传个字段进去,比如abc($qty,2)这样….他就不好使了….难道大家没有在aggregate中用字段进行计算的经历么?

发表评论