MongoDB分片

来源:互联网 发布:mysql判断表是否存在 编辑:程序博客网 时间:2024/04/30 00:37

1. 建立一个MongoDB集群(详见MongoDB集群搭建)

MongoDB集群搭建

2.分片

  1. 要对一个集合分片,首先要对这个集合的数据库启用分片

    sh.enableSharding(“test”)

  2. 对集合分片时需要指定片键。只有被索引过的键才能成为片键

    db.user.ensureIndex({“username”:1})

  3. 依据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中写请求为升序更高效
可以使用复合片键,第一个为势较低的键,第二个为升序键。完美

0 0
原创粉丝点击