MongoDB整理笔记の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 上。
    下面我们在同一台物理机器上构建一个简单的 Sharding Cluster:

架构图如下:

Shard Server 1:20000
     Shard Server 2:20001
    Config Server :30000
     Route Process:40000

(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

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

启动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。
  (2)配置Sharding

接下来,我们使用MongoDB Shell 登录到mongos,添加Shard 节点

[[email protected] ~]# /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 }
>

(3)验证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
}
>

我们看一下磁盘上的物理文件情况

[[email protected] 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
[[email protected] 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
[[email protected] bin]#

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

时间: 2024-12-25 23:59:35

MongoDB整理笔记のSharding分片的相关文章

MongoDB整理笔记のReplica Sets + Sharding

MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding"的解决方案. shard: 使用Replica Sets,确保每个数据节点都具有备份,自动容错转移,自动回复能力. config: 使用3个配置服务器,确保元数据的完整性. route: 使用3个路由进程,实现负载均衡,提高客户端接入性能. 配置Replica Sets + Sharding 架构图: 配置

MongoDB整理笔记の管理Sharding

1.列出所有的Shard Server > db.runCommand({ listshards: 1 }) --列出所有的Shard Server { "shards" : [ { "_id" : "shard0000", "host" : "localhost:20000" }, { "_id" : "shard0001", "host"

MongoDB整理笔记の新增Shard Server

1.启动一个新Shard Server 进程 [[email protected] ~]# mkdir /data/shard/s2 [[email protected] ~]# /Apps/mongo/bin/mongod --shardsvr --port 20002 --dbpath /data/shard/s2 --fork --logpath /data/shard/log/s2.log --directoryperdb all output going to: /data/shard

MongoDB 学习笔记之 分片和副本集混合运用

 分片和副本集混合运用: 基本架构图: 搭建详细配置: 3个shard + 3个replicat set + 3个configserver + 3个Mongos shardrsname Primary Secondary Secondary port bigdata-sh-a bigdata-sh-a1 bigdata-sh-a2 bigdata-sh-a3 28111 bigdata-sh-b bigdata-sh-b2 bigdata-sh-b1 bigdata-sh-b3 28112 bi

MongoDB整理笔记の走进MongoDB世界

本人学习mongodb时间不长,但是鉴于工作的需要以及未来发展的趋势,本人想更深层的认识mongodb底层的原理以及更灵活的应用mongodb,边学边工作实践.  mongodb属于nosql中算是最热门的数据库,所以我们不妨对nosql有一个最基本的了解:  NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库.NoSQL 被我们用得最多的当数key-value 存储,当然还有其他的文档型的.列存储.图型数据库.xml 数据库等.与关系型数据库相比,关系型数据库给你强加了太多

MongoDB整理笔记のMapReduce

MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中的所有记录,将key和value传递给Reduce函数进行处理.Map函数和Reduce函数可以使用JS来实现,可以通过db.runCommand或mapReduce命令来执行一个MapReduce操作. 示例she

MongoDB整理笔记のCapped Collection

1.简单介绍 capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小.如果空间用完,新添加的对象将会取代集合中最旧的对象. 2.功能特点 可以插入及更新,但更新不能超出collection 的大小,否则更新失败.不允许删除,但是可以调用drop() 删除集合中的所有行,但是drop 后需要显式地重建集合.在32 位机

MongoDB整理笔记のCRUD

添加 下面我们来建立一个test 的集合并写入一些数据.建立两个对象j 和t , 并保存到集合中去.在例子里 “>” 来表示是 shell 输入提示符    > j = { name : "mongo" };    {"name" : "mongo"}    > t = { x : 3 };    { "x" : 3 }    > db.things.save(j);    > db.things

MongoDB整理笔记の安装及配置

1.官网下载 地址:http://www.mongodb.org/downloads mongodb-linux-x86_64-2.4.9.tgz (目前为止,64位最新版本) 2.解压 切换到下载目录下,命令行输入: tar zxf mongodb-linux-x86_64-2.4.9.tgz 3.创建数据库文件夹和日志文件 命令行输入: mkdir /usr/local/mongodb/data touch /usr/local/mongodb/logs 上面两行命令代表,所有与mongod