极牛技术实践分享活动
极牛技术实践分享系列活动是极联合顶级VC、技术专家,为企业、技术人提供的一种系统的线上技术分享活动。
每期不同的技术主题,和行业专家深度探讨,专注解决技术实践难点,推动技术创新,每两周的周三20点正式开课。欢迎各个机构、企业、行业专家、技术人报名参加。

本期大纲
MongoDB是啥?特点及适用场合?
高可用如何做?
性能调优?
监控与排错?

嘉宾介绍
魏佳,先后就职于IBM创新技术研究院、新浪微博平台架构部及新浪微博技术评审委员会、Mico联合创始人及CTO,现任LinkedIn中国技术主管。对企业级应用技术、虚拟化技术以及分布式消息中间件有深入的研究。对大规模分布式系统、高并发Web系统,主流通信系统的技术栈和协议有丰富的工程经验。 同时具备扎实的计算机科研技能,著有多篇中外技术专利。从技术架构层面支撑其从0到千万级注册用户,日均百万级活跃用户,日均千万级消息量的发展和演进。

MongoDB的话题
今天的话题主要围绕以下几个方面吧:1. What? 2. Why? 3. How?

首先MongoDB作为NoSQL兴起时的一个代表,最近这些年发展非常迅速,同时使用也很广泛。一两句来说MongoDB是什么?有10gen公司来开发和维护,由C++开发,支持众多的语言。feature层面,它是document-based,同时是DDL free的,不说schema free是因为很多场景中还是需要schema的。重要的是它easy tounderstand/learn and use,同时支持server-side script。此外,spatial index,GridFS以及有限度的MR的支持,也拓宽了它的使用场景。

为什么选择MongoDB呢?
首先说到选型问题,我认为技术决策和选型的过程首先要抛弃先入为主的狭隘思维。没有万能的工具,只有最合适的工具。“不考虑场景的唯XX论”的观点我个人很不认同。

具体到几方面:
社区活跃和支持程度。MongoDB的mailing list和community非常得活跃,同时响应很迅速。
生态完善程度,包括文档、辅助工具,以及是否方便得与既有基础设施或工具集成。
这些方面使得学习和掌握的过程变得容易。

场景方面:
对于大部分startup,需要的是快速的业务迭代,这往往意味着需求的不稳定性,映射到产品和技术层面,可能就是模型的频繁变化,所以DDL(schema)-free是个诱人的优势。
非强事务的场景,对于ACID要求严格的场景那肯定是传统的RDBMS更为合适。
对spatialindex的支持很好,适合现在很多流行的空间查询场景,比如类似“周围的XX”,“多边形关系”等。

开箱即用的一些分布式能力支持,这个对于startup初期,尽量减少devops的时间和精力还是很有必要的。

高可用如何做?
MongoDB具备开箱即用的复制集能力,通过典型的Primary+Secondary+Arbiter拓扑来构建复制集。
基本的结构就如这幅图:

搭建非常容易,参考官方的手册即可。复制集通过preference的设置,即可以达到读写分离的要求。MongoDB的选举依赖bully算法,类似其他分布式算法,这方面需要注意的是“奇数实例数”、复制集最多12节点,其中7节点参与选举在3.x版本变化比较大,后面讲到。复制过程依赖oplog,类似MySQL里的binlog,所以设置大小合适的oplog很重要,特别是在复制延迟比较高的场景里。容易产生复制失败而不得不进行全量的resync。

性能调优方面

先来说index相关的。
因为MongoDB查询时先扫index再扫数据,所以查询时如果只要个别字段,而字段又恰恰有index的话,那就可以直接返回这些字段,而省去扫数据的过程。

复合索引的次序问题,这个问题类似用多个漏斗筛东西,尽可能将小漏斗放在前面(左侧),极大地减少后续扫索引的量,可以提高查询的效率。除此之外,插入数据时,也可减少去更新索引树的变化程度。
生产环境建议不要使用sparse index,浪费空间。

对已有数据做创建索引操作,如果是复制集环境,建议离线来做,避免由于建索引的长耗时导致追不上而产生resync过程。

对于索引字段的数据类型的选择,string类型的>>int类型的,所以尽可能减小index的size,确保尽可能将index都放入内存,应该选择合适的索引数据类型。

