注:本文是研究Mongodb分布式数据存储的副产品,通过本文的相关步骤可以将一个大表中的数据分布到几个mongo服务器上。
MongoDB的1.6版本中auto-sharding功能基本稳定并可以尝试放到生产环境下使用。因为其是auto-sharding,即mongodb通过mongos(一个集群环境配置工具)自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。
一个mongodb集群包括一些shards(包括一些mongod进程),mongos路由进程,一个或多个config服务器
(注:本文的测试用例需求64位的mongo程序,因为我在32位的mongo没成功过)。
下面是一些相关词汇说明:
Shards : 每一个shard包括一个或多个服务和存储数据的mongod进程(mongod是MongoDB数据的核心进程)典型的每个shard开启多个服务来提高服务的可用性。这些服务/mongod进程在shard中组成一个复制集
Chunks: Chunk是一个来自特殊集合中的一个数据范围,(collection,minKey,maxKey)描叙一个chunk,它介于minKey和maxKey范围之间。例如chunks 的maxsize大小是100M,如果一个文件达到或超过这个范围时,会被切分到2个新的chunks中。当一个shard的数据过量时,chunks将会被迁移到其他的shards上。同样,chunks也可以迁移到其他的shards上
Config Servers : Config服务器存储着集群的metadata信息,包括每个服务器,每个shard的基本信息和chunk信息Config服务器主要存储的是chunk信息。每一个config服务器都复制了完整的chunk信息。
接着看一下要配置的测试环境信息:
模拟2个shard服务和一个config服务, 均运行在10.0.4.85机器上,只是端口不同
Shard1:27020
Shard2:27021
Config:27022
Mongos启动时默认使用的27017端口
在C,D,E磁盘下分别建立如下文件夹:
mongodb\bin
mongodb\db
然后用CMD命令行依次打开相应文件夹下的mongd文件:
c:\mongodb\bin\mongod --dbpath c:\mongodb\db\ --port 27020
d:\mongodb\bin\mongod --dbpath d:\mongodb\db\ --port 27021
e:\mongodb\bin\mongod --configsvr --dbpath e:\mongodb\db\ --port 27022 (注:config配置服务器)
启动mongos时,默认开启了27017端口
e:\mongodb\bin\mongos --configdb 10.0.4.85:27022
然后打下mongo:
E:\mongodb\bin>mongo 回车 (有时加端口会造成下面的addshard命令出问题)
> use admin
switched to db admin
> db.runCommand( { addshard : "10.0.4.85:27020", allowLocal : 1, maxSize:2 , minKey:1, maxKey:10} )
--添加sharding,maxsize单位是M,此处设置比较小的数值只为演示sharding效果
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.runCommand( { addshard : "10.0.4.85:27021", allowLocal : 1, minKey:1000} )
{ "shardAdded" : "shard0001", "ok" : 1 }
注:如果要移除sharding,可用下面写法
db.runCommand( { removeshard : "localhost:10000" } );
> db.runCommand({listshards:1}); 查看shard节点列表
{
"shards" : [
{
"_id" : "shard0000",
"host" : "10.0.4.85:27020"
},
{
"_id" : "shard0001",
"host" : "10.0.4.85:27021"
}
],
"ok" : 1
}
接下来创建相应数据库并设置其"可以sharding",新建自动切片的库user001:
> config = connect("10.0.4.85:27022")
> config = config.getSisterDB("config")
> dnt_mongodb=db.getSisterDB("dnt_mongodb");
dnt_mongodb
> db.runCommand({enablesharding:"dnt_mongodb"})
{ "ok" : 1 }
注:一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片(下面会设置),否则一个数据集的所有数据将放在一个分片上。
> db.printShardingStatus();
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "10.0.4.85:27020" }
{ "_id" : "shard0001", "host" : "10.0.4.85:27021" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "dnt_mongodb", "partitioned" : true, "primary" : "shard0000" }
> db.runCommand( { shardcollection : "dnt_mongodb.posts1", key : {_id : 1}, unique: true } )
{ "collectionsharded" : "dnt_mongodb.posts1", "ok" : 1 }
--使用shardcollection 命令分隔数据集,key自动生成。
如果要进行GridFS sharding,则需进行如下设置:
db.runCommand( { shardcollection : "test.fs.chunks", key : { _id : 1 } } )
{"ok" : 1} ,更多内容参见http://eshilin.blog.163.com/blog/static/13288033020106215227346/
> db.printShardingStatus()
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "localhost:27020" }
{ "_id" : "shard0001", "host" : "localhost:27021" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "user001", "partitioned" : true, "primary" : "shard0000" }
dnt_mongodb.posts1e chunks:
{ "name" : { $minKey : 1 } } -->> { "name" : { $maxKey :
1 } } on : shard0000 { "t" : 1000, "i" : 0
下面我用一个工具来批量向dnt_mongodb数据库的 posts1表中导入数据,大约是16万条数据。导入过程中mongos会显示类似如下信息:
Tue Sep 07 12:13:15 [conn14] autosplitting dnt_mongodb.posts1 size: 47273960 shard: ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 1|0 min: { _id: MinKey } max: { _id: MaxKey } on: { _id: 19 }(splitThreshold 47185920)
Tue Sep 07 12:13:15 [conn14] config change: { _id: "4_85-2010-09-07T04:13:15-0", server: "4_85", time: new Date(1283832795994), what: "split", ns: "dnt_mongodb.posts1", details: { before: { min: { _id: MinKey }, max: { _id: MaxKey } }, left: { min: { _id: MinKey }, max: { _id: 19 } }, right: { min: { _id: 19 }, max: {_id: MaxKey } } } }
Tue Sep 07 12:13:16 [conn14] moving chunk (auto): ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 1|1 min: { _id: MinKey } max: { _id: 19 } to: shard0001:10.0.4.85:27021 #objects: 0
Tue Sep 07 12:13:16 [conn14] moving chunk ns: dnt_mongodb.posts1 moving ( ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 1|1 min: { _id: MinKey }max: { _id: 19 }) shard0000:10.0.4.85:27020 -> shard0001:10.0.4.85:27021
Tue Sep 07 12:13:23 [WriteBackListener] ~ScopedDBConnection: _conn != null
Tue Sep 07 12:13:23 [WriteBackListener] ERROR: splitIfShould failed: ns: dnt_mongodb.posts1 findOne has stale config
Tue Sep 07 12:13:28 [WriteBackListener] autosplitting dnt_mongodb.posts1 size: 54106804 shard: ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 2|1min: { _id: 19 } max: { _id: MaxKey } on: { _id: 71452 }(splitThreshold 47185920)
Tue Sep 07 12:13:28 [WriteBackListener] config change: { _id: "4_85-2010-09-07T04:13:28-1", server: "4_85", time: new Date(1283832808738), what: "split", ns: "dnt_mongodb.posts1", details: { before: { min: { _id: 19 }, max: { _id: MaxKey }}, left: { min: { _id: 19 }, max: { _id: 71452 } }, right: { min: { _id: 71452 }, max: { _id: MaxKey } } } }
在完成自动sharding之后,可以使用mongo看一下结果:
> use dnt_mongodb
switched to db dnt_mongodb
> show collections
posts1
system.indexes
> db.posts1.stats()
{
"sharded" : true,
"ns" : "dnt_mongodb.posts1",
"count" : 161531,
"size" : 195882316,
"avgObjSize" : 1212.6608267143768,
"storageSize" : 231467776,
"nindexes" : 1,
"nchunks" : 5,
"shards" : {
"shard0000" : {
"ns" : "dnt_mongodb.posts1",
"count" : 62434,
"size" : 54525632,
"avgObjSize" : 873.3323509626165,
"storageSize" : 65217024,
"numExtents" : 10,
"nindexes" : 1,
"lastExtentSize" : 17394176,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 2179072,
"indexSizes" : {
"_id_" : 2179072
},
"ok" : 1
},
"shard0001" : {
"ns" : "dnt_mongodb.posts1",
"count" : 99097,
"size" : 141356684,
"avgObjSize" : 1426.4476623913943,
"storageSize" : 166250752,
"numExtents" : 12,
"nindexes" : 1,
"lastExtentSize" : 37473024,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 3424256,
"indexSizes" : {
"_id_" : 3424256
},
"ok" : 1
}
},
"ok" : 1
}
通过上面的结果,可以出现16万条记录均分在了两个sharding上,其中shard0000中有62434条,shard0001中有99097条。下面看一下这两个sharding-chunk的分布情况(图中的错误提示‘输入字符串格式不正确’主要因为运行环境与编译程序使用的环境不同,一个是64,一个是32位系统):
可以看到数据被按区间自动分割开了,有点像sqlserver的数据分区表,只不过这是自动完成的(目前我没找到可以手工指定区间上下限的方式,如有知道的TX可以跟我说一下)。当然在本文中的测试中,共有5个chunk,其中4个位于shard0001,这种情况可以在每次测试过程中会发生变化,包括两个sharding被分配的记录数。另外就是在mongodb移动过程前后会在shard0000上生成一个文件夹,里面包括一些bson文件,名字形如(表格+日期等信息):
该文件主要包括一些数据库,表结构及相关记录等信息,我想应该是用于数据恢复备份啥的。
相关推荐
### 基于MongoDB的分布式地质灾害数据存储策略 #### 摘要与背景 随着全球定位系统(GPS)设备、智能手机等新技术的应用以及各类传感器、高清图像和视频的广泛应用,数据量呈现指数级增长趋势。对于地质灾害数据而...
当前,随着新技术的应用,如全球定位系统设备、智能手机、传感器、高清晰度图像和视频的使用,数据的增长呈现指数级,因此亟需开辟新的数据存储、分析方法和模式。 ### MongoDB特性 MongoDB是一种NoSQL数据库,它...
基于MongoDB的分布式高并发日志系统的设计 日志系统在完整的信息系统中扮演着重要的角色,它不仅可以帮助挖掘用户的通用行为模式来提高服务质量,还能为系统的优化和结构调整提供理论基础。在高并发系统访问的场景...
MongoDB是一种基于分布式文件存储的开源数据库系统,它在处理大量数据时表现出高效、可扩展性和高可用性。MongoDB采用JSON(JavaScript Object Notation)文档格式存储数据,这种格式灵活且易于理解,使得它在大数据...
【基于MongoDB分布式集群架构的日志系统及分片方法】 MongoDB是一种流行的开源文档数据库,以其灵活性、可扩展性和高性能而被广泛应用于日志管理、大数据处理和其他领域。本技术方案涉及利用MongoDB的分布式集群...
MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像...
在参考文献中提到的云计算环境下对Web数据挖掘技术的研究,以及对海量数据挖掘的优化方法探讨,都与MongoDB作为数据存储和处理的工具紧密相关。这些研究可能涉及如何在大规模数据集上有效地应用MongoDB,以及如何...
基于 MongoDB 的 BESIII 分布式计算记账系统的研究与实现 本文研究了基于 MongoDB 的 BESIII 分布式计算记账系统的设计和实现。该系统旨在解决高能物理实验中海量数据的处理和分析问题。为满足实验的需求,系统采用...
《基于MongoDB分布式数据库集群的斗鱼弹幕采集系统设计》 在当今互联网时代,实时互动已经成为各种在线平台的重要组成部分,尤其是直播平台。斗鱼作为知名的直播网站,其弹幕功能为用户提供了丰富的互动体验。本...
随着油田测井数据存储管理面临的挑战,如磁带文件的读取难度增加、维护成本上升以及数据丢失的风险,基于MongoDB的分布式数据库系统应运而生。MongoDB是一种介于关系型数据库和非关系型数据库之间的文档存储型数据库...
这是实现基于MongoDB的企业分布式图片服务系统的关键技术之一。 为了实现分布式部署,本文提出的应用系统采用了MongoDB的分片集群模式。分片集群允许数据库水平扩展,通过多个节点共享数据,从而提高系统的整体性能...
MongoDB五分钟教程:MongoDB Shell入门 基于MongoDB进行分布式数据存储的步骤 MongoDB分布式存储的MapReduce并行查询 实例:MongoDB与Tomcat的结合更便捷
首先,分布式云存储数据管理是一种新型的数据存储方式,它与传统的基于关系型数据库的存储管理方式相比,具有显著的性能优势。这是因为非关系型数据库通常不需要固定的表结构,从而避免了数据库之间的连接操作,减少...
MongoRocks 是 MongoDB 对分布式事务的实现,基于 RocksDB 的 Timestamp Based Txn,提供高性能和高可用性的分布式事务。 DDS 对 MongoDB 的增强 DDS 团队对 MongoDB 的高层设计进行了增强,实现了高性能的分布式...
MongoDB的分布式分片群集(Sharding Cluster)是一种针对大数据量场景的高效扩展解决方案。在MongoDB中,分片(Sharding)是通过将数据分布在多台服务器上来实现水平扩展,以处理海量数据和高并发请求。这种架构通常...
根据提供的文件内容,这篇文章主要探讨了在云计算环境下,如何基于MongoDB搭建GML(Geography Markup Language)分布式集群环境。接下来,我们将详细解析文章中涉及的关键知识点。 ### 分布式系统与分布式开发 ...
为了解决这一问题,本文提出了一种基于MongoDB的数据存储与共享方案,并为第三方提供Rest接口,通过仿真分析验证了方案的有效性。接下来,我们将详细探讨这一方案及其关键技术。 首先,MongoDB作为NoSQL数据库的一...
在之前的文章中介绍了如何对关系型数据数据通过auto-sharding进行分布式数据存储,今天介绍如何对物理文件(小文件,基本小于100K)进行分布式存储。接着看一下要配置的测试环境(与前一篇中类似):模拟2个shard服务...