1. 建立一个MongoDB集群(详见MongoDB集群搭建)
2.分片
要对一个集合分片,首先要对这个集合的数据库启用分片
sh.enableSharding(“test”)
对集合分片时需要指定片键。只有被索引过的键才能成为片键
db.user.ensureIndex({“username”:1})
依据username进行分片
sh.shardCollection(“test.users”,{“username”:1})
也可以使用复合片键
sh.shardCollection(“test.users”,{“username”:1,”age”:1})
//但当给定username的值时,可以快速路由,但是,若给定age,则需要查询全部分片
3.查询
包含片键的查询可以使mongos直接路由到制定分片,被称之为定向查询
而不包含片键的查询使得mongos不得不将查询请求在每个分片上查询一次,将结果聚合起来返回客户端,被称之为分散-聚集查询。
4.块拆分
当多mongos启动时,有些mongos只需要负责路由,而并不需要拆分。所以可以在启动mongos时使用 –nosplit 关闭块拆分
5.均衡器
负责数据迁移,查看config.locks集合,可知那个是均衡器
db.locks.findOne(“_id”:”balancer”);
6.选择片键的标准
- 计划做多少个分片
- 是否为了减少读写延迟
- 是否为了增加吞吐量
- 是否为了增加系统资源
7.数据分发
常用的片键通常有三种
- 升序片键
- 随机分发的片键
- 基于位置的片键
如果追求数据加载速度的极致,那么散列片键是最佳选择
创建一个三列片见,首先要创建散列索引
db.user.ensureIndex({“username”:”hashed”})
sh.shardCollection(“app.users”,{“username”:”hashed”})
使用GridFS则非常适合选择这种片键
db.fs.chunks.ensureIndex({“files_id”:”hashed”})
sh.shardCollection(“test.fs.chunks”,{“files_id”:”hashed”})
7.流水策略
当有一些更强大的服务器,我们则希望能它能承受更大的负载
为实现这种策略,需将最大范围的块指定在ssd分片上
sh.addShardTag(“shard-name”,”ssd”)
sh.addTagRange(“dbName.collName”{“_id”:ObjectId()}),
…{“_id”:MaxKey},”ssd”)
use config
var tag = db.tags.findOne({“ns”:”dbname.colname”},
“max”:{“shardKey”:”MaxKey”})
tag.min.shardKey = ObjectId()
db.tags.save(tag)
8.多热点
在集群中,分片最为高效;在单个mongod中写请求为升序更高效
可以使用复合片键,第一个为势较低的键,第二个为升序键。完美