对于document层面:在满足业务场景的情况下,尽量使用nested document,也就是说建模时尽可能的反范式。一方面减少doc的总数量,同时减少查询时磁盘IO的次数。

此外,doc中field的名字用尽可能短的,这也是为了减小doc的size大小如果业务场景中,doc内有很多text内容同时不会做文本内容的检索,那建议都使用bindata来存。
对于statement方面:用好explain很重要,它是做进一步优化的指导数据。
比如这样的事例:

这部分可以进一步参考官方手册,系统层面,由于是per connection的粒度来创建线程,所以也要关注链接数,和对应操作系统的stacksize。

监控和排错

监控和排错监控的重要性不言而喻,如果已有各类监控基础设施,那集成非常简单。如果暂时没有,推荐munin,或者也可使用官方的mms服务(需要部署agent)。

MongoDB自带的一些监控命令非常有用,比如mongostat和mongoshell中的db.stats。这里需要重点关注pagefault %和lock %,这二者,如果page率高,那需要关注读场景的效率以及数据量和内存的情况。如果lock率高,则要关注写场景。比如合并写,或者异步写的方式。

IO繁忙的时候,数据文件(xyz.n)预分配会堵塞其他操作,这种情况下非常容易造成雪崩效应,所以可以pretouch的方式去创建数据文件。

对于数据碎片化的情况,建议离线的去repair database。通过profile,需要重点关注运行时full scan和update的场景,进而进行进一步的优化,特别是update,如果大部分情况产生了moved,则需要通过填充占位数据的方式去避免。通过explain,需要关注covered indexes和index usage的情况,有针对性的创建或修改索引。

3.x版本是MongoDB非常重要的里程碑,其中有些feature非常有价值。比如提供更高压缩率的压缩方式,zlib和snappy,能有30%~50%的提高,相当于用压榨cpu来换取内存中数据的使用率。

此外,是复制集的改进,明显缩短选举的过程。同时对于心跳检测的过程复用复制的通道,而且可以单独控制选取的超时,这个有利于网络环境差时的选举过程。

对index的改进主要时支持partial index,特别适合索引中目标数据的值在全部数据中占比很小的情况,能极大的减小index的size。

最前面说到有些场景需要schema,所以3.x中支持schemavalidator可以加强schema校验拒绝无效数据。

Q&A
Q1:MongoDB现在的存储引擎是否还存在断电等极端情况的数据安全性无法保障问题 ?
A1:如果是复制集的环境,当前primarycrash了写请求会路由到新的primary上,如果是shard的环境,影响得是局部shard,但是没shard也应是HA的结构。除此之外,对于这种极端情况,应用层也是需要做容错,换做其他组件这种场景也一样。
Q2:创业初期业务多变,选型了MongoDB,随着公司发展,业务也渐趋稳定,也在考虑从MongoDB迁往MySQL,什么阶段迁移比较合适,再者迁移的过程有什么坑没?
A2:首先迁移数据是折腾人的事儿,先想清楚迁移的目的和收益。从性价比角度来说是伪命题,从运维经验掌控程度角度说,也是事在人为的。最后回答你的问题,通常就是应用层双写,之后异步迁老数据,数据对其后,tcpcopy重放的方式来校验数据,都没问题了,就完事儿了。

*此分享由LinkedIn中国技术主管魏佳在极牛线上技术分享群里所分享

【下期重磅预告】
<主题>
【如何守护企业核心数据安全】
<讲师>
陈宇森,北京长亭科技有限公司联合创始人、总裁。
<大纲>
1.介绍黑客入侵的常见思路、手段、目的。
2.通过大量案例分析企业是在哪些关键环节出了疏漏导致发生了入侵事件。
<时间>
下周三(10月26日)晚8:00
有意加入的技术朋友,请在极牛公众号(ji-niu)里回复“技术分享”

