[MongoDB学习笔记三]MongoDB分片

MongoDB  /  houtizong 发布于 3年前   281

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/configServerport=28000bind_ip=127.0.0.1

 

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

   
   3.2 创建路由服务器

   

port=28001configdb=127.0.0.1:28000

   

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

   

  3.3 配置两台分片服务器

 

   

dbpath=/home/tom/development/mongoshard/shard1bind_ip=127.0.0.1port=27010

 

dbpath=/home/tom/development/mongoshard/shard2bind_ip=127.0.0.1port=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/adminMongoDB shell version: 2.4.10connecting to: 127.0.0.1:27010/admin> use foolbarswitched to db foolbar> db.persons.find().count();640957> exittom$ mongo 127.0.0.1:27011/adminMongoDB shell version: 2.4.10connecting to: 127.0.0.1:27011/admin> use foolbarswitched to db foolbar> db.persons.find().count();369043> exit

 

 

 

5.察看分片情况

 

 

tom$ mongo 127.0.0.1:28001/adminMongoDB shell version: 2.4.10connecting to: 127.0.0.1:28001/adminmongos> 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.personsshard key: { "_id" : 1 }chunks:shard00003shard00013{ "_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) 

 

 

 

 

 

 

 

 

 

 

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客