mongodb的sharding架构搭建
mongodb的sharding架构搭建
sharding 是一种将海量数据水平扩展的集群系统 , 数据分表存储在 sharding 的各个节点上 , 使用者通过简单的配置就可以很方便地构建一个分布式 mongodb 集群 . sharding 不是某个特定数据库软件附属的功能 , 而是具体技术细节上的抽象处理 , 是水平扩展 ( 横向扩展或向外扩展 ) 的解决方案 , 主要目的是突破单个数据库服务的 I/O 能力限制 , 最终解决数据库扩展性问题 .sharding 也有其不适合的场景 , 比如处理事务的应用就会非常复杂 . 对于跨 DB 的事务来说 , 很难保证完整性 .
数据库 sharding 主要有以下优点 :
提高了近似线性扩展的架构 , 可以随着应用的增长线性地增加更多的服务器
提高了数据库的可用性。如果只有一个数据库 , 一旦当掉 , 对其提供的 service 影响是 100%, 如果拆成 10 台那么 , 每台当掉的影响就为 10%
小型数据库的压力比较小 , 风险小 , 性能更好 .
MongoDB 将数据分块称为 chunk, 每个 chunk 都是 collection 中一段连续的数据记录 , 通常最大尺寸是 200MB, 超出则生成新的数据块 .
MongoDB 的 Sharding 架构
构建一个 mongoDB Sharding Cluster 需要三种角色: shard 服务器 (Shard Server) 、配置服务器 (config Server) 、路由进程 (Route Process)
Shard 服务器
shard 服务器即存储实际数据的分片 , 每个 shard 可以是一个 mongod 实例 , 也可以是一组 mongod 实例构成的 Replica Sets. 为了实现每个 Shard 内部的故障自动转换 ,MongoDB 官方建议每个 shard 为一组 Replica Sets.
配置服务器
为了将一个特定的 collection 存储在多个 shard 中 , 需要为该 collection 指定一个 shard key, 决定该条记录属于哪个 chunk. 配置服务器可以存储以下信息 .
每个 shard 节点的配置信息
每个 chunk 的 shard key 范围
chunk 在各 shard 的分布情况
集群中所有 DB 和 collection 的 sharding 配置信息 .
路由进程
它是一个前段路由 , 客户端由此接入 , 首先询问配置服务器需要到哪个 shard 上查询或保存记录 , 然后连接相应的 shard 执行操作 , 最后将结果返回给客户端 , 客户端只需要将原本发给 mongod 的查询或更新请求原封不动地发给路由进程 , 而不必关心所操作的记录存储在哪个 shard 上 .
构建一个简单的 Sharding Cluster
复制集是由一系列物理机器组成的 , 用一个机器作为主库 , 其他的机器作为从库 , 为了演示方便 , 在同一台物理机器上构建一个简单的 sharding cluster. 包括启动和配置服务器 , 路由进程等方法 .
创建对应的文件夹
数据存放目录: D:\program files\mongo\data\shard\sv0 D:\program files\mongo\data\shard\sv1 D:\program files\mongo\data\shard\config 日志存放目录: D:\program files\mongo\logs\shard\sv0.log D:\program files\mongo\logs\shard\sv1.log D:\program files\mongo\logs\shard\config.log D:\program files\mongo\logs\shard\route.log
启动 shardserver[ 启动 2 个窗口 ]
mongod --shardsvr --port 8888 --dbpath=data/shard/sv0 --logpath=logs/shard/sv0.log -- directoryperdb mongod --shardsvr --port 8889 --dbpath=data/shard/sv1 --logpath=logs/shard/sv1.log --directoryperdb
如下图 :
另起一个窗口
启动 Config Server( 新建窗口 )
mongod --configsvr --port 6000 --dbpath=data/shard/config --logpath=logs/shard/config.log --directoryperdb
如图 :
启动 RouteProcess( 新建窗口 )
mongos --port 8000 --configdb localhost:6000 --logpath=logs/shard/route.log --chunkSize 1
参数说明 :
chunkSize 用来指定 chunk 的大小 ( 单位 :MB), 默认值为 200
配置 Sharding
使用 mongo 客户端登录路由控制器添加 shard 节点 .
D:\program files\mongo\bin>mongo admin --port 8000 MongoDB shell version: 1.8.1 connecting to: 127.0.0.1:8000/admin > db.runCommand({ addshard:"localhost:8888" }) { "shardAdded" : "shard0000", "ok" : 1 } > db.runCommand({ addshard:"localhost:8889" }) { "shardAdded" : "shard0001", "ok" : 1 } > db.runCommand({ enablesharding:"test" }) { "ok" : 1 } > db.runCommand({ shardcollection:"test.users", key:{ _id:1 }}) { "collectionsharded" : "test.users", "ok" : 1 } > 说明: mongo admin --port 8000 表示连接到路由控制器的admin数据库. db.runCommand({ addshard:"localhost:8888" }) 表示添加本地端口8888的shard server实例. db.runCommand({ enablesharding:"test" })表示要在test数据库上执行分片,其中的test代表要分片的数据库. db.runCommand({ shardcollection:"test.users", key:{ _id:1 }}) 设置要在test数据库的users表上分片,同时指明shard key是id这一列.
如图 :
至此 , 一个完整的 sharding 环境部署完毕 .
验证 sharding
循环向 test.users 表中插入 20 万条数据 , 然后使用命令 test.users.stats() 查看表的分片情况 .
> use test switched to db test > for (var i=1; i<200000; i++) db.users.insert({name:"user"+i, age:i, email:"dennisit@163.com" }) > db.users.stats()
如图 :
新增 Shard Server
启动一个新 Shard Server 进程 , 如下面代码所示 .
D:\program files\mongo\data\shard\sv2
mongod --shardsvr --port 8887 --dbpath=data/shard/sv2 --logpath=logs/shard/sv2.log
配置新 shard server.
D:\program files\mongo\bin>mongo admin --port 8000 MongoDB shell version: 1.8.1 connecting to: 127.0.0.1:8000/ admin > db.runCommand({ addshard:"localhost:8887" }) { "shardAdded" : "shard0002", "ok" : 1 }
如图 :
接下来看分片表状态 , 以验证新的 shard server 已生效 .
> use test switched to db test > db.users.stats() { "sharded" : true , "ns" : "test.users" , "count" : 599998 , "size" : 50399116 , "avgObjSize" : 83.99880666268888 , "storageSize" : 102398720 , "nindexes" : 1 , "nchunks" : 42 , "shards" : { "shard0000" : { "ns" : "test.users" , "count" : 233266 , "size" : 19594344 , "avgObjSize" : 84 , "storageSize" : 47822848 , "numExtents" : 9 , "nindexes" : 1 , "lastExtentSize" : 14495232 , "paddingFactor" : 1 , "flags" : 1 , "totalIndexSize" : 9723904 , "indexSizes" : { "_id_" : 9723904 }, "ok" : 1 }, "shard0001" : { "ns" : "test.users" , "count" : 230087 , "size" : 19327336 , "avgObjSize" : 84.00012169309869 , "storageSize" : 33327616 , "numExtents" : 8 , "nindexes" : 1 , "lastExtentSize" : 12079360 , "paddingFactor" : 1 , "flags" : 1 , "totalIndexSize" : 9592832 , "indexSizes" : { "_id_" : 9592832 }, "ok" : 1 }, "shard0002" : { "ns" : "test.users" , "count" : 136645 , "size" : 11477436 , "avgObjSize" : 83.99455523436643 , "storageSize" : 21248256 , "numExtents" : 7 , "nindexes" : 1 , "lastExtentSize" : 10066176 , "paddingFactor" : 1 , "flags" : 1 , "totalIndexSize" : 7684096 , "indexSizes" : { "_id_" : 7684096 }, "ok" : 1 } }, "ok" : 1 } >
查看 Sharding 信息
printShardingStatus()
如图:
移除 Shard Server
移除 Shard Server, 系统首先会将即将移除的 Shard Server 上的数据平均分配到其他 Shard Server 上 , 然后将这个 Shard Server 踢下线 .
注意 : 移除 Shard Server 的操作对客户端完全是透明的 , 不影响用户正常使用 , 也不需要待机进行 .
例如要移除 8889 端口的 shard Server, 需要不停地调用以下命令来观察这个移除操作执行到哪里了 .
db.runCommand({ "removeshard":"localhost:8889" );
移除过程中会出现 3 种状态 .
状态一如图 , 表示移除的动作是刚刚开始 .
状态二如图 , ” ongoing ” 表示移除已经开始
状态三如图 , ” completed ” 表示移除完成
使用 printShardingStatus(); 查看 Sharding 信息
判断是否是 Sharding
通过执行 db.runCommand({ isdbgrid:1 }) 命令查看当前实例是否在 Sharding 环境中 .
列出所有 Shard Server
转载请注明出处:[ http://www.cnblogs.com/dennisit/archive/2013/02/18/2916159.html ]
热爱生活,热爱Coding,敢于挑战,用于探索 ...
分类: NoSQL
标签: MongoDB , 搭建 , sharding架构
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于mongodb的sharding架构搭建的详细内容...