再插入1000W的数据,既然丢失100W多数据。太夸张了吧。
是我操作上的问题,还是其他原因。在网络中,也有一些人发生过数据严重丢失。
1、我的环境
系统 window 20003
内存 1G
硬盘 1T 5700转
2、打算采用自动分片架设海量存储数据。
JSON结构
id 建立索引
url 建立索引
插入1000W数据,花费5个小时左右。
测试结果
查询一条记录,在100毫秒左右。
但发现一个非常严重的问题。数据严重丢失。数据库中只有8 963 724条数据。其他数据呢?
不见了?
贴一下相关代码。
Mongo m = null;
try
{
//连接数据库(三种连接方式):
m = new Mongo("127.0.0.1", 25017);
//选择数据库,如果没有这个数据库的话,会自动建立
DB db = m.getDB("dnt_mongodb");
//列出所有数据库名,不过发现,如果数据库里面是没有数据的话,并不会被列出来
System.out.println("数据库列表:\n"+m.getDatabaseNames());
DBCollection collection = db.getCollection("posts1");
System.out.println("统计文档:" + collection.count());
BasicDBObject document = new BasicDBObject();
document.put("id", 1);
collection.createIndex(document);
document = new BasicDBObject();
document.put("url", 1);
collection.createIndex(document);
for(int i = 1; i <= 10000000; i++){
System.out.println(i);
document = new BasicDBObject();
document.put("id", i);
document.put("url", "http://www.agrilink.cn/NewNongSou/GNZX/index2011.html?OK=" + i);
//将新建立的document保存到collection中去
collection.insert(document);
}
System.out.println("Done");
}
catch(Exception error)
{
error.printStackTrace();
} finally {
m.close();
}
数据库中数据结果
mongos> use dnt_mongodb
switched to db dnt_mongodb
mongos> db.posts1.stats()
{
"sharded" : true,
"flags" : 1,
"ns" : "dnt_mongodb.posts1",
"count" : 8963724,
"numExtents" : 65,
"size" : 932223312,
"storageSize" : 1175728128,
"totalIndexSize" : 1595456464,
"indexSizes" : {
"_id_" : 290926608,
"id_1" : 250226480,
"url_1" : 1054303376
},
"avgObjSize" : 103.99955554187076,
"nindexes" : 3,
"nchunks" : 42,
"shards" : {
"shard0000" : {
"ns" : "dnt_mongodb.posts1",
"count" : 1861097,
"size" : 193554088,
"avgObjSize" : 104,
"storageSize" : 272621568,
"numExtents" : 16,
"nindexes" : 3,
"lastExtentSize" : 51974144,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 398048560,
"indexSizes" : {
"_id_" : 60396112,
"id_1" : 51950304,
"url_1" : 285702144
},
"ok" : 1
},
"shard0001" : {
"ns" : "dnt_mongodb.posts1",
"count" : 1857613,
"size" : 193191752,
"avgObjSize" : 104,
"storageSize" : 272621568,
"numExtents" : 16,
"nindexes" : 3,
"lastExtentSize" : 51974144,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 282807840,
"indexSizes" : {
"_id_" : 60281648,
"id_1" : 51852192,
"url_1" : 170674000
},
"ok" : 1
},
"shard0002" : {
"ns" : "dnt_mongodb.posts1",
"count" : 1829738,
"size" : 190288768,
"avgObjSize" : 103.99782263908821,
"storageSize" : 220647424,
"numExtents" : 15,
"nindexes" : 3,
"lastExtentSize" : 43311104,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 402496304,
"indexSizes" : {
"_id_" : 59423168,
"id_1" : 51108176,
"url_1" : 291964960
},
"ok" : 1
},
"shard0003" : {
"ns" : "dnt_mongodb.posts1",
"count" : 3415276,
"size" : 355188704,
"avgObjSize" : 104,
"storageSize" : 409837568,
"numExtents" : 18,
"nindexes" : 3,
"lastExtentSize" : 74846208,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 512103760,
"indexSizes" : {
"_id_" : 110825680,
"id_1" : 95315808,
"url_1" : 305962272
},
"ok" : 1
}
},
"ok" : 1
}
mongos>
具体的配置步骤
创建configs服务器
mongod --dbpath "c:\mongodb\data\configs" --port 23017
创建mongos服务器 并指定依赖的配置服务器 (mongos依赖于配置服务器,mongos查询的分片信息都存储在configs中)
mongos --port 25017 --configdb 127.0.0.1:23017
创建多个分片服务器 (负责数据存储)
mongod --port 27017 --dbpath "c:\mongodb\data\dbs\shard27017"
mongod --port 27018 --dbpath "d:\mongodb\data\dbs\shard27018"
mongod --port 27019 --dbpath "f:\mongodb\data\dbs\shard27019"
mongod --port 27020 --dbpath "e:\mongodb\data\dbs\shard27020"
连接mongos服务器添加shard27017|shard27018|shard27019|shard27020分片服务器到configs服务器中。
mongo localhost:25017/admin
db.runCommand( { addshard : "localhost:27017", allowLocal : 1} )
db.runCommand( { addshard : "localhost:27018", allowLocal : 1} )
db.runCommand( { addshard : "localhost:27019", allowLocal : 1} )
db.runCommand( { addshard : "localhost:27020", allowLocal : 1} )
创建相应数据库并设置其"可以sharding",对dnt_mongodb库启用分片功能
db.runCommand({"enablesharding":"dnt_mongodb"})
注意:需要分片的集合 的shard key必须是索引键, (我们也可以在mongos为分片foo集合创建索引)
db.runCommand( { shardcollection : "dnt_mongodb.posts1", key : {_id : 1}, unique: true } )
至此自动分片就创建完成了,可以在mongos或configs服务器查询分片信息。
db.printShardingStatus()
今天,同事测试了1100W数据。没问题。一条数据都没有丢。先标记保留。有时间在测试一次。
2013-05-29 晚
硬件环境:
CPU 双核 硬盘:7200转 内存:2G
软件环境:
myeclipse mongodb2.5.jar mongodb2.4.3
测试规则(一):
没有采用分片,进行100W数据插入操作。字段有ID和URL。
测试结果:
没有出现数据丢失。
测试规则(二):
没有采用分片,进行1000W数据插入操作。字段有ID和URL。
测试结果:
mongodb关闭。写入I/O错误。