MongoDB Sharding

  • Sharding结构
  • replica set
  • mmap
  • Chunk的分裂和迁移
    • Chunk的分裂
    • Chunk的迁移

Sharding结构

转载自https://www.it610.com/article/5487366.htm

从图中可以看出,MongoDB sharding 主要分为 3 大部分。shard 节点、config 节点和 mongos节点。对客户端来说,直接访问的是 图中绿色的 mongos 节点。背后的 config 节点和 shard 节点是客户端不能直接访问的。mongos 的主要作用是数据路由。从元数据中定位数据位置,合并查询结果。另外,mongos 节点还负责数据迁移和数据自动平衡,并作为 sharding 集群的管理节点。它对外的接口就和普通的 mongodb 一样。因此,可以使用标准 mongodb 客户端和驱动进行访问。mongos 节点是无状态的,本身不保存任何数据和元数据,因此可以任意水平扩展,这样任意一个节点发生故障都可以很容易的进行故障转移,不会造成严重影响。

其中蓝色的 shard 节点就是实际存放数据的数据节点。每个 shard 节点可以是单个 mongodb 实例,也可以是一个 replica set 。通常在使用 sharding 的时候,都会同时使用 replica set 来实现高可用,以免集群内有单个节点出故障的时候影响服务,造成数据丢失。同时,可以进一步通过读写分离来分担负载。对于每个开启 sharding 的 db 来说,都会有一个 默认 shard 。初始时,第一个 chunk 就会在那里建立。新数据也就会先插入到那个 shard 节点中去。

图中紫色的 config 节点存储了元数据,包括数据的位置,即哪些数据位于哪些节点,以及集群配置信息。config 节点也是普通的 mongod 。如图所示,一组 config 节点由 3 个组成。这 3 个 config 节点并非是一个 replica set。它们的数据同步是由 mongos 执行两阶段提交来保证的。这样是为了避免复制延迟造成的元数据不同步。config 节点一定程度上实现了高可用。在一个或两个节点发生故障时,config 集群会变成只读。但此时,整个 sharding 集群仍然可以正常读写数据。只是无法进行数据迁移和自动均衡而已。

replica set

在sharding结构中shard节点一般是replica set集群
图片来自https://www.cnblogs.com/baizhanshi/p/10098011.html

replica set是MongoDB的一种集群,有Primary、Secondary和arbiter,Primary是集群中的主节点,处理读写操作,secondary通过oplog同步primary 的数据,arbiter只参与投票。当主节点故障后,secondary节点和arbiter通过选举机制选出新的primary,Replica Set中的成员个数为偶数个时,就需要添加一个Arbiter用于投票选举哪个可以升级为Primary,不能在Primary或者Secondary主机上运行Arbiter。

mmap

mongdb的数据使用BSON结构存储在磁盘文档中,通过调用系统函数mmap将使用的数据加载到内存,保持热点数据在内存,加快了数据的读写速度。
mmap类似共享内存,是一种内存映射技术。是在用户态和内核态分配一块共用的内存,用户程序可以直接访问内核空间的缓冲区,这样数据无需再从内核空间复制到用户空间。

Chunk的分裂和迁移

Chunk是shard存储数据时所分的数据块,使用逻辑划分,位置数据保存在config的元数据中,Chunk size默认大小64M。

Chunk的分裂

mongoDB 的自动 chunk 分裂只会发生在写入数据时,当写入的数据超过一定量时,就会触发 chunk 的分裂,具体规则如下。

