• sharding设计须考虑的几个因素

  • Sharding Key的选择

          在片键的选择上,最好是能够在字段中选择混合型的片键,大范围的递增健、和随机分布的健组合,如按月份递增、按用户名随机。
  • 递增的sharding key

                优点:数据文件移动相对较少;
                缺点:对于不断写入的业务,会造成最后一个分片变成写热点,导致最后的一块分片chunk数量比其他的多,最终chunk不断移动;
  • 随机的sharding key

                优点:数据分布相对均匀、写入的数据基本上能够分布在多个分片上;
                缺点:随机的片键本身就会给磁盘带来巨大的IO读写;
 
 
  • ChunkSize的大小问题

          ChunkSize的默认大小为64M,但是需要根据业务情况、不同硬盘型号、不同文件系统指定合适的chunksize,单个chunkSize一般为100M-200M之间,ChunkSize的大小应该在设计阶段、业务上线之前就要确定。
  • 较大的ChunkSize

               优点:chunk分裂少;
               缺点:存在数据分布不太均衡;以及chunk移动时,会消耗大量的IO写资源;
  • 较小的ChunkSize

                优点:迁移速度快、数据分布更均衡;
                缺点:chunk分裂更频繁,同样也会消耗大量的IO写资源;
 
  • Balancer的时间选择

          需要在业务当天的低谷时段进行数据的自动均衡,如在业务高峰时段设置数据均衡,业务和均衡都在抢占磁盘IO,系统的吞吐量会一下子下降,一般的业务凌晨的业务量会稍微小一些。
  • count值不准确

                由于sharding环境下,写入时,chunk都在不断迁移,所以查询出来的数量往往会大于实际写入的数量,用db.collection.aggregate([{$group: {_id: null,count: {$sum: 1}}}]),可以看到实际的写入值。
 
  • 库设计

1. 生产环境中,库尽量不要开启auto-sharding功能;

2. 在业务量不是很大的情况下,可以将库手动指定在某个分片上;

3. 集群内存的大小总和应该要大于索引+oplog+数据热点;

4. 将更新频繁的collection放在同一个库中,将更新不是很平凡的表也归类到一个库中;

 
  • collection设计

1. 虽然MongoDB为文档型数据库,无须制定schema,但是也意味着每个文档都有重复的字段,会带来空间的浪费,可以通过以下两种办法解决:

1.1  减小字段名,如将address用a来替代,可读性问题在应用层用字段名映射进行解决;

1.2  利用现有wiredtiger引擎中的zlib压缩,可以减小存储空间,也可以减小IO压力;

2. MongoDB自带的_id值默认就是12个字节,可以考虑用其他主键替代,如用户的UID等,可以减小MongoDB的计算压力和存储空间;

3. 对于大表必须要考虑分配的,可以根据主键进行分类,按每个分片的子表不要超过1000条记录计算。

MongoDB Sharding、库、collection设计学习汇总的更多相关文章

  1. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  2. 【安富莱】V6,V5开发板用户手册,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔(2019-11-04)

    说明: 1.本教程重在BSP驱动包设计方法和HAL库的框架学习,并将HAL库里面的各种弯弯绕捋顺,从而方便我们的程序设计. 2.本次工程延续以往的代码风格,从底层BSP驱动包到应用代码,变量命名,文件 ...

  3. 【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至63章(2019-07-21)

    说明: 1.本教程重在BSP驱动包设计方法和HAL库的框架学习,并将HAL库里面的各种弯弯绕捋顺,从而方便我们的程序设计. 2.由于是基于HAL库的文档,所以不限制H7系列,其它F1,F2,F3,F4 ...

  4. MongoDB Sharding分片配置

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

  5. ABP 学习汇总

    本文背景 公司最近规划的新框架准备基于ABP来搭建,自从在阳铭博客看到ABP框架的介绍后,就一直持续关注着,但还没真正在实际项目中直接使用ABP,只是自己做了一些学习和Demo.ABP所用到的一些新技 ...

  6. MongoDB Sharding 机制分析

    MongoDB Sharding 机制分析 MongoDB 是一种流行的非关系型数据库.作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂.丰富的查询功能外,MongoDB 还自 ...

  7. MongoDB Sharding(二) -- 搭建分片集群

    在上一篇文章中,我们基本了解了分片的概念,本文将着手实践,进行分片集群的搭建 首先我们再来了解一下分片集群的架构,分片集群由三部分构成: mongos:查询路由,在客户端程序和分片之间提供接口.本次实 ...

  8. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

  9. 基于mongoDB的capped collection的性能优化

    MonitorLogging改造(消息接入) 改造前架构: 可以看出原来的流程中,大量业务分析,业务接入耦合在web服务层.大量操作,导致线程线性的挂起线程. 改造后: 将业务通讯抽象成为Monito ...

随机推荐

  1. Nam Game

    哪一方最终给对方留下4的倍数个石头则win,即想方设法的给对方留下4的倍数个石头. 例如: 9(B win) A:3 B:2(B取2,给对方余4,对方则lose) A:1 | 2 | 3 B:3 | ...

  2. 泛函编程(28)-粗俗浅解:Functor, Applicative, Monad

    经过了一段时间的泛函编程讨论,始终没能实实在在的明确到底泛函编程有什么区别和特点:我是指在现实编程的情况下所谓的泛函编程到底如何特别.我们已经习惯了传统的行令式编程(imperative progra ...

  3. UVA 10089 Repackaging 数学问题

    大致题意:给出几个包裹,每个包裹都包装好了3种大小的杯子.现在要重新包装,使向量 a[1]*(s[1][1],s[1][2],s[1][3])+a[2]*(s[2][1],s[2][2],s[2][3 ...

  4. Swagger接入

    一 简介 Swagger是一个开源项目,用于描述和生成RestAPi的文档.可以帮助开发人员快速了解web服务的功能. 二  接入Swagger流程 1.在所在Module的pom.xml中,添加Sw ...

  5. Linux下安装DB2_v9.7详细教程

    一:平台 1:HP服务器 cpu:Inter (R) Xeon (R) E5606 2.13G 磁盘:本地磁盘外加存储 2:操作系统 RedHet 5.4 64位 内核:2.6.18-194.1.AX ...

  6. jQuery Sidebar 侧边栏

    在线实例 左边栏 右边栏 使用方法     <div class="txt">             <p class="btn"> ...

  7. Bootstrap源码分析之transition、affix

    一.Transition(过滤) 作为一个基础支持的组件,被其他组件多次引用.实现根据浏览器支持transition的能力,然后绑定动画的结束事件:首先:创建一个Element:然后:迭代查看此元素支 ...

  8. [转]Java中的事务

    这篇Java事务的说明不错,所以把它转过来收藏了. 原博文地址:http://blog.csdn.net/gyf4817/article/details/5362444 通常的观念认为,事务仅与数据库 ...

  9. jQuery原型属性和方法总结

    从大四下学期开始了解jquery源码相关的东西,在回校参加毕业典礼(准确的说是参加补考挂科太多)期间便开始借着<jQuery>内幕学习jquery源码,然后在博客园写笔记也已经两个月了,也 ...

  10. [SQL] SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...