- 浏览: 401066 次
文章分类
最新评论
-
tedeum:
美帝人民不为钱写代码是因为万恶的资本主义社会保障制度
读《20个月赚130亿》有感 -
novembersky:
还好你没相信那个大饼
谁坑了程序员的职业道德?送给初入职的码农,和宣传奴性的领导。 -
禀圣含华:
也不要着急进一家公司,就因为那公司急着招人。。急着招人背后又是 ...
谁坑了程序员的职业道德?送给初入职的码农,和宣传奴性的领导。 -
haohao-xuexi02:
每个码奴辛辛苦苦最后,还不能干脆的走。。各种被坑。。。
找工作 ...
谁坑了程序员的职业道德?送给初入职的码农,和宣传奴性的领导。 -
hot002:
BuN_Ny 写道真实项目中的6种人:1.怂恿者2.批评者3. ...
一个优秀创业团队需要的6种人
MongoDB 分布式操作——分片操作
MongoDB 分布式操作——分片操作
描述:
像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示:
所谓的片,其实就是一个单独的MongoDB进程,它可以运行在不同的节点上,也可以运行在同一节点但监听不同的端口。同一个集合的数据可能在每个片中都存储的有数据,但它们在逻辑上整合成一个整体。分片的依据往往是根据表中的某一列或者是集合中的某一 组属性。且分片是系统自动的,但是分片的依据需要用户自己指定,分片的依据称之为“片键”。常见的片键选择为“随机片键”或者是“递增片键”。如果使用递增片键,数据的分布则会按照一定的顺序来写入数据,即当一个节点写满才会写入到下一个片键。而如果使用随机片键,数据则可能在任何一个片中都有数据。
对于分布式中片的管理(片与片之间的通信),MongoDB中通过mongos进程来进行管理,客户端对数据的操作,都由mongos进程来处理。对于节点、分片的管理,MongoDB由配置服务器来管理,配置服务器其实也是一个单独MongoDB进程。
那么,一般在什么时候使用分片呢?在单个节点的磁盘不足时会分片,另外,当单个mongod不能满足写数据的性能要求时,可以使用分片;当单台服务器内存太小,将大量的数据放到内存中速度会很慢,为了提高性能,我们可以使用分片操作。
以下是对于MongoDB分片操作的实验:
操作环境:
Win8 64位操作系统,虚拟机CentOS 32位操作系统。MongoDB 2.4.5
实验步骤:
(1)启动配置服务器(放置一些元数据):
[root@h3 dbs]# mongod -dbpath /var/lib/mongo/dbs/config --nojournal --port 20000 Mon Aug 12 13:36:25.999 [initandlisten] MongoDB starting : pid=22951 port=20000 dbpath=/var/lib/mongo/dbs/config 32-bit host=h3 Mon Aug 12 13:36:26.001 [initandlisten] Mon Aug 12 13:36:26.002 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary . Mon Aug 12 13:36:26.003 [initandlisten] ** 32 bit builds are limited to le ss than 2GB of data (or less with --journal). Mon Aug 12 13:36:26.004 [initandlisten] ** Note that journaling defaults t o off for 32 bit and is currently off. Mon Aug 12 13:36:26.005 [initandlisten] ** See http://dochub.mongodb.org/c ore/32bit Mon Aug 12 13:36:26.005 [initandlisten] Mon Aug 12 13:36:26.006 [initandlisten] db version v2.4.5 Mon Aug 12 13:36:26.007 [initandlisten] git version: a2ddc68ba7c9cee17bfe69ed840 383ec3506602b Mon Aug 12 13:36:26.007 [initandlisten] build info: Linux bs-linux32.10gen.cc 2. 6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_49 Mon Aug 12 13:36:26.008 [initandlisten] allocator: system Mon Aug 12 13:36:26.009 [initandlisten] options: { dbpath: "/var/lib/mongo/dbs/c onfig", nojournal: true, port: 20000 } Mon Aug 12 13:36:26.071 [FileAllocator] allocating new datafile /var/lib/mongo/d bs/config/local.ns, filling with zeroes... Mon Aug 12 13:36:26.072 [FileAllocator] creating directory /var/lib/mongo/dbs/co nfig/_tmp Mon Aug 12 13:36:26.582 [FileAllocator] done allocating datafile /var/lib/mongo/ dbs/config/local.ns, size: 16MB, took 0.504 secs Mon Aug 12 13:36:26.585 [FileAllocator] allocating new datafile /var/lib/mongo/d bs/config/local.0, filling with zeroes... Mon Aug 12 13:36:27.725 [FileAllocator] done allocating datafile /var/lib/mongo/ dbs/config/local.0, size: 16MB, took 1.138 secs Mon Aug 12 13:36:27.757 [initandlisten] command local.$cmd command: { create: "s tartup_log", size: 10485760, capped: true } ntoreturn:1 keyUpdates:0 reslen:37 1714ms Mon Aug 12 13:36:27.764 [websvr] admin web console waiting for connections on po rt 21000 Mon Aug 12 13:36:27.771 [initandlisten] waiting for connections on port 20000(2)启动mongos:
[root@h3 ~]# mongos --port 30000 --configdb localhost:20000 Mon Aug 12 13:40:13.042 warning: running with 1 config server should be done only for testing purposes and is not recommended for production Mon Aug 12 13:40:13.075 [mongosMain] MongoS version 2.4.5 starting: pid=22968 port=30000 32-bit host=h3 (--help for usage) Mon Aug 12 13:40:13.076 [mongosMain] git version: a2ddc68ba7c9cee17bfe69ed840383ec3506602b Mon Aug 12 13:40:13.076 [mongosMain] build info: Linux bs-linux32.10gen.cc 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_49 Mon Aug 12 13:40:13.076 [mongosMain] options: { configdb: "localhost:20000", port: 30000 } Mon Aug 12 13:40:13.250 [LockPinger] creating distributed lock ping thread for localhost:20000 and process h3:30000:1376286013:1804289383 (sleeping for 30000ms) Mon Aug 12 13:40:17.105 [mongosMain] distributed lock 'configUpgrade/h3:30000:1376286013:1804289383' acquired, ts : 52087541ff5991dd77979f2c Mon Aug 12 13:40:17.126 [mongosMain] starting upgrade of config server from v0 to v4 Mon Aug 12 13:40:17.128 [mongosMain] starting next upgrade step from v0 to v4 Mon Aug 12 13:40:17.130 [mongosMain] about to log new metadata event: { _id: "h3-2013-08-12T05:40:17-52087541ff5991dd77979f2d", server: "h3", clientAddr: "N/A", time: new Date(1376286017130), what: "starting upgrade of config database", ns: "config.version", details: { from: 0, to: 4 } } Mon Aug 12 13:40:17.138 [mongosMain] writing initial config version at v4 Mon Aug 12 13:40:17.232 [mongosMain] about to log new metadata event: { _id: "h3-2013-08-12T05:40:17-52087541ff5991dd77979f2f", server: "h3", clientAddr: "N/A", time: new Date(1376286017232), what: "finished upgrade of config database", ns: "config.version", details: { from: 0, to: 4 } } Mon Aug 12 13:40:17.237 [mongosMain] upgrade of config server to v4 successful Mon Aug 12 13:40:17.244 [mongosMain] distributed lock 'configUpgrade/h3:30000:1376286013:1804289383' unlocked. Mon Aug 12 13:40:17.474 [websvr] admin web console waiting for connections on port 31000 Mon Aug 12 13:40:17.476 [Balancer] about to contact config servers and shards Mon Aug 12 13:40:17.492 [Balancer] config servers and shards contacted successfully Mon Aug 12 13:40:17.494 [Balancer] balancer id: h3:30000 started at Aug 12 13:40:17 Mon Aug 12 13:40:17.527 [mongosMain] waiting for connections on port 30000
(3)添加分片1:
[root@h3 ~]# cd /var/lib/mongo/dbs/ [root@h3 dbs]# mkdir shard1 [root@h3 dbs]# mongod --dbpath /var/lib/mongo/dbs/shard1 --port 10000 --nojournal Mon Aug 12 13:43:10.560 [initandlisten] MongoDB starting : pid=23016 port=10000 dbpath=/var/lib/mongo/dbs/shard1 32-bit host=h3 Mon Aug 12 13:43:10.562 [initandlisten] Mon Aug 12 13:43:10.562 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary. Mon Aug 12 13:43:10.563 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal). Mon Aug 12 13:43:10.564 [initandlisten] ** Note that journaling defaults to off for 32 bit and is currently off. Mon Aug 12 13:43:10.565 [initandlisten] ** See http://dochub.mongodb.org/core/32bit Mon Aug 12 13:43:10.566 [initandlisten] Mon Aug 12 13:43:10.566 [initandlisten] db version v2.4.5 Mon Aug 12 13:43:10.567 [initandlisten] git version: a2ddc68ba7c9cee17bfe69ed840383ec3506602b Mon Aug 12 13:43:10.568 [initandlisten] build info: Linux bs-linux32.10gen.cc 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_49 Mon Aug 12 13:43:10.568 [initandlisten] allocator: system Mon Aug 12 13:43:10.569 [initandlisten] options: { dbpath: "/var/lib/mongo/dbs/shard1", nojournal: true, port: 10000 } Mon Aug 12 13:43:10.626 [FileAllocator] allocating new datafile /var/lib/mongo/dbs/shard1/local.ns, filling with zeroes... Mon Aug 12 13:43:10.628 [FileAllocator] creating directory /var/lib/mongo/dbs/shard1/_tmp Mon Aug 12 13:43:11.547 [FileAllocator] done allocating datafile /var/lib/mongo/dbs/shard1/local.ns, size: 16MB, took 0.907 secs Mon Aug 12 13:43:11.549 [FileAllocator] allocating new datafile /var/lib/mongo/dbs/shard1/local.0, filling with zeroes... Mon Aug 12 13:43:13.339 [FileAllocator] done allocating datafile /var/lib/mongo/dbs/shard1/local.0, size: 16MB, took 1.787 secs Mon Aug 12 13:43:13.427 [initandlisten] command local.$cmd command: { create: "startup_log", size: 10485760, capped: true } ntoreturn:1 keyUpdates:0 reslen:372801ms Mon Aug 12 13:43:13.472 [initandlisten] waiting for connections on port 10000 Mon Aug 12 13:43:13.497 [websvr] admin web console waiting for connections on port 11000
(4)添加分片2:
[root@h3 dbs]# cd /var/lib/mongo/dbs/ [root@h3 dbs]# mkdir shard2 [root@h3 dbs]# mongod --dbpath /var/lib/mongo/dbs/shard2 --port 10001 --nojournal Mon Aug 12 13:48:25.549 [initandlisten] MongoDB starting : pid=23129 port=10001 dbpath=/var/lib/mongo/dbs/shard2 32-bit host=h3 Mon Aug 12 13:48:25.550 [initandlisten] Mon Aug 12 13:48:25.550 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary. Mon Aug 12 13:48:25.550 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal). Mon Aug 12 13:48:25.550 [initandlisten] ** Note that journaling defaults to off for 32 bit and is currently off. Mon Aug 12 13:48:25.550 [initandlisten] ** See http://dochub.mongodb.org/core/32bit Mon Aug 12 13:48:25.551 [initandlisten] Mon Aug 12 13:48:25.551 [initandlisten] db version v2.4.5 Mon Aug 12 13:48:25.552 [initandlisten] git version: a2ddc68ba7c9cee17bfe69ed840383ec3506602b Mon Aug 12 13:48:25.552 [initandlisten] build info: Linux bs-linux32.10gen.cc 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_49 Mon Aug 12 13:48:25.552 [initandlisten] allocator: system Mon Aug 12 13:48:25.552 [initandlisten] options: { dbpath: "/var/lib/mongo/dbs/shard2", nojournal: true, port: 10001 } Mon Aug 12 13:48:25.570 [FileAllocator] allocating new datafile /var/lib/mongo/dbs/shard2/local.ns, filling with zeroes... Mon Aug 12 13:48:25.572 [FileAllocator] creating directory /var/lib/mongo/dbs/shard2/_tmp Mon Aug 12 13:48:26.956 [FileAllocator] done allocating datafile /var/lib/mongo/dbs/shard2/local.ns, size: 16MB, took 1.378 secs Mon Aug 12 13:48:26.957 [FileAllocator] allocating new datafile /var/lib/mongo/dbs/shard2/local.0, filling with zeroes... Mon Aug 12 13:48:28.023 [FileAllocator] done allocating datafile /var/lib/mongo/dbs/shard2/local.0, size: 16MB, took 1.065 secs Mon Aug 12 13:48:28.038 [initandlisten] command local.$cmd command: { create: "startup_log", size: 10485760, capped: true } ntoreturn:1 keyUpdates:0 reslen:37 2469ms Mon Aug 12 13:48:28.041 [websvr] admin web console waiting for connections on port 11001 Mon Aug 12 13:48:28.042 [initandlisten] waiting for connections on port 10001
(5)添加分片3:
[root@h3 ~]# cd /var/lib/mongo/dbs/ [root@h3 dbs]# mkdir shard3 [root@h3 dbs]# mongod --dbpath /var/lib/mongo/dbs/shard3 --port 10002 --nojournal Mon Aug 12 13:50:43.735 [initandlisten] MongoDB starting : pid=23142 port=10002 dbpath=/var/lib/mongo/dbs/shard3 32-bit host=h3 Mon Aug 12 13:50:43.737 [initandlisten] Mon Aug 12 13:50:43.737 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary. Mon Aug 12 13:50:43.738 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal). Mon Aug 12 13:50:43.739 [initandlisten] ** Note that journaling defaults to off for 32 bit and is currently off. Mon Aug 12 13:50:43.739 [initandlisten] ** See http://dochub.mongodb.org/core/32bit Mon Aug 12 13:50:43.740 [initandlisten] Mon Aug 12 13:50:43.740 [initandlisten] db version v2.4.5 Mon Aug 12 13:50:43.740 [initandlisten] git version: a2ddc68ba7c9cee17bfe69ed840383ec3506602b Mon Aug 12 13:50:43.740 [initandlisten] build info: Linux bs-linux32.10gen.cc 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 BOOST_LIB_VERSION=1_49 Mon Aug 12 13:50:43.740 [initandlisten] allocator: system Mon Aug 12 13:50:43.741 [initandlisten] options: { dbpath: "/var/lib/mongo/dbs/shard3", nojournal: true, port: 10002 } Mon Aug 12 13:50:43.756 [FileAllocator] allocating new datafile /var/lib/mongo/dbs/shard3/local.ns, filling with zeroes... Mon Aug 12 13:50:43.756 [FileAllocator] creating directory /var/lib/mongo/dbs/shard3/_tmp Mon Aug 12 13:50:45.079 [FileAllocator] done allocating datafile /var/lib/mongo/dbs/shard3/local.ns, size: 16MB, took 1.32 secs Mon Aug 12 13:50:45.099 [FileAllocator] allocating new datafile /var/lib/mongo/dbs/shard3/local.0, filling with zeroes... Mon Aug 12 13:50:45.948 [FileAllocator] done allocating datafile /var/lib/mongo/dbs/shard3/local.0, size: 16MB, took 0.848 secs Mon Aug 12 13:50:45.957 [initandlisten] command local.$cmd command: { create: "startup_log", size: 10485760, capped: true } ntoreturn:1 keyUpdates:0 reslen:37 2202ms Mon Aug 12 13:50:45.960 [initandlisten] waiting for connections on port 10002 Mon Aug 12 13:50:45.961 [websvr] admin web console waiting for connections on port 11002
(6)添加刚刚启动的三个片:
[root@h3 dbs]# mongo localhost:30000/admin MongoDB shell version: 2.4.5 connecting to: localhost:30000/admin mongos> db.runCommand({addshard : "localhost:10000", allowLocal : true}); { "shardAdded" : "shard0000", "ok" : 1 } mongos> db.runCommand({addshard : "localhost:10001", allowLocal : true}); { "shardAdded" : "shard0001", "ok" : 1 } mongos> db.runCommand({addshard : "localhost:10002", allowLocal : true}); { "shardAdded" : "shard0002", "ok" : 1 } mongos>
(7)打开数据库foo的分片功能:
mongos> db.runCommand({"enablesharding" : "foo"}); { "ok" : 1 } mongos>
(8)打开数据库foo中数据集合bar的分片功能:
mongos> db.runCommand({"shardcollection" : "foo.bar", "key" : {"_id" : 1}}); { "collectionsharded" : "foo.bar", "ok" : 1 } mongos>
(9)查看所有的分片:
mongos> use config switched to db config mongos> db.shards.find(); { "_id" : "shard0000", "host" : "localhost:10000" } { "_id" : "shard0001", "host" : "localhost:10001" } { "_id" : "shard0002", "host" : "localhost:10002" } mongos>
(10)查看databases集合:
mongos> db.databases.find(); { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "foo", "partitioned" : true, "primary" : "shard0000" } mongos>
(11) 查看chucks集合:
mongos> db.chunks.find(); { "_id" : "foo.bar-_id_MinKey", "lastmod" : Timestamp(1, 0), "lastmodEpoch" : ObjectId("52087d0a1072e2912d4242ea"), "ns" : "foo.bar", "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : { "$maxKey" : 1 } }, "shard" : "shard0000" } mongos>
(12)获得概要信息:
mongos> db.printShardingStatus(); --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("52087bf41072e2912d4242b8") } shards: { "_id" : "shard0000", "host" : "localhost:10000" } { "_id" : "shard0001", "host" : "localhost:10001" } { "_id" : "shard0002", "host" : "localhost:10002" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "foo", "partitioned" : true, "primary" : "shard0000" } foo.bar shard key: { "_id" : 1 } chunks: shard0000 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) mongos>
(13)移除分片:
mongos> use admin switched to db admin mongos> db.runCommand({"removeshard" : "localhost:10000"}); { "msg" : "draining started successfully", "state" : "started", "shard" : "shard0000", "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "foo" ], "ok" : 1 } mongos>
总结:对MongoDB的分片操作执行如下顺序:
(1)启动配置服务器;
(2)启动mongos进程;
(3)添加mongo实例(片);
(4)对数据库或者数据集使用分片操作。
相关推荐
需要注意的是,分片操作相对复杂,对于初学者而言,需要掌握一定的MongoDB基础知识和分布式系统的概念。本篇学习难度被评定为★★★★☆,建议读者在了解了MongoDB的基础操作之后,再进一步深入学习分片技术。 总体...
MongoDB提供了许多高级功能和选项,如索引、分片、复制集、事务等,以满足更复杂的数据管理和处理需求。 - **索引**:通过创建索引来加速查询速度。 - **分片**:将大数据集分布在多个服务器上,提高可伸缩性和性能...
通过数据分片(Sharding)功能,MongoDB能够突破单点数据库服务器I/O能力的局限,解决数据库水平扩展的问题。MongoDB还支持MapReduce并行计算模型,这种模型特别适合处理非结构化数据,并且模型对用户透明,可以让...
同时,通过内置的分片(sharding)技术,MongoDB可以轻松地进行水平扩展,以应对大数据量的挑战。分片不仅简化了数据管理,还降低了运维复杂性,因为数据的分发和负载均衡都由数据库自身处理。 MongoDB的另一个优势...
9. 分布式计算优化:学习如何通过并行化、分片、压缩等技术优化分布式计算,提升系统性能。 10. 分布式算法实例:分析实际应用中的分布式算法,如Google的PageRank算法、Kafka的消息队列系统等,以加深对分布式计算...
mongodb的分片需要启动,以便mongodb可以分布式存储数据。 初始化分片 mongodb的分片需要初始化,以便mongodb可以正确地存储和读取数据。 启动 mongos 服务器 mongodb的mongos服务器需要启动,以便mongodb可以...
4. **分片**:在“搭建高可用mongodb集群(四)—— 分片.docx”文档中,讲述了MongoDB的分片技术。分片是解决大数据存储和处理的有效手段,通过将数据分散到多个物理节点,实现了水平扩展,提高了系统的吞吐量和...
- 分片用于水平扩展MongoDB,将数据分布在多个节点上。理解分片策略(哈希、范围)和分片键的选择。 - 路由组件Shard Router(Mongos)的角色和配置。 7. **性能优化**: - 查询优化:避免使用`$where`,使用...
分片可以动态调整,随着数据的增长,MongoDB 可以自动将块移动到不同的分片上,以平衡负载。路由组件 mongos 负责接收客户端请求,根据查询条件决定数据位于哪个分片,并将请求转发给相应的分片。 MongoDB 还有一个...
本专题将聚焦于两个常见的分布式数据库系统——Redis和MongoDB,深入探讨它们的设计原理、应用场景以及面试中常被问到的技术点。 首先,Redis是一个高性能的键值存储系统,以其内存操作和丰富的数据结构(如字符串...
此外,它还具有自动分片功能,可以轻松扩展到多台服务器,以处理海量数据。 将这三者结合使用,可以构建出一个高效、可扩展的现代Web应用。AngularJS 负责前端交互,提供丰富的用户体验;Vert.x 在后端处理异步请求...
在学习MongoDB时,你需要掌握基本的CRUD操作、数据模型设计、索引使用、复制集的建立和维护、分片集群的搭建以及性能调优策略等。理解NoSQL数据库的核心理念,如灵活性、可伸缩性和高性能,将有助于你更好地应用...
此外,这个版本还包含了分片集群的改进,允许更大规模的数据存储和处理。同时,4.0版本引入了新的存储引擎——WiredTiger,它提供了更好的性能和数据压缩,进一步提升了存储效率。 对于运维人员来说,监控MongoDB的...
8. Replication与Sharding:MongoDB的复制集可以提供高可用性和数据冗余,而分片则用于水平扩展以处理大量数据,这两者是大型MongoDB部署的关键组成部分。 9. GridFS:当单个文档大小超过16MB时,MongoDB使用GridFS...
- **写入性能增强**:MongoDB 2.6引入了新的写入操作模式——批量异步写入(Batched Asynchronous Write Operations),它允许客户端批量提交写操作,从而显著提高写入速度。 - **查询优化器**:这个版本引入了一...
同时,MongoDB的分片功能可以水平扩展存储容量和处理能力。 在“MongoDB基础教程.pdf”中,你将详细学习到如何安装MongoDB,设置数据目录,启动和关闭数据库服务器。此外,教程还会介绍如何使用命令行工具`mongo`...
MongoDB 是一种流行的开源文档型数据库,以分布式文件存储的方式工作,特别适合处理大量数据的实时应用程序。在本文中,我们将深入探讨MongoDB的架构及其基本操作,特别是关于双服务器架构和副本集(Replica Set)的...