知识就是力量 ——弗朗西斯·培根
by Jerry Chin
Sharding 是一种将数据分散到多台主机上的方法,使得 MongoDB 能够支持处理超大数据集和超高吞吐量。实质上 Sharding 实现了横向扩展能力。
Sharding 集群由以下组件构成:
MongoDB 在 collection 层面分片,将 collection 中的数据分散到不同 shard.
为了划分 collection,MDB(MongoDB) 需要分片键来分区 collection,分片键由不可变字段或者出现在每一个文档中的字段构成。 你可以在分片collection 时选择一个分片键,一旦选择不可更改,一个集合只能有一个分片键。 分片非空集合,要求该集合必须必须存在一个以分片键起始的索引。分片键的选择可能对性能产生影响,务必小心。
分块 —— MDB 将分片数据划分为块,每一块都有一个上(包含)下(不包含)界。
自动均衡 —— MDB 支持自动迁移分块,以便实现自均衡。
优势
注意点
MDB 允许混合集合,非分片集合存储在 PRIMARY SHARD(默认是可用空间最多的,用 MOVEPRIMARY 改变)。
你必须连接至 mongos 路由器以便读取或写入任何分片集群中的集合。客户端永远都不应该直接访问 SHARD!!!!!
MDB 支持两种分片策略,分别是 散列分片 和 区域分片。
散列分片需要先计算出分片键的哈希值,基于哈希值,每个分块都被指定一段区域。(意思应该是每个分块对应一段区域,如果散列值落到此区域这存储到这个分块)
(MDB 将自动计算散列值! Nice)
基于散列值的数据分布更加均匀,特别是分片键递增的场合。这也意味着,基于分片键的区域查询操作更加耗时。
区域分片基于分片键将数据划分成区域,同上。一段区域的分片键更容易保存到同一片chunk。
| 组件 | 数量 | 默认端口 |
|---|---|---|
| Shard | sharding 至少需要 2个 shard | 27018 |
| mongos | 一个即可,可以更多 | 27017 |
| config server | 1 个(完全无备份) 3个(safe!) | 27019 |
// 初始化 Config 服务器所属 Replica Set
rs.initiate(
{
_id: "helloworld",
configsvr: true,
version: 1,
members: [
{ _id : 0, host : "10.252.107.239:27019" },
]
}
)
// 查询 config 最近都干了什么
use config
db.changelog.find().sort({time: -1}).limit(5).pretty()
db.actionlog.find().sort({time: -1}).limit(5).pretty()
// 修改分块大小
use config
db.settings.save( { _id:"chunksize", value: <,MB> } )
// 手动移动分块,必须先停止 Balancer
use admin
db.runCommand({ moveChunk: "db.collection", bounds : [ { "shardKey" : NumberLong("-7580132945406171168") }, { "shardKey" : NumberLong("-5939573624981956557") } ], to: "new_shard_" })
// 创建散列索引(用于分片)
db.collection.createIndex({"key": "hashed"});
// 获取分片集合分片情况
db.collection.getShardDistribution()
帮助链接:
tags: MongoDB