金瓶梅秘戏图 下载:【学习笔记】MongoDB分布式学习笔记2

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 23:51:37
学习文档:Oreilly.Scaling.MongoDB.Jan.2011.pdf
学习内容:
第一章:
1.1 Sharding是什么
Sharding是MongoDB中使用的一种将大的collection分配到几个服务器(cluster)中的方法。
MongoDB与以往数据库分表方法的最主要的区别就是MongoDB的每一项任务都是自动运行的。
Mongo完成分片的步骤很简单:数据库管理员告知mongoDB增加新的服务器mongod,MongoDB会自动完成在几个服务器之间均衡负载。
1.2 Sharding的目的
封装集群(make the cluster invisible)
确保随时读写集群(make the cluster always available for reads and writes)
集群易扩展(let the cluster grow easily)
第二章:
2.1 分割数据
一个分片指的是集群当中的一个或者多个服务器,负责存储数据集合当中的某些子集。
如果一个分片当中包含了多个服务器mongod,那么每一个mongod中的数据信息都是相同的。
因此可以将一个分片看作是一个备份数据集合。

MongoDB中存储的数据一般以[a,b)的形式出现,范围是“最小从a开始包括a,最大到b不包括b”。
2.2 分割数据(Distributing Data)
需要考虑的问题:良好的可扩展性、均衡负载
使用的分片方法:多范围分片
具体简单描述:假设原来分为[a,f) [f,n) [n,p) [p,z]若增加了一个新的服务器,分为[a,d) [f,j) [n,p) [p,z] {[d,f)+[j,n)}
2.3 chunks是如何被创建的
我们把处于某个特定范围内的数据叫做一个chunk。
shard key是用来分割范围也就是创建chunk的关键字。
2.4 将collections分片
当第一次为某个collection分片的时候,MongoDB创建一个chunk,这个chunk的范围是从最小的值,到最大的值。
如果以collection中的age为shard key,且初始chunk为[1,30],且年龄在20岁以下的占总数的一半
第一次分片会被分为[1,20] [20,30]
2.5 均衡负载
由均衡负载器(balancer)负责均衡负载的问题。《略》
2.6 路由服务器 mongos
mongos是负责用户和集群交互的。它的工作就是负责隐藏集群内部的分片信息,并且向用户展现一个整齐的但服务器接口。
当客户使用一个mongo集群的时候,客户所有的读写操作都要通过mongos。mongos负责转发所有用户的请求到正确分片。
2.7 配置服务器 config server
2.8 集群架构解析
典型地,一个MongoDB汲取包含三个过程:shards负责存储数组,mongos负责路由请求信息,config server负责维持集群状态。

========   学习笔记2  =============
转载自 chenliying01
最终编辑 chenliying01
创建一个MongoDB Cluster
学习资料:Oreilly.Scaling.MongoDB.Jan.2011.pdf
第一步:选择Shard Key
这一步很关键,对以后集群的可扩展性有深刻的影响,所以Shard Key的选取一定要谨慎。
这部分内容多且杂,不在这里细说,具体参看学习资料第三章。
第二步:将一个已经存在的collections分片
具体的部署步骤见下
【转自】http://blog.csdn.net/daizhj/archive/2010/09/07/5868360.aspx
模拟2个shard服务和一个config服务, 均运行在10.0.4.85机器上,只是端口不同
Shard1:27020
Shard2:27021
Config:27022
Mongos启动时默认使用的27017端口
在C,D,E磁盘下分别建立如下文件夹:
mongodb\bin
mongodb\db
然后用CMD命令行依次打开相应文件夹下的mongd文件:
c:\mongodb\bin\mongod --dbpath c:\mongodb\db\ --port 27020
d:\mongodb\bin\mongod --dbpath d:\mongodb\db\ --port 27021
e:\mongodb\bin\mongod --configsvr --dbpath e:\mongodb\db\ --port 27022          (注:config配置服务器)
启动mongos时,默认开启了27017端口
e:\mongodb\bin\mongos --configdb 10.0.4.85:27022
然后打下mongo:
E:\mongodb\bin>mongo   回车  (有时加端口会造成下面的addshard命令出问题)
> use admin
switched to db admin
> db.runCommand( { addshard : "10.0.4.85:27020", allowLocal : 1, maxSize:2 , minKey:1, maxKey:10} )
--添加sharding,maxsize单位是M,此处设置比较小的数值只为演示sharding效果
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.runCommand( { addshard : "10.0.4.85:27021", allowLocal : 1, minKey:1000} )
{ "shardAdded" : "shard0001", "ok" : 1 }
注:如果要移除sharding,可用下面写法
db.runCommand( { removeshard : "localhost:10000" } );
> db.runCommand({listshards:1});   查看shard节点列表
      {
"shards" : [
{
"_id" : "shard0000",
"host" : "10.0.4.85:27020"
},
{
"_id" : "shard0001",
"host" : "10.0.4.85:27021"
}
],
"ok" : 1
}
接下来创建相应数据库并设置其"可以sharding",新建自动切片的库user001:
> config = connect("10.0.4.85:27022")
> config = config.getSisterDB("config")
> dnt_mongodb=db.getSisterDB("dnt_mongodb");
dnt_mongodb
> db.runCommand({enablesharding:"dnt_mongodb"})
{ "ok" : 1 }
注:一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片(下面会设置),否则一个数据集的所有数据将放在一个分片上。
> db.printShardingStatus();
   --- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "10.0.4.85:27020" }
{ "_id" : "shard0001", "host" : "10.0.4.85:27021" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "dnt_mongodb", "partitioned" : true, "primary" : "shard0000" }
> db.runCommand( { shardcollection : "dnt_mongodb.posts1", key : {_id : 1}, unique: true } )
{ "collectionsharded" : "dnt_mongodb.posts1", "ok" : 1 }
        --使用shardcollection 命令分隔数据集,key自动生成。
如果要进行GridFS sharding,则需进行如下设置:
db.runCommand( { shardcollection : "test.fs.chunks", key : { _id : 1 } } )
{"ok" : 1} ,更多内容参见http://eshilin.blog.163.com/blog/static/13288033020106215227346/
> db.printShardingStatus()
   --- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "localhost:27020" }
{ "_id" : "shard0001", "host" : "localhost:27021" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "user001", "partitioned" : true, "primary" : "shard0000" }
dnt_mongodb.posts1e chunks:
{ "name" : { $minKey : 1 } } -->> { "name" : { $maxKey :
1 } } on : shard0000 { "t" : 1000, "i" : 0