MongoDB数据库的分片shard

MongoDB数据库的分片原理

configsvr不存储真正的数据,它存储的是meta信息,即“某条数据在哪个片上”的信息。mongos查询某条数据时,要先找configsvr,询问得到该数据在哪个shard上。

分片要素有以下四个:

分片步骤如下:

1. 在3台独立服务器上分别运行27017,27018,27019实例,互为副本集,形成3套repl set。

2. 在3台服务器上分别配置config server,运行在27020端口上。 

3. 配置mongos

./bin/mongos --port 30000\

--dbconfig 192.168.1.201:27020,192.168.1.202:27020,192.168.1.203:27020

4. 连接路由器

./bin/mongo --port 30000

5. 添加repl set为片

>sh.addShard('192.168.1.202:27017');

>sh.addShard('192.168.1.202:27018');

>sh.addShard('192.168.1.202:27019');

6. 添加待分片的库

>sh.enableSharding(databaseName);

7. 添加待分片的表

>sh.shardCollection('dbName.collectionName',{field:1});

field是collection的一个字段,系统将会利用field的值,来计算应该分到哪个片上。这个field被称为片键 shard key。

mongodb不是从单片文档的级别绝对平均的散落在各个片上,而是N篇文档形成一个块“chunk”,优先放在某个片上。当这个片上的chunk比另一个片的chunk区别较大(>=3)时,会把本片上的chunk移到另一个片上。以chunk为单位,维护片之间的数据均衡。(默认chunk size = 64M,测试时可以在config数据库中修改小一些,例如1M)

手动分片:

1. sh.shardCollection('shop.user',{userid:1}); //user表用userid做shard key

2. for(var i=1;i<=40; i++){

    sh.splitAt('shop.user',{userid:i*1000});

} //预先在1K、2K......40K这样的节点分好块。切好chunk后(这是chunk空的),这些chunk将会均匀的移动到各片上

3. 通过mongos添加user数据,数据会添加到按预先分好的片上,chunk就不会来回移动了,从而有效预防服务器之间大量移动、剧烈增加服务器的IO。

 

浏览:385 | 点赞:167 | 评论:0
全部评论
暂无评论

快速评论