设为首页 收藏本站
查看: 1727|回复: 0

[经验分享] mongodb的sharding架构搭建

[复制链接]

尚未签到

发表于 2015-7-6 09:22:55 | 显示全部楼层 |阅读模式
sharding是一种将海量数据水平扩展的集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式mongodb集群. sharding不是某个特定数据库软件附属的功能,而是具体技术细节上的抽象处理,是水平扩展(横向扩展或向外扩展)的解决方案,主要目的是突破单个数据库服务的I/O能力限制,最终解决数据库扩展性问题.sharding也有其不适合的场景,比如处理事务的应用就会非常复杂.对于跨DB的事务来说,很难保证完整性.

数据库sharding主要有以下优点:
提高了近似线性扩展的架构,可以随着应用的增长线性地增加更多的服务器
提高了数据库的可用性。如果只有一个数据库,一旦当掉,对其提供的service影响是100%,如果拆成10台那么,每台当掉的影响就为10%
小型数据库的压力比较小,风险小,性能更好.

MongoDB将数据分块称为chunk,每个chunk都是collection中一段连续的数据记录,通常最大尺寸是200MB,超出则生成新的数据块.
MongoDB的Sharding架构
DSC0000.png
构建一个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.包括启动和配置服务器,路由进程等方法.
DSC0001.png
创建对应的文件夹



数据存放目录:
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
如下图:
DSC0002.png
另起一个窗口
   DSC0003.png
启动Config Server(新建窗口)



mongod --configsvr --port 6000 --dbpath=../data/shard/config --logpath=../logs/shard/config.log --directoryperdb
如图:
DSC0004.png
启动RouteProcess(新建窗口)



mongos --port 8000 --configdb localhost:6000 --logpath=../logs/shard/route.log --chunkSize 1
参数说明:
chunkSize用来指定chunk的大小(单位:MB),默认值为200
DSC0005.png
配置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这一列.
如图:
DSC0006.png
至此,一个完整的sharding环境部署完毕.

验证sharding
循环向test.users表中插入20万条数据,然后使用命令test.users.stats()查看表的分片情况.



> use test
switched to db test
> for(var i=1; i db.users.stats()
如图:
DSC0007.png

新增Shard Server
启动一个新Shard Server进程,如下面代码所示.
D:\program files\mongo\data\shard\sv2



mongod --shardsvr --port 8887 --dbpath=../data/shard/sv2 --logpath=../logs/shard/sv2.log
DSC0008.png
配置新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 }
如图:
DSC0009.png
接下来看分片表状态,以验证新的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()
如图:
DSC00010.png
移除Shard Server
移除Shard Server,系统首先会将即将移除的Shard Server上的数据平均分配到其他Shard Server上,然后将这个Shard Server踢下线.
注意:移除Shard Server的操作对客户端完全是透明的,不影响用户正常使用,也不需要待机进行.
例如要移除8889端口的shard Server, 需要不停地调用以下命令来观察这个移除操作执行到哪里了.
db.runCommand({ "removeshard":"localhost:8889" );
移除过程中会出现3种状态.
状态一如图,表示移除的动作是刚刚开始.
DSC00011.png
状态二如图,”ongoing”表示移除已经开始
   DSC00012.png
状态三如图,”completed”表示移除完成
DSC00013.png
使用 printShardingStatus();查看Sharding信息
DSC00014.png
  判断是否是Sharding
   DSC00015.png
  通过执行 db.runCommand({ isdbgrid:1 })命令查看当前实例是否在Sharding环境中.
  列出所有Shard Server
   DSC00016.png
转载请注明出处:[http://www.iyunv.com/dennisit/archive/2013/02/18/2916159.html]
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83664-1-1.html 上篇帖子: Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作 下篇帖子: Spring Data集成MongoDB访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表