ITPub博客

首页 > 数据库 > NoSQL > MongoDB技术分析(4)- 对象模型

MongoDB技术分析(4)- 对象模型

原创 NoSQL 作者:数据库及存储技术 时间:2018-11-08 15:55:50 0 删除 编辑

MongoDB数据库的对象模型,用MongoDB的术语叫做Catalog,包括逻辑上的对象Database、Collection、View,以及偏物理概念的对象Shard、Chunk、Zone之类的。

对象模型


Shard

Shard是组成集群的物理节点,通常由一个复制集组成,Shard还可以设置多个tag标签,用于定制Collection数据的分布位置。

string _name;          // shard's id    
string _host;          // connection string
vector<string> _tags;  // shard tags

Database

和关系型数据库的Database概念相同,在MongoDB中仅是当做Collection的Namespace在使用,每个Database在创建时都会随机选择一个Shard作为其primary shard,用于存储其下的Non-Shard Collection数据,以及View的定义和执行。

string _name;       // 数据库名称
ShardId _primary;   // 数据库的primary shard
bool _sharded;      // 该数据库是否支持sharding

Collection

Collection对应关系型数据库中Table的概念,支持Non-Shard Collection和Shard Collection两种类型,Non-Shard Collection的数据仅存储在所属数据库的Priamry Shard节点上,Shard Collection则打散存储在所有Shard节点上,或者具有对应tag属性的Shard节点上。

NamespaceString _fullNs;  // Collection Name
KeyPattern _keyPattern;   // Sharding key
bool _unique;             // Sharding key是否是唯一索引

Chunk

Chunk是Collection的一段key range,Shard Collection以Chunk为单位打散存在多个Shard节点上,打散的方式支持range partition和hash partition两种方式。Chunk还是Rebalance的最小粒度,通过在不同Shard间迁移Chunk实现Shard间的负载均衡,Chunk还支持分裂,当单个Chunk容量达到阈值后触发分裂,生成多个Chunk。

std::string _ns;        // 归宿collection
BSONObj _min;           // key范围的下限
BSONObj _max;           // key范围的上限    
ShardId _shard;         // 当前所在shard

Tags

Collection除了均衡打散到所有Shard节点外,还支持根据tag打散到制定Shard节点。可以给每个Collection的不同key range定位为特定的tag,这样这部分数据只会打散存储到拥有该tag定义的shard节点上,特别适合跨地域部署时的就近访问。

std::string _ns;   // tag归宿的collection
std::string _tag;  // tag name
BSONObj _minKey;   // key范围的下限
BSONObj _maxKey;   // key范围的上限

View

View是一个逻辑概念,是对同一个Database下,一个或多个Collection的只读操作定义,View的定义和执行由该View所在Database的Primary Shard执行。

Catalog的实现

上面的对象模型,除view外,都存储在ConfigServer的config数据库中,分别对应Collection为:

  • config.shards

  • config.databases

  • config.collections

  • config.chunks

  • config.tags

Mongos在处理DDL类的Command时,由catalog模块负责和ConfigServer交互操作对应的Collection,主要设计如下图所示:

ShardingCatalogManager和ShardingCatalogClient分别负责修改操作和只读操作,具体操作交由对应Shard对象执行,Shard再封装成Task交由固定的一个TaskExecutor线程执行。

这里有两个重要的缓存:

  • CatalogCache:缓存了所有Collection的ChunkMap,即Chunk在Shard的分布视图,读写操作通过查找该缓存来判断操作涉及哪些Shard节点;

  • ShardRegistry:缓存所有Shard节点和ConfigServer节点的连接及版本信息;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31556448/viewspace-2219254/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2018-09-29

  • 博文量
    4
  • 访问量
    2397