Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4559055
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 数据库开发技术

2012-08-03 17:10:42

文章来源:
汇总连接:
MongoDB的auto-sharding功能是指mongodb通过mongos自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。
一个mongodb集群包括一些shards(包括一些mongod进程),mongos路由进程,一个或多个config服务器

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服务)
Shard1:27020
Shard2:27021
Config:27022
Mongos启动时默认使用的27017端口

新建存放数据的目录
  1. [falcon@~/mongodata]$ mkdir 27020 27021 27022
  2. [falcon@~/mongodata]$ ls
  3. 27020  27021  27022

  4. [falcon@~/mongodb/bin]$ ./mongod --dbpath /home/falcon/mongodata/27020 --port 27020 > /home/falcon/mongodata/27020.log &
  5. [falcon@~/mongodb/bin]$ ./mongod --dbpath /home/falcon/mongodata/27021 --port 27021  > /home/falcon/mongodata/27021.log &
  6. [falcon@~/mongodb/bin]$ ./mongod --dbpath /home/falcon/mongodata/27022 --port 27022  > /home/falcon/mongodata/27022.log &
复制代码
启动mongos时,默认开启了27017端口
  1. [falcon@~/mongodb/bin]$ ./mongos --configdb localhost:27022 > /home/falcon/mongodata/config.log &
复制代码
检查是否启动
  1. [falcon@~/mongodb/bin]$ ps -ef|grep mongo
  2. falcon    2612     1  0 20:15 ?        00:00:00 ./mongod --dbpath /home/falcon/mongodata/27020 --port 27020
  3. falcon    2619     1  0 20:15 ?        00:00:00 ./mongod --dbpath /home/falcon/mongodata/27021 --port 27021
  4. falcon    2625     1  0 20:15 ?        00:00:00 ./mongod --dbpath /home/falcon/mongodata/27022 --port 27022
  5. falcon    2658     1  0 20:15 ?        00:00:00 ./mongos --configdb localhost:27022
  6. falcon    2804  2772  0 20:31 pts/0    00:00:00 bin/mongo
  7. falcon    2847  2812  0 20:55 pts/2    00:00:00 grep mongo
  8. [falcon@~/mongodb/bin]$

  9. [falcon@~/mongodb/bin]$ netstat -an  -t
  10. Active Internet connections (servers and established)
  11. Proto Recv-Q Send-Q Local Address               Foreign Address             State      
  12. tcp        0      0 0.0.0.0:10022               0.0.0.0:*                   LISTEN      
  13. tcp        0      0 0.0.0.0:27017               0.0.0.0:*                   LISTEN      
  14. tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      
  15. tcp        0      0 0.0.0.0:27020               0.0.0.0:*                   LISTEN      
  16. tcp        0      0 0.0.0.0:27021               0.0.0.0:*                   LISTEN      
  17. tcp        0      0 0.0.0.0:27022               0.0.0.0:*                   LISTEN      
  18. ......   
  19. tcp        0      0 0.0.0.0:28020               0.0.0.0:*                   LISTEN      
  20. tcp        0      0 0.0.0.0:28021               0.0.0.0:*                   LISTEN      
  21. tcp        0      0 0.0.0.0:28022               0.0.0.0:*                   LISTEN      
  22. tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN     
  23. ........
复制代码
看到以上信息证明mongodb启动完整,对于开启的28020、28021、28022是对于的http接口
  1. [falcon@~/mongodb/bin]$ ./mongo   默认连接到mongos上
  2. MongoDB shell version: 1.2.4-
  3. url: test
  4. connecting to: test
  5. type "help" for help
  6. > show dbs
  7. admin
  8. config
  9. Local
复制代码
加入shard节点
  1. > use admin
  2. switched to db admin

  3. > db.runCommand( { addshard : "localhost:27020", allowLocal : true } )
  4. {"ok" : 1 , "added" : "localhost:27020"}

  5. > db.runCommand( { addshard : "localhost:27021", allowLocal : true } )
  6. {"ok" : 1 , "added" : "localhost:27021"}

  7. > db.runCommand({listshards:1});   查看shard节点列表
  8. {
  9.         "shards" : [
  10.                 {
  11.                         "_id" : ObjectId("4b9cd380c33000afad27718e"),
  12.                         "host" : "localhost:27020"
  13.                 },
  14.                 {
  15.                         "_id" : ObjectId("4b9cd381c33000afad27718f"),
  16.                         "host" : "localhost:27021"
  17.                 }
  18.         ],
  19.         "ok" : 1
  20. }
