`
bit1129
  • 浏览: 1070023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[MongoDB学习笔记三]MongoDB分片

 
阅读更多

MongoDB的副本集(Replica Set)一方面解决了数据的备份和数据的可靠性问题,另一方面也提升了数据的读写性能。MongoDB分片(Sharding)则解决了数据的扩容问题,MongoDB作为云计算时代的分布式数据库,大容量数据存储,高效并发的数据存取,自动容错等是MongoDB的关键指标。

本篇介绍MongoDB的切片(Sharding)

 

1.何时需要分片

 1)数据量非常大,单个磁盘无法完成存储,例如SNS数据等

 2)单台服务器不能满足高并发写操作的性能要求(副本集仅仅允许有一台服务器)

 3)MongoDB是内存数据库和文件数据库,如果要尽可能的提升读写操作,最好是把尽可能多的数据存放到内存,这就要求内存足够大,为了获取尽可能多的内存,就使用尽可能多的物理服务器

 

2.创建分片的步骤

 1)创建配置服务器

 2)创建路由服务器,创建时需要指定链接的配置服务器,也就是路由器需要链接到配置服务器上

 3)创建2个或者多个分片服务器(运行Mongo实例),这里使用两台服务器27010和27011

 4)针对路由服务器,执行命令将多个集群添加分片(27010,27011)

db.runCommand({"addshard":"127.0.0.1:27010","allowLocal":true});
db.runCommand({"addshard":"127.0.0.1:27011","allowLocal":true});

 

3.创建分片

 

  3.1创建配置服务器

 

dbpath=/home/tom/development/mongoshard/configServer
port=28000
bind_ip=127.0.0.1

 

    启动配置服务器:mongod --config configServer.conf

   
   3.2 创建路由服务器

   

port=28001
configdb=127.0.0.1:28000

   

    启动路由服务器:mongos --config router.conf

   

  3.3 配置两台分片服务器

 

   

dbpath=/home/tom/development/mongoshard/shard1
bind_ip=127.0.0.1
port=27010

 

dbpath=/home/tom/development/mongoshard/shard2
bind_ip=127.0.0.1
port=27011

   

  3.4 关联分片服务器和路由服务器

    1) 启动配置服务器,路由服务器和两台切片服务器

    2) 打开链接到路由服务器的Javascript Shell命令行终端 mongo 127.0.0.1:28001/admin

    3) 在命令行终端执行命令,将两台服务器加入到集群中

 

db.runCommand({"addshard":"127.0.0.1:27010","allowLocal":true});
db.runCommand({"addshard":"127.0.0.1:27011","allowLocal":true});

    成功则显示结果:{ "shardAdded" : "shard0000", "ok" : 1 }和{ "shardAdded" : "shard0001", "ok" : 1 }

 

    在执行db.runCommand之前,不能做任何的数据库操作语句,例如use admin等。

 

   4) 打开数据库foolbar的分片功能(此时分片服务器上还没有创建foolbar数据库,待会儿创建)

   

db.runCommand({"enablesharding":"foolbar"});

 

  5) 打开数据库集合的分片功能(使用mongoDB默认的分别算法,按照key进行分片)

  

db.runCommand({"shardcollection":"foolbar.persons","key":{"_id":1}});

 

  6) 完成上面的步骤,则分片集群建立完成

 

4. 分片测试

4.1 在针对路由服务器的Javascript Shell客户端,切换到foolbar数据库 use foolbar

 

4.2 定义如下的Javascript方法,循环加入10000条文档-(首先在命令行中执行下面的语句以创建add()函数,然后执行add()函数以完成数据的插入)

function add() {
    for (var i = 0; i< 10000; i++) {
        db.persons.insert({"name:":"tom"+i, "age": i});
    }
}

 

4.3 完成数据插入后,调用db.persons.find().count()察看插入的数据条数,结果显示10000条

 

4.4 察看每个分片服务器上每个persons文档的个数

 

   4.4.1 10000条文档的测试结果

          链接到shard1: mongo 127.0.0.1:27010/admin

          use foolbar

         db.persons.find().count()

         >>>10000

 

        链接到shard2: mongo 127.0.0.1:27011/admin

        use foolbar

        db.persons.find().count()

        >>>0

 

   结果显示,所有的数据都存在于第一个分片上,这是不能接受的,只有加大数据量了!

 

   4.4.2 1000000条文档的测试结果

       链接到路由服务器:mongo 127.0.0.1:28001/admin

        执行如下命令:

function add() {
    for (var i = 0; i< 1000000; i++) {
        db.persons.insert({"name:":"tom"+i, "age": i});
    }
}

 第一台和第二台的数据分布情况

 

tom$ mongo 127.0.0.1:27010/admin
MongoDB shell version: 2.4.10
connecting to: 127.0.0.1:27010/admin
> use foolbar
switched to db foolbar
> db.persons.find().count();
640957
> exit

tom$ mongo 127.0.0.1:27011/admin
MongoDB shell version: 2.4.10
connecting to: 127.0.0.1:27011/admin
> use foolbar
switched to db foolbar
> db.persons.find().count();
369043
> exit

 

 

 

5.察看分片情况

 

 

tom$ mongo 127.0.0.1:28001/admin
MongoDB shell version: 2.4.10
connecting to: 127.0.0.1:28001/admin
mongos> db.printShardingStatus();
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"version" : 3,
	"minCompatibleVersion" : 3,
	"currentVersion" : 4,
	"clusterId" : ObjectId("53e23314e0892adc5cc089bc")
}
  shards:
	{  "_id" : "shard0000",  "host" : "127.0.0.1:27010" }
	{  "_id" : "shard0001",  "host" : "127.0.0.1:27011" }
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "foolbar",  "partitioned" : true,  "primary" : "shard0000" }
		foolbar.persons
			shard key: { "_id" : 1 }
			chunks:
				shard0000	3
				shard0001	3
			{ "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("53e24069e92ed4a015b75957") } on : shard0000 Timestamp(5, 0) 
			{ "_id" : ObjectId("53e24069e92ed4a015b75957") } -->> { "_id" : ObjectId("53e2446d1db30c2efea0b7d0") } on : shard0001 Timestamp(5, 1) 
			{ "_id" : ObjectId("53e2446d1db30c2efea0b7d0") } -->> { "_id" : ObjectId("53e244861db30c2efea5af7c") } on : shard0000 Timestamp(4, 1) 
			{ "_id" : ObjectId("53e244861db30c2efea5af7c") } -->> { "_id" : ObjectId("53e2449d1db30c2efeaa7f8d") } on : shard0000 Timestamp(3, 2) 
			{ "_id" : ObjectId("53e2449d1db30c2efeaa7f8d") } -->> { "_id" : ObjectId("53e244b51db30c2efeaf683b") } on : shard0001 Timestamp(4, 2) 
			{ "_id" : ObjectId("53e244b51db30c2efeaf683b") } -->> { "_id" : { "$maxKey" : 1 } } on : shard0001 Timestamp(4, 3) 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MongoDB学习笔记

    3. 分片集群的理论、搭建过程、测试结果、优势剖析、分片键选择和集群管理:分片是MongoDB中实现数据水平扩展的关键技术。 五、数据库管理 1. 导入导出:可以将数据导出为JSON格式,也可以从JSON导入数据。 2. 数据...

    mongodb学习笔记和mongodb权威指南

    书中可能还会涉及复制集的设置和管理,用于实现高可用性和数据冗余,以及分片技术,用于在大型集群上水平扩展数据库。 `mongodb学习手册`可能是一个全面的教程,旨在引导初学者逐步了解MongoDB。它可能从安装和启动...

    mongoDB学习笔记及工具.zip

    本压缩包“mongoDB学习笔记及工具.zip”包含了一些资源,帮助你深入理解和掌握MongoDB的相关知识。 1. **笔记(note.txt)**: 这个文件可能是对MongoDB的基础概念、安装过程、基本操作和进阶特性的详细记录。笔记...

    mongodb学习笔记

    在本篇 MongoDB 学习笔记中,我们将聚焦于 MongoDB 的集群和分片(sharding)配置,这是实现大规模数据存储和处理的关键特性。 1. **MongoDB 集群**: - 集群是由多个独立的 MongoDB 实例组成的,它们共同提供高...

    MongoDB学习总结笔记

    以下是对MongoDB学习的一些关键知识点的详细解释: 1. **MongoDB的基本概念**:MongoDB以集合(Collections)的形式存储数据,集合相当于关系型数据库中的表。集合内包含文档(Documents),文档是JSON格式的数据...

    MongoDB数据库学习笔记

    同时,熟悉MongoDB的复制和分片配置也是运维中必不可少的部分。 总的来说,MongoDB是一个强大的非关系型数据库,适合处理大规模、动态结构的数据。其简洁易懂的接口和丰富的功能使其成为现代Web应用、物联网(IoT)和...

    mongodb笔记

    此笔记是我个人通过自学整理出来的。希望看到的人有什么建议告诉我。也可以共同去学习!里面内容包括:安装配置、增删改查、用户管理、主从复制、分片、副本集以及和JAVA的结合案例等等!

    MongoDB数据库-163 李兴华培训笔记.rar

    另外,分片(Sharding)是MongoDB处理大数据的重要手段。通过将数据分散到多个物理机器上,可以实现水平扩展,提高系统的存储和处理能力。分片策略可以根据集合的大小、字段值或哈希值来确定。 此外,MongoDB提供了...

    MongoDB学习笔记—Linux下搭建MongoDB环境

    4. **分片**:随着数据量和处理需求的增长,MongoDB可以分布式部署在多台计算机上,实现数据分片。 5. **丰富的查询表达式**:使用JSON形式的查询指令,能处理嵌套对象和数组。 6. **更新操作**:`update()`命令可以...

    深入云计算(MongoDB管理与开发实战详解--学习笔记

    在性能方面,MongoDB支持水平扩展,通过分片和副本集技术实现高可用性和数据冗余,确保在大数据量下的读写性能。它的文档存储方式使得数据插入、更新和删除操作相对简单,无需像关系型数据库那样进行复杂的表结构...

    mongo学习笔记.doc

    MongoDB基本知识整理。 Mongodb导出与导入命令、创建分片、创建复制集等。

    mongoDb源码和笔记

    最后,MongoDB的复制集和分片集群技术也是其高可用性和可扩展性的基石。源码中会涉及复制状态同步、仲裁节点选举和数据迁移的实现。 通过深入研究这些源码和笔记,开发者不仅可以提升对MongoDB的理解,还能学习到...

    mongodb一些笔记

    MongoDB是一种流行的开源文档数据库系统,属于...这些笔记和教程涵盖了MongoDB的基础知识到高级用法,对于学习和理解MongoDB的操作和特性非常有帮助。通过阅读提供的文档,可以深入学习MongoDB的使用技巧和最佳实践。

    MongoDB学习笔记(一) MongoDB介绍与安装方法

    MongoDB 是一种高性能、开源、无模式的文档型数据库,属于 NoSQL 数据库中的热门选择。...如果你希望深入了解,可以进一步学习其复制集、分片、数据备份与恢复、安全配置以及更复杂的查询和聚合操作。

    免费的mongoDB

    该指南可能深入讲解了MongoDB的核心特性,包括复制集、分片集群、数据备份与恢复策略、安全性和权限管理等。复制集是MongoDB高可用性的关键,它允许多个副本同步数据,以确保服务的连续性。而分片集群则支持水平扩展...

    数据库学习笔记包括:Oracle、MySQL、MongoDB、Redis,Neo4j的在完善.zip

    本压缩包中的学习笔记涵盖了五大主流数据库系统:Oracle、MySQL、MongoDB、Redis以及Neo4j,它们各自拥有独特的特性和用途,适用于不同的场景。 1. Oracle数据库: Oracle是一款关系型数据库管理系统(RDBMS),在...

    MongoDB 学习笔记

    MongoDB是一款面向文档的NoSQL数据库系统,其主要特点包括高性能、高可用性、以及易于扩展等。...随着实践的深入,可以进一步学习索引优化、复制集、分片等高级特性,以适应更大规模的数据存储和访问需求。

Global site tag (gtag.js) - Google Analytics