MongoDB2.0.1 出现严重数据丢失问题
是我操作上的问题,还是其他原因。在网络中,也有一些人发生过数据严重丢失。
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()