int ChunkManager::getCurrentDesiredChunkSize() const {// split faster in early chunks helps spread out an initial load betterconst int minChunkSize = 1 << 20;  // 1 MBytesint splitThreshold = Chunk::MaxChunkSize;  // default 64MBint nc = numChunks();if (nc <= 1) {return 1024;} else if (nc < 3) {return minChunkSize / 2;} else if (nc < 10) {splitThreshold = max(splitThreshold / 4, minChunkSize);} else if (nc < 20) {splitThreshold = max(splitThreshold / 2, minChunkSize);}return splitThreshold;
}bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) const {dassert(ShouldAutoSplit);LastError::Disabled d(&LastError::get(cc()));try {_dataWritten += dataWritten;int splitThreshold = getManager()->getCurrentDesiredChunkSize();if (_minIsInf() || _maxIsInf()) {splitThreshold = (int)((double)splitThreshold * .9);}if (_dataWritten < splitThreshold / ChunkManager::SplitHeuristics::splitTestFactor)return false;if (!getManager()->_splitHeuristics._splitTickets.tryAcquire()) {LOG(1) << "won't auto split because not enough tickets: " << getManager()->getns();return false;}......
}

Chunk的迁移

转自:https://wenku.baidu.com/view/45e599fdbaf3f90f76c66137ee06eff9aff8495c.html

当chunk数最多的shard节点和chunk数最少的shard节点的个数差大于设定的阈值时,会触发数据迁移。
chunk的迁移分为7个步骤:
1、balancer进程将moveChunk的命令发送到源shard中
2、源shard使用内部removeChunk命令开始移动,迁移过程中,该Chunk的操作依旧在源shard上进行,源shard依旧负责该chunk的写入操作
3、目标shard开始创建所需索引
4、目标shard开始请求chunk中的文档并开始接受数据的复制
5、接受完源shard的最后一个文档之后,目标shard启动一个同步进程,这个进程会拉取迁移期间的日志,将迁移期间对该Chunk的操作更新到目标chunk中
6、当完全同步时,源shard连接到config数据库并更新chunk的位置元数据
7、完成数据更新后,一旦在源shard上没有对该chunk的操作,源shard会异步删除chunk

MongoDB Sharding相关推荐

  1. MongoDB sharding迁移那些事(一)

    如果不了解 MongoDB Sharded Cluster 原理,请先阅读 MongoDB Sharded cluster架构原理 关于MongoDB Sharding,你应该知道的 关于 shard ...

  2. MongoDB Sharding分片配置

    Ps:mongod是mongodb实例,mongos被默认为为mongodb sharding的路由实例. 本文使用的mongodb版本为3.2.9,因此参考网址为:https://docs.mong ...

  3. MongoDB Sharding 请勿复用已删除的 namespace

    SERVER-17397: Dropping a Database or Collection in a Sharded Cluster may not fully succeed 是 MongoDB ...

  4. MongoDB Sharding 机制分析

    MongoDB 是一种流行的非关系型数据库.作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂.丰富的查询功能外,MongoDB 还自带了相当强大的 sharding 功能. 要 ...

  5. MongoDB sharding模式实现(http://blog.chinaunix.net/xmlrpc.php?r=blog/articleuid=28266791id=5758139 )

    环境准备 1.本例使用3台Linux主机,IP地址如下: 一. 点击(此处)折叠或打开 Server A: 192.168.106.101 Server B: 192.168.106.102 Serv ...

  6. MongoDB Sharding使用总结

    Shard Keys 切片字段的选择 切片方式的选择 查询效果的验证 Balancer Others MongoDB的Sharding机制能够让数据库系统以接近线性的方式进行扩展,非常适合具备大数据集 ...

  7. MongoDB sharding 集合不分片性能更高?

    最近云上用户用户遇到一个 sharding 集群性能问题的疑惑,比较有代表性,简单分享一下 测试配置 mongos x 2.shard x 3 测试1:集合不开启分片,批量 insert 导入数据,每 ...

  8. Mongodb sharding转换一个副本集为分片集群

    2019独角兽企业重金招聘Python工程师标准>>> 1. 部署一个测试副本集 创建第一个副本集实例,名称为firstset: 1.1 创建副本集并且插入数据如下:/data/ex ...

  9. 故障分析 | MongoDB Sharding QPS 分布不均案例一则

    作者:任坤 现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL.mongoDB 和 Redis 维护工作. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授 ...

最新文章

  1. 独家 | 人工神经网络中发现了人类大脑拥有的多模态神经元(附链接)
  2. Python是否具有字符串“包含”子字符串方法?
  3. 【最小生成树+LCA】Imperial roads
  4. jsf标签p:ajax_JSF AJAX请求的会话超时处理
  5. Excel转html
  6. 奇文:金庸小说中的第一高手是谁?
  7. mysql数据排序问题
  8. java常用工具类封装
  9. 李广难封--有感于团队建设
  10. Django 2.1.7 项目技巧 - 创建apps应用目录归纳所有应用
  11. 教你如何在2023年办好水土保持资质
  12. 从这里,开始屌丝的逆袭
  13. ssm+Vue计算机毕业设计在线答题系统(程序+LW文档)
  14. (转)Unity 之 UGUI 小总结
  15. Linux重启后硬盘挂载失效问题解决
  16. 量化:纸上得来终觉浅,绝知此事要躬行。
  17. AES加密算法及演示程序(GO-算法核心实现+Python-前端演示系统)
  18. 压缩算法比较: Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO
  19. 2010年blog汇总:企业架构、敏捷个人、模型驱动
  20. hive实训项目之电商数据分析

热门文章

  1. 【自然语言处理】2. Attention实现详细解析( tfa, keras 方法调用源码分析 自建网络)
  2. php标量类型包括,php7新特性之标量类型声明
  3. 【Android】系统架构功能+init、zygote、system server、app等进程间关系分析
  4. 解决xss/logforging安全漏洞
  5. input 的type类型总结
  6. android开发进阶(一)-- android app启动流程
  7. 【数据库系统概念】第14章 事务 知识总结
  8. 在virtual box中Ubuntu安装增强功能时报错:未能加载光盘,或者只在桌面多出了一个光盘图标
  9. 3d建模和计算机专业对口吗,3D建模师属于什么专业?
  10. wxWidgets 简介