第八章:sharding 分片
2015-06-15 11:40
183 查看
一: 安装和部署
Sharding 和Replica Set类似,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。就三种集群搭建方式来说,这种是最复杂的。部署图如下:
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在 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上。
一般来说一个数据节点对应一个配置节点,仲裁节点则不需要对应的配置节点。注意在启动路由节点时,要将配置节点地址写入到启动命令里。
2.部署 Replica Sets
环境: redhat linux5.5
1. 建立数据文件夹
mkdir -p /mongodb/data/shared1 --shared1
mkdir -p /mongodb/log/
mkdir -p /mongodb/data/shared2 --shared2
mkdir -p /mongodb/log/
mkdir -p /mongodb/data/conf/ --控制节点
mkdir -p /mongodb/log/
mkdir -p /mongodb/data/root/ --路由节点
mkdir -p /mongodb/log/
touch /mongodb/log/shared1.log
touch /mongodb/log/shared2.log
touch /mongodb/log/conf.log
touch /mongodb/log/root.log
touch /mongodb/shared1.pid
touch /mongodb/shared2.pid
touch /mongodb/conf.pid
touch /mongodb/root.pid
chmod -R 755 /mongodb --六个节点都执行
2. 启动数据节点
./mongod --shardsvr --port 27017 --fork --dbpath /mongodb/data/shared1/ --logpath /mongodb/log/shared1.log --directoryperdb #192.168.56.87
./mongod --shardsvr --port 27017 --fork --dbpath /mongodb/data/shared2/ --logpath /mongodb/log/shared2.log --directoryperdb #192.168.56.88
3.启动配置节点
./mongod --configsvr --dbpath /mongodb/data/conf --port 27017 --fork --logpath /mongodb/log/conf.log --directoryperdb #192.168.56.89
4.启动路由节点
./mongos --configdb 192.168.56.89:27017 --port 27017 --fork --logpath /mongodb/log/root.log --chunkSize 1 #192.168.56.89
[root@node1 bin]# ./mongos --configdb 192.168.56.90:27017,192.168.56.91:27017 --port 27017 --fork --logpath /mongodb/log/root.log
BadValue need either 1 or 3 configdbs
try './mongos --help' for more information --报错了
原因以及解决办法:
mongos.conf文件中configdb参数有误,在这里路由个数,只能为1 或 3。configdb = 192.168.56.90:27017
mongos 启动参数中,chunkSize 这一项是用来指定 chunk 的大小的,单位是 MB,默认大小
为200MB,为了方便测试Sharding效果,我们把chunkSize 指定为 1MB。
4.配置Sharding
./mongo 192.168.56.90:27017 #这里必须连接路由节点
>use admin
>db.runCommand({addshard:"192.168.56.87:27017"}) --添加shard server
>db.runCommand({addshard:"192.168.56.88:27017"})
>db.runCommand({enablesharding:"test"}) --设置分片存储的数据库
>db.runCommand({ shardcollection: "test.users", key: { _id:1 }}) --设置分片的集合名称,且必须指定Shard Key,系统会自动创建索引
5.验证sharing 正常工作(在路由端)
> use test
switched to db test
> for (var i = 1; i <= 5000; i++) db.users.insert({age:i, name:"wangwenlong", addr:"Beijing",country:"China"})
mongos> db.users.stats()
{
"sharded" : true, 说明此表已被shared
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"ns" : "test.users",
"count" : 5000,
"numExtents" : 5,
"size" : 560000,
"storageSize" : 704512,
"totalIndexSize" : 179872,
"indexSizes" : {
"_id_" : 179872
},
"avgObjSize" : 112,
"nindexes" : 1,
"nchunks" : 3,
"shards" : {
"shard0000" : {
"ns" : "test.users",
"count" : 4999, --此分片上有将近5k数据
"size" : 559888,
"avgObjSize" : 112,
"numExtents" : 4,
"storageSize" : 696320,
"lastExtentSize" : 524288,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 1,
"totalIndexSize" : 171696,
"indexSizes" : {
"_id_" : 171696
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.users",
"count" : 1,
"size" : 112,
"avgObjSize" : 112,
"numExtents" : 1,
"storageSize" : 8192,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
},
"ok" : 1
}
mongos>
看上述结果,表明 test.users 集合已经被分片处理了,但是通过 mongos 路由,我们并感觉不到是数据存放在哪个 shard 的 chunk 上的,这就是 MongoDB 用户体验上的一个优势,即对用户是透明的。
一: 安装和部署
Sharding 和Replica Set类似,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。就三种集群搭建方式来说,这种是最复杂的。部署图如下:
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在 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上。
一般来说一个数据节点对应一个配置节点,仲裁节点则不需要对应的配置节点。注意在启动路由节点时,要将配置节点地址写入到启动命令里。
2.部署 Replica Sets
环境: redhat linux5.5
1. 建立数据文件夹
mkdir -p /mongodb/data/shared1 --shared1
mkdir -p /mongodb/log/
mkdir -p /mongodb/data/shared2 --shared2
mkdir -p /mongodb/log/
mkdir -p /mongodb/data/conf/ --控制节点
mkdir -p /mongodb/log/
mkdir -p /mongodb/data/root/ --路由节点
mkdir -p /mongodb/log/
touch /mongodb/log/shared1.log
touch /mongodb/log/shared2.log
touch /mongodb/log/conf.log
touch /mongodb/log/root.log
touch /mongodb/shared1.pid
touch /mongodb/shared2.pid
touch /mongodb/conf.pid
touch /mongodb/root.pid
chmod -R 755 /mongodb --六个节点都执行
2. 启动数据节点
./mongod --shardsvr --port 27017 --fork --dbpath /mongodb/data/shared1/ --logpath /mongodb/log/shared1.log --directoryperdb #192.168.56.87
./mongod --shardsvr --port 27017 --fork --dbpath /mongodb/data/shared2/ --logpath /mongodb/log/shared2.log --directoryperdb #192.168.56.88
3.启动配置节点
./mongod --configsvr --dbpath /mongodb/data/conf --port 27017 --fork --logpath /mongodb/log/conf.log --directoryperdb #192.168.56.89
4.启动路由节点
./mongos --configdb 192.168.56.89:27017 --port 27017 --fork --logpath /mongodb/log/root.log --chunkSize 1 #192.168.56.89
[root@node1 bin]# ./mongos --configdb 192.168.56.90:27017,192.168.56.91:27017 --port 27017 --fork --logpath /mongodb/log/root.log
BadValue need either 1 or 3 configdbs
try './mongos --help' for more information --报错了
原因以及解决办法:
mongos.conf文件中configdb参数有误,在这里路由个数,只能为1 或 3。configdb = 192.168.56.90:27017
mongos 启动参数中,chunkSize 这一项是用来指定 chunk 的大小的,单位是 MB,默认大小
为200MB,为了方便测试Sharding效果,我们把chunkSize 指定为 1MB。
4.配置Sharding
./mongo 192.168.56.90:27017 #这里必须连接路由节点
>use admin
>db.runCommand({addshard:"192.168.56.87:27017"}) --添加shard server
>db.runCommand({addshard:"192.168.56.88:27017"})
>db.runCommand({enablesharding:"test"}) --设置分片存储的数据库
>db.runCommand({ shardcollection: "test.users", key: { _id:1 }}) --设置分片的集合名称,且必须指定Shard Key,系统会自动创建索引
5.验证sharing 正常工作(在路由端)
> use test
switched to db test
> for (var i = 1; i <= 5000; i++) db.users.insert({age:i, name:"wangwenlong", addr:"Beijing",country:"China"})
mongos> db.users.stats()
{
"sharded" : true, 说明此表已被shared
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"ns" : "test.users",
"count" : 5000,
"numExtents" : 5,
"size" : 560000,
"storageSize" : 704512,
"totalIndexSize" : 179872,
"indexSizes" : {
"_id_" : 179872
},
"avgObjSize" : 112,
"nindexes" : 1,
"nchunks" : 3,
"shards" : {
"shard0000" : {
"ns" : "test.users",
"count" : 4999, --此分片上有将近5k数据
"size" : 559888,
"avgObjSize" : 112,
"numExtents" : 4,
"storageSize" : 696320,
"lastExtentSize" : 524288,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 1,
"totalIndexSize" : 171696,
"indexSizes" : {
"_id_" : 171696
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.users",
"count" : 1,
"size" : 112,
"avgObjSize" : 112,
"numExtents" : 1,
"storageSize" : 8192,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
},
"ok" : 1
}
mongos>
看上述结果,表明 test.users 集合已经被分片处理了,但是通过 mongos 路由,我们并感觉不到是数据存放在哪个 shard 的 chunk 上的,这就是 MongoDB 用户体验上的一个优势,即对用户是透明的。
相关文章推荐
- 索引键的唯一性(4/4):非唯一聚集索引上的唯一和非唯一非聚集索引
- 第七章:管理维护Replica Sets(读写分离&故障转移&增删节点)
- Vijava (模板部署虚拟机,并指定自定义规范(终极版本))
- Jenkins部分插件介绍
- Linux 安装Maven和nexus代理仓库
- ajax跳转页面问题
- Python跳过第一行读取文件内容
- Linux编程基础――GDB(设置断点)
- CDNPlus的节点和管理中心
- On-Demand Resources Guide中文版(按需加载资源--下)
- 第十五周 课后实践:阅读程序3
- 入门机排序算法
- 家庭理财及基金常识了解
- git 常用命令集合
- 浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
- Hadoop fs 相关命令
- On-Demand Resources Guide中文版(按需加载资源--上)
- #define new DEBUG_NEW
- 【分布式版本控制Git】(二)Github的使用
- iOS——隐藏各种bar