Nosql Mongodb之旅(27)—MongoDB Sharding分片
来源:互联网 发布:电脑网络与共享打不开 编辑:程序博客网 时间:2024/05/05 15:51
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群。
MongoDB 的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块。要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server
即存储实际数据的分片,每个Shard 可以是一个mongod 实例,也可以是一组mongod 实例
构成的Replica Set。为了实现每个Shard 内部的auto-failover,MongoDB 官方建议每个Shard
为一组Replica Set。
Config Server
为了将一个特定的collection 存储在多个shard 中,需要为该collection 指定一个shard key,例如{age: 1} ,shard key 可以决定该条记录属于哪个chunk。Config Servers 就是用来存储:所有shard 节点的配置信息、每个chunk 的shard key 范围、chunk 在各shard 的分布情况、该集群中所有DB 和collection 的sharding 配置信息。
Route Process
这是一个前端路由,客户端由此接入,然后询问Config Servers 需要到哪个Shard 上查询或保存记录,再连接相应的Shard 进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod 的查询或更新请求原封不动地发给Routing Process,而不必关心所操作的记录存储在哪个Shard 上。
下面我们在同一台物理机器上构建一个简单的 Sharding Cluster:
启动Config Server
启动Route Process
mongos 启动参数中,chunkSize 这一项是用来指定chunk 的大小的,单位是MB,默认大小为200MB,为了方便测试Sharding 效果,我们把chunkSize 指定为 1MB。
(2)配置Sharding (3)验证Sharding正常工作
我们已经对test.users 表进行了分片的设置,下面我们们插入一些数据看一下结果
我们看一下磁盘上的物理文件情况 看上述结果,表明test.users 集合已经被分片处理了,但是通过mongos 路由,我们并感觉不到是数据存放在哪个shard 的chunk 上的,这就是MongoDB 用户体验上的一个优势,即对用户是透明的。
MongoDB 的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块。要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server
即存储实际数据的分片,每个Shard 可以是一个mongod 实例,也可以是一组mongod 实例
构成的Replica Set。为了实现每个Shard 内部的auto-failover,MongoDB 官方建议每个Shard
为一组Replica Set。
Config Server
为了将一个特定的collection 存储在多个shard 中,需要为该collection 指定一个shard key,例如{age: 1} ,shard key 可以决定该条记录属于哪个chunk。Config Servers 就是用来存储:所有shard 节点的配置信息、每个chunk 的shard key 范围、chunk 在各shard 的分布情况、该集群中所有DB 和collection 的sharding 配置信息。
Route Process
这是一个前端路由,客户端由此接入,然后询问Config Servers 需要到哪个Shard 上查询或保存记录,再连接相应的Shard 进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod 的查询或更新请求原封不动地发给Routing Process,而不必关心所操作的记录存储在哪个Shard 上。
下面我们在同一台物理机器上构建一个简单的 Sharding Cluster:
架构图如下:
Shard Server 1:20000
Shard Server 2:20001
Config Server :30000
Route Process:40000
(1)启动三服务
启动Shard Server
- mkdir -p /data/shard/s0 --创建数据目录
- mkdir -p /data/shard/s1
- mkdir -p /data/shard/log --创建日志目录
- /Apps/mongo/bin/mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath
- /data/shard/log/s0.log --directoryperdb --启动Shard Server 实例1
- /Apps/mongo/bin/mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath
- /data/shard/log/s1.log --directoryperdb --启动Shard Server 实例2
- mkdir -p /data/shard/config --创建数据目录
- /Apps/mongo/bin/mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath
- /data/shard/log/config.log --directoryperdb --启动Config Server 实例
- /Apps/mongo/bin/mongos --port 40000 --configdb localhost:30000 --fork --logpath
- /data/shard/log/route.log --chunkSize 1 --启动Route Server 实例
(2)配置Sharding
接下来,我们使用MongoDB Shell 登录到mongos,添加Shard 节点
- [root@localhost ~]# /Apps/mongo/bin/mongo admin --port 40000 --此操作需要连接admin 库
- MongoDB shell version: 1.8.1
- connecting to: 127.0.0.1:40000/admin
- > db.runCommand({ addshard:"localhost:20000" }) --添加 Shard Server
- { "shardAdded" : "shard0000", "ok" : 1 }
- > db.runCommand({ addshard:"localhost:20001" })
- { "shardAdded" : "shard0001", "ok" : 1 }
- > db.runCommand({ enablesharding:"test" }) --设置分片存储的数据库
- { "ok" : 1 }
- > db.runCommand({ shardcollection: "test.users", key: { _id:1 }}) --设置分片的集合名称,且必
- 须指定Shard Key,系统会自动创建索引
- { "collectionsharded" : "test.users", "ok" : 1 }
- >
我们已经对test.users 表进行了分片的设置,下面我们们插入一些数据看一下结果
- > use test
- switched to db test
- > for (var i = 1; i <= 500000; i++) db.users.insert({age:i, name:"wangwenlong", addr:"Beijing",
- country:"China"})
- > db.users.stats()
- {
- "sharded" : true, --说明此表已被shard
- "ns" : "test.users",
- "count" : 500000,
- "size" : 48000000,
- "avgObjSize" : 96,
- "storageSize" : 66655232,
- "nindexes" : 1,
- "nchunks" : 43,
- "shards" : {
- "shard0000" : { --在此分片实例上约有24.5M 数据
- "ns" : "test.users",
- "count" : 254889,
- "size" : 24469344,
- "avgObjSize" : 96,
- "storageSize" : 33327616,
- "numExtents" : 8,
- "nindexes" : 1,
- "lastExtentSize" : 12079360,
- "paddingFactor" : 1,
- "flags" : 1,
- "totalIndexSize" : 11468800,
- "indexSizes" : {
- "_id_" : 11468800
- },
- "ok" : 1
- },
- "shard0001" : { --在此分片实例上约有23.5M 数据
- "ns" : "test.users",
- "count" : 245111,
- "size" : 23530656,
- "avgObjSize" : 96,
- "storageSize" : 33327616,
- "numExtents" : 8,
- "nindexes" : 1,
- "lastExtentSize" : 12079360,
- "paddingFactor" : 1,
- "flags" : 1,
- "totalIndexSize" : 10649600,
- "indexSizes" : {
- "_id_" : 10649600
- },
- "ok" : 1
- }
- },
- "ok" : 1
- }
- >
- [root@localhost bin]# ll /data/shard/s0/test --此分片实例上有数据产生
- 总计 262420
- -rw------- 1 root root 16777216 06-03 15:21 test.0
- -rw------- 1 root root 33554432 06-03 15:21 test.1
- -rw------- 1 root root 67108864 06-03 15:22 test.2
- -rw------- 1 root root 134217728 06-03 15:24 test.3
- -rw------- 1 root root 16777216 06-03 15:21 test.ns
- [root@localhost bin]# ll /data/shard/s1/test --此分片实例上有数据产生
- 总计 262420
- -rw------- 1 root root 16777216 06-03 15:21 test.0
- -rw------- 1 root root 33554432 06-03 15:21 test.1
- -rw------- 1 root root 67108864 06-03 15:22 test.2
- -rw------- 1 root root 134217728 06-03 15:23 test.3
- -rw------- 1 root root 16777216 06-03 15:21 test.ns
- [root@localhost bin]#
0 0
- Nosql Mongodb之旅(27)—MongoDB Sharding分片
- MongoDB之Sharding 分片
- Nosql Mongodb之旅(28)—MongoDB管理维护Sharding
- mongodb—分片(sharding)
- MongoDB学习之旅二十六:MongoDB Sharding分片
- Nosql Mongodb之旅(31)—Replica Sets+Sharding
- NoSql之MongoDB 分片管理
- mongodb的sharding(分片)
- MongoDB---Sharding分片
- MongoDB Sharding 分片技术
- Mongodb Sharding 分片
- MongoDB Sharding分片管理
- MongoDB Sharding 分片技术
- mongodb-sharding 分片
- MongoDB 分片(Sharding)
- MongoDB架构——sharding分片
- MongoDB分片实战(二):Sharding
- mongodb sharding cluster(分片集群)
- POJ 3057
- loadrunner学习记录一 loadrunner专业术语
- android中的style部分属性值介绍
- PE文件结构及其加载机制(一)
- java中获得一个类的类名
- Nosql Mongodb之旅(27)—MongoDB Sharding分片
- 27、面向对象的陷阱
- PE文件结构及其加载机制(二)
- Extjs4--Ext.data.Store的多列排序和过滤器
- Dev系列控件之XtraCharts(一)
- secureCrt ftp
- 音频测试用粉色噪声发生器
- 'or'='or'
- HDU 4586 Play the Dice 概率期望