MongoDB管理与开发精要《红丸出品》22.1~22.5 Sharding分片之部署

第二十二章 Sharding分片

这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB集群。

 

MongoDB 的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块。

 

要构建一个 MongoDB ShardingCluster,需要三种角色:

ShardServer

即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Set。为了实现每个Shard内部的auto-failover,MongoDB官方建议每个Shard为一组Replica Set。

ConfigServer

为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,例如{age: 1} ,shard key可以决定该条记录属于哪个chunk。Config Servers就是用来存储:所有shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况、该集群中所有DB和collection的sharding配置信息。

RouteProcess

这是一个前端路由,客户端由此接入,然后询问ConfigServers需要到哪个Shard上查询或保存记录,再连接相应的Shard进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod的查询或更新请求原封不动地发给RoutingProcess,而不必关心所操作的记录存储在哪个Shard上。

 

下面我们在同一台物理机器上构建一个简单的Sharding Cluster:

架构图如下:

l  Shard Server 1:20000

l  Shard Server 2:20001

l  Config Server :30000

l  Route Process:40000

 

22.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

22.2启动Config Server

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实例

22.3启动Route Process

/Apps/mongo/bin/mongos --port 40000 --configdb localhost:30000 --fork --logpath /data/shard/log/route.log  --chunkSize 1 --启动Route Server实例

mongos启动参数中,chunkSize这一项是用来指定chunk的大小的,单位是MB,默认大小为200MB,为了方便测试Sharding效果,我们把chunkSize指定为 1MB。

22.4配置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 }

22.5 验证Sharding正常工作

我们已经对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]#

 

看上述结果,表明test.users集合已经被分片处理了,但是通过mongos路由,我们并感觉不到是数据存放在哪个shard的chunk上的,这就是MongoDB用户体验上的一个优势,即对用户是透明的。

 -------------------------------------------------------------------

《MongoDB管理与开发精要》、《Redis实战》作者
ChinaUnix.net专家 
http://cdhongwan.blog.chinaunix.net
@CD红丸           http://weibo.com/u/2446082491



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值