复制代码
新建自动切片的库user001:
  1. > config = connect("localhost:27022")
  2. > config = config.getSisterDB("config")
  3. > user001=db.getSisterDB("user001");
  4. user001
  5. > db.runCommand({enablesharding:"user001"})
  6. { "ok" : 1 }

  7. > db.printShardingStatus();
  8. --- Sharding Status ---
  9.   sharding version: { "_id" : ObjectId("4b9cd354c33000afad27718d"), "version" : 2 }
  10.   shards:
  11.       { "_id" : ObjectId("4b9cd380c33000afad27718e"), "host" : "localhost:27020" }
  12.       { "_id" : ObjectId("4b9cd381c33000afad27718f"), "host" : "localhost:27021" }
  13.   databases:
  14.         { "name" : "admin", "partitioned" : false, "primary" : "localhost:27022", "_id" : ObjectId("4b9cd3776693dcfa468dec13") }
  15.         { "name" : "user001", "partitioned" : true, "primary" : "localhost:27021", "_id" : ObjectId("4b9cde866693dcfa468dec17") }
  16.                 my chunks
复制代码
我们来在user001中新建表,插入数据
  1. > use user001
  2. switched to db user001
  3. > db.createCollection("user_001")
  4. { "ok" : 1 }
  5. > show collections
  6. system.indexes
  7. user_001
  8. > db.user_001.insert({uid:1,username:"Falcon.C",***:"男",age:25});
  9. > db.user_001.find();
  10. { "_id" : ObjectId("4b9ce1a6c84d7f20576c4df1"), "uid" : 1, "username" : "Falcon.C", "***" : "男", "age" : 25 }
复制代码
我们来看看user001库被分配到了哪个shard上
  1. [falcon@~/mongodata]$ ls -R
  2. .:
  3. 27020  27021  27022  mongos.log

  4. ./27020:
  5. 27020.log  mongod.lock  test.0  test.1  test.ns  _tmp

  6. ./27020/_tmp:

  7. ./27021:
  8. 27021.log  mongod.lock  _tmp  user.0  user001.0  user001.1  user001.ns  user.1  user.ns

  9. ./27021/_tmp:

  10. ./27022:
  11. 27022.log  config.0  config.ns  mongod.lock  mongos.log  _tmp

  12. ./27022/_tmp:
  13. [falcon@~/mongodata]$
复制代码
从以上的文件可以看出,user001被分配到了27021的shard上了,但是通过mongos路由,我们并感觉不到是数据存放在哪个shard的chunk上


Sharding的管理命令
  1. > db.$cmd.findOne({isdbgrid:1});                                                                          
  2. { "isdbgrid" : 1, "hostname" : "", "ok" : 1 }
  3. > db.$cmd.findOne({ismaster:1});
  4. { "ismaster" : 1, "msg" : "isdbgrid", "ok" : 1 }
  5. > printShardingStatus(db.getSisterDB("config"))
  6. --- Sharding Status ---
  7.   sharding version: { "_id" : ObjectId("4b9cd354c33000afad27718d"), "version" : 2 }
  8.   shards:
  9.       { "_id" : ObjectId("4b9cd380c33000afad27718e"), "host" : "localhost:27020" }
  10.       { "_id" : ObjectId("4b9cd381c33000afad27718f"), "host" : "localhost:27021" }
  11.   databases:
  12.         { "name" : "admin", "partitioned" : false, "primary" : "localhost:27022", "_id" : ObjectId("4b9cd3776693dcfa468dec13") }
  13.                 my chunks
  14.         { "name" : "user001", "partitioned" : true, "primary" : "localhost:27021", "_id" : ObjectId("4b9cde866693dcfa468dec17") }
  15.                 my chunks
  16. > use admin
  17. switched to db admin
  18. > db.runCommand({netstat:1})
  19. { "configserver" : "localhost:27022", "isdbgrid" : 1, "ok" : 1 }
  20. >
复制代码
参考信息:
阅读(861) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~