初创公司MongoDB最佳实践策略和躲坑秘笈相关推荐

  1. MongoDB最佳实践(转)

    将MongoDB加入到我们的服务支持列表中,是整个团队年初工作计划中的首要任务.但我们感觉如果先添加一项对NoSQL存储的支持,而不是先升级已支持的关系型数据库,可能对用户不太好,毕竟目前的用户都使用 ...

  2. 55最佳实践系列:MongoDB最佳实践

    @郑昀汇总 创建日期:2012/9 Application Design: 1) 如果发现query没使用你预期的索引,请用hint强制使用指定索引 主站商品中心所使用的文档字段很多,各种索引建得也不 ...

  3. 你应该知道的 MongoDB 最佳实践

    https://mp.weixin.qq.com/s/zWS1ifKsdh16hV6yT_sXow 前言 作为MongoDB的一名方案架构师,我的大部分时间都是在和MongoDB的客户和用户交互.在这 ...

  4. Mongodb最佳实践及使用问题

    1.Mongodb的优势主要体现在哪? 1)开源.2)免费 .3)性能高.4) 配置简单并且灵活.5) 使用灵活. 2.Mongodb的劣势主要体现在哪? 1) 开源软件的特点:更新快,应用工具不完善 ...

  5. Netbeans 适配C/C++、JAVA防坑秘笈

    为了深入学习C/C++以及JAVA语言,准备找一款IDE,这款IDE应该满足如下几个条件: 1.免费软件. 2.同时可以适配两种语言. 3.完美支持中文 4.对PC机性能要求不高,因家中的PC机比较陈 ...

  6. 最佳实践系列:前端代码标准和最佳实践

    最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...

  7. MongoDB 应用场景、避坑事项与最佳实践

    MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前 NoSQL 数据库产品中最热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB 使用 C++开发. ...

  8. mongodb数据合并设计_「时间序列数据」和MongoDB(二)-模式设计最佳实践

    在上一篇博客文章时间序列数据与MongoDB:第一部分-简介中,我们介绍了时间序列数据的概念,然后介绍了一些可以用于帮助收集时间序列应用程序需求的发现问题.对这些问题的回答有助于指导支持大容量生产应用 ...

  9. 最佳实践 | 如何提高落地页的转化率?这里有4个策略

    你的营销落地页转化率有多高? 落地页是潜在客户了解你的业务的第一个入口.这种第一印象会让你获得新客户或者错失机会. 没有完美的登陆页面,唯一途径是学习"最佳实践"并通过实验确定最适 ...

最新文章

  1. Microsoft Platform SDK Febrary 2003更新vc6的SDK网址
  2. 太牛了!22岁本科生Github上开源的后台管理系统,太实用(附源码)!
  3. ssm把图片保存到项目中_项目中的图片跨域问题解决方式
  4. CSS添加多个背景图片
  5. 在springboot中构建子模块却无法加载,如果解决?
  6. vue 封装dialog_自己封装dialog组件
  7. (太棒了)程序员的十个层次 你属于哪一层?
  8. 前端学习(1739):前端调试值之页面元素的调试技巧
  9. echarts bar 控制大小_echarts基本配置参数
  10. jeewx 微信管家 - 举办商业版本免费试用活动
  11. cisco 2960 VLAN MAC_Mac翻译系列软件推荐一:欧路词典 for Mac
  12. Java 8.if语句
  13. Eclipse 设置注释模板
  14. 定投的收益率怎么计算
  15. C语言位操作中的置0和置1
  16. 做个很小众的应用就可以月入数万,为什么多数程序员都不做个人开发?
  17. Dubbo官网实战使用技巧
  18. C++ 点(.)操作符和箭头(-)操作符
  19. [2014]兄弟连高洛峰 PHP教程1.1.1 新版视频形式介绍
  20. 汽车零件分型面的构建思路之补孔技巧

热门文章

  1. 'python program'.count('p')的值是_如何用Python分析泰坦尼克号生还率?
  2. sql 相加_SQL-多表查询
  3. ogg mysql的原理_OGG基础原理了解
  4. 利用边缘灰度变化建模,来提高圆环直径求取精度
  5. 测量场效应晶体管(JFET) 2N3819
  6. 以赛促学,飞桨助力大学生智能车竞赛升级
  7. 我虐小车千百遍,小车待我如初恋
  8. 基于STM32F103RE ADDA板制作
  9. AD9833所产生的高频信号质量分析
  10. 什么叫大地高_等电位箱有什么用?