MongoDB Sharding(分片)笔记

2019-09-29  本文已影响0人  春秋杰瑞

Sharding 是一种将数据分散到多台主机上的方法,使得 MongoDB 能够支持处理超大数据集和超高吞吐量。实质上 Sharding 实现了横向扩展能力。

Sharding 结构

Sharding 集群由以下组件构成:

<img src="/assets/img/sharded-cluster-production-architecture.bakedsvg.svg" title="sharded-cluster-production-architecture"/>

MongoDB 在 collection 层面分片,将 collection 中的数据分散到不同 shard.

分片键

为了划分 collection,MDB(MongoDB) 需要分片键来分区 collection,分片键由不可变字段或者出现在每一个文档中的字段构成。
你可以在分片collection 时选择一个分片键,一旦选择不可更改,一个集合只能有一个分片键。
分片非空集合,要求该集合必须必须存在一个以分片键起始的索引。分片键的选择可能对性能产生影响,务必小心。

分块 —— MDB 将分片数据划分为块,每一块都有一个上(包含)下(不包含)界。

自动均衡 —— MDB 支持自动迁移分块,以便实现自均衡。

优势

注意点

分片和非分片集合混合

MDB 允许混合集合,非分片集合存储在 PRIMARY SHARD(默认是可用空间最多的,用 MOVEPRIMARY 改变)。

<img src="/assets/img/sharded-cluster-primary-shard.bakedsvg.svg" title="sharded-cluster-primary-shard"/>

连接分片集群

你必须连接至 mongos 路由器以便读取或写入任何分片集群中的集合。客户端永远都不应该直接访问 SHARD!!!!!

<img src="/assets/img/sharded-cluster-mixed.bakedsvg.svg" title="sharded-cluster-mixed"/>

分片策略

MDB 支持两种分片策略,分别是 散列分片 和 区域分片。

散列分片需要先计算出分片键的哈希值,基于哈希值,每个分块都被指定一段区域。(意思应该是每个分块对应一段区域,如果散列值落到此区域这存储到这个分块)

(MDB 将自动计算散列值! Nice)

基于散列值的数据分布更加均匀,特别是分片键递增的场合。这也意味着,基于分片键的区域查询操作更加耗时。

<img src="/assets/img/sharding-hash-based.bakedsvg.svg" title="sharding-hash-based"/>

区域分片基于分片键将数据划分成区域,同上。一段区域的分片键更容易保存到同一片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()

帮助链接:

上一篇下一篇

猜你喜欢

热点阅读