好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mongodb的sharding架构搭建

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架构搭建的详细内容...

  阅读:37次