mongodb续

索引性能的分析
索引的建立对于数据库性能有什么影响? 建立索引有没有什么原则?
我们了解了索引的原理之后知道,查询的时候,如果查询条件不依赖主见,如果不建立索引就会引发全表扫描,如果数据量比较大时,全表扫描根本不可行,建立索引可以直接加快检索速度,IO 也呈指数即下降,那sh那是不是索引建的越多就愈好尼,也不尽然,因为查询期间索引表需要load到内存中,索引也不是越多越好,数据量比较大时,索引也会占去相当一本分内存,,而且索引应该建立在一些不经常更新并且数据重复量比较少的字段上,如果这个字经常更新,其对应的索引也需要更新,这个消耗比较高,还有就是如果这个字段在数据库的cho就是如果这个字段的数据在数据库的重复率较高的话,建立索引的意义就没有那么大了,比如查找age=20的结果非常多,这样的效率跟全表扫描不相上下,,还有就是有时候复合索引建立,如果我们要在age和name上建立索引,只需建立两个字段的复合索引,复合索引表中结点是有两个字段组成,不用单个在两个字段上都建立索引,便可以实现高效chaxu便可以实现高效查询,

性能优化问题:
现在假设有book和user两个集合,book和user的关系是一对多的关系,在mongodb,我们用嵌套的方式来biaosh嵌套的方式来表示这种关系,这样查询起来就非常方便,不用关联,,但是如果业务需求需要经常use但是如果业务需求需要经常更新user集合的age字段,这会产生怎么样的问题尼,,
不仅要修改user集合的age字段,也要去book扫描所有嵌套的文档将age属性改掉,这样的话,更新的效率是非常低的
如果 age对于book表不是必须的,我们可以在book的嵌套字段里面把age剔出,这样只需要更新user集合,往往查询效率和写的效率是冲突的,如何处理好这种关联关系很值得我们去思考和学习,所以说嵌套文档的处理适合那些数据比较稳定持久的字段,如果这个字段需要经常更新,就需要去考虑如何设计好这种关系结构。
填充因子的问题
我们知道mongodb数据的存储结构是顺序表的形式存储在磁盘上,也就是说每一个文档在物理位置上是相邻的,现在我们可以思考一个问题,如果说现存的某一个文档的字段值发生了变化,占用的存储空间增大,,这时原来存储这个字段的扇区空间b空间不够用了,必然导致这个文档往后所有的文档都向后移动,了解顺序表的都知道,顺序表最大的缺点jiush顺序表最大的缺点就是元素的移动,这种操作的性能消耗是巨大的,所以在存储文档时就应该为文档预留相应的冗余空间,防止文档的大量移动,,我们这里提到的填充因子就是为文档扩展提供的预留空间,
这里有两种解决方案

  1增加初始分配空间。在集合的属性中包含一个 usePowerOf2Sizes 属性,当这个选项为true时,系统会将后续插入的文档,初始空间都分配为2的N次方。这种分配机制适用于一个数据会频繁变更的集合使用,他会给每个文档留有更大的空间,但因此空间的分配不会像原来那样高效,如果你的集合在更新时不会频繁的出现移动现象,这种分配方式会导致写入速度相对变慢。

2.我们可以利用数据强行将初始分配空间扩大。
是的,这样看起来可能不太优雅…但有时却很有效!当我们对这个文档进行增长式修改时,只要将stuff字段删掉即可。当然,这个stuff字段随便你怎么起名,包括里边的填充字符当然也是可以随意添加的。

mongodb sharding
什么是分片尼 ? 我们可以去设想如果一个数据集合里面已经存在海量数据tb级别的数据,而同时又有多个线程需要访问这些数据,单台服务器肯定无法消化,mongodb采用了分布式解决方案,比如将一个集合的数据分片,chunck,然后不同的分片存贮在不同的服务器上面,当用户访问集合里面的文档时,mongodb可以根据请求条件来查找到对应数据所在的服务器然后返回数据,这样下来可以将du可以将多请求的负责分摊到各个服务器的分片上,大大提高数据库系统的吞吐量,
可以看一下sharding的结构,最上面mongos路由是就相当于路由器一样对各个数据库请求进行分发,是qingqi是请求的入口,然后通过ConfigServers查找请求数据对应所在分片,所以configserver的作用就是为路由器提供分片线索,可以理解为各个不同分片的索引表一样,可以快速查到对应分片,然后就可以去访问shard服务器了。。我们可以看到mongos路由不止一个,原因很简单,一个高可用分布式集群方案,必须保证服务时刻都可以正常高效运行,在这里在多个服务器配置同样的mongos路由,sh是为了fangzh是为了防止当前使用的路由出现问题而备用的。同样的configserver 同样需要完全相同副本分布在不同的服务器上备用,,shading也一样可以设置副本,

因为公司之前有同事已经搭建过mongodb的分片集群,也从rover系统中迁移了一些数据过来,我对已经搭建好的环境进行了一些分析
 首先我们可以用config,这个默认创建的数据库来查看一些分片信息,config数据库用这些集合来记录了一些配置信息,察看shards表可以看到,我们用了5台服务器5个分片来搭建,之后也可以看到每个服务器数据库服务的端口,,通过databases这个数据库可以看到不同数据库的,zh只有pmch进行了分片,也可以看到这个数据库的zh也可以看到这个数据库的主分片是shard0002,主分片这个概念我想应该是在分片的情况下产生的,也就是说如果有一些集合不需要分片的话,那这个集合的数据就存放在主分片里面。

每一个数据库都有一个主分片

   那么mongodb 是依据什么来du是依据什么来对集合数据进行分片的呢,总不能随机把sh总不能随机把数据放到不同的分片里,这样根本无法检索数据,因为根本没有规则也没有y因为根本没有规则也没有依据,mongodb用shard key 来支持分片,作为分片的依据,shard key 来自于集合中的字段,有两种分片的方式,第一种hash 通过h通过hash函数对字段进行yi函数对字段进行映射,然后cunch然后存储到对应的分片上,我们看到这这个连续的值在hush下可能会存贮与不同的分片。但是在xianxi方式但是在线形方式三个doc很有可能会ji很有可能会进入一个分片,,那么思考yixi那么思考一下在这种情况下那种分片方式好??   如果shard key 是线形增长的,那么ranged sharding这种方式下会产生严重的问题,大家思考一下,随着新插入的shard key越来越大,sh是不是最后新插入的文档都回进入z最后yi最后一个分片中,这回造成最后一个分片过大,数据分配不均匀,造成瓶颈障碍,使得请求集中于最大的分片服务器上,这样就失去了分片的yiy这样就失去了分片的意义,所以说在特定的情况下,选择hashbji比较合适,zh这一块官网给出了用_id来做shard key 用hash方式来分片,能够有比较好的性能体现,具体生产中用那种方式还需要结合具体情况,总之原则就是避免数据聚集,目前只能研究到这
时间: 2024-11-08 19:50:49

mongodb续的相关文章

MongoDB数据库勒索风波续:下一个目标是Hadoop和CouchDB

    不久之前 ,全球数万的 Mongo DB 数据库被勒索风波席卷,一时间灾情遍野.如今一波未平一波又起,网络安全专家预警:下一个遭遇黑客锁定的目标将是 Hadoop 和 CouchDB ,目前已出现灾情. 早在 1月12日,网络专家 Naill Merrigan 就发现有黑客组织 NODATA4U 已专门锁定 Hadoop ,之后几天内就出现了 115 个受害者. 当时他就提醒,Hadoop 所用的底层分布式文件系统的默认配置会关闭「Security」和「Safemode」两个安全选项,默

MongoDB Secondary同步慢问题分析(续)

在MongoDB Scondary同步慢问题分析文中介绍了因Primary上写入qps过大,导致Secondary节点的同步无法追上的问题,本文再分享一个case,因oplog的写入被放大,导致同步追不上的问题. MongoDB用于同步的oplog具有一个重要的『幂等』特性,也就是说,一条oplog在备上重放多次,得到的结果跟重放一次结果是一样的,这个特性简化了同步的实现,Secondary不需要有专门的逻辑去保证一条oplog在备上『必须仅能重放』一次. 为了保证幂等性,记录oplog时,通常

MongoDB 如何保证 oplog 顺序?

MongoDB 复制集里,主备节点间通过 oplog 来同步数据,Priamry 上写入数据时,会记录一条oplog,Secondary 从 Primary 节点拉取 oplog并重放,以保证最终存储相同的数据集. oplog 主要特性 幂等性,每一条oplog,重放一次或多次,得到的结果是一样的:为实现幂等 mongodb 对很多操作进行来转换,比如将 insert 转换为 upsert.$inc 操作转换为 $set等等. 固定大小(capped collection),oplog 使用固定

如何利用HTML5与MongoDB创建位置感知Web程序

在日常生活中,我们都离不开位置识别类应用程序.Foursquare.Facebook等应用程序帮助我们和我们的家人朋友分享当前位置(或者正在参观的景点).而像Google Local这样的应用则帮助我们找到当前位置附近有哪些自己需要的服务设施或业务场所.如此,如果我们需要找到一家离自己最近的咖啡厅,完全可以通过Google Local快速获取建议并立刻动身前往.这不仅大大方便了日常生活,还能够帮助企业将自己的产品推销给更理想的受众群体.无论是对消费者还是对企业,这都堪称完美的双赢局面. 要创建这

阿里云数据库MongoDB版正式支持3.4、RocksDB、TerarkDB存储引擎

云数据库 MongoDB 版 基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化.并提供专业的数据库在线扩容.备份回滚.性能优化等解决方案. 了解更多 MongoDB 3.4 社区版于2016年年底正式发布,目前已经历10次的小版本迭代,在经过长时间的内部场景测试后,阿里云数据库团队正式支持 MongoDB 3.4,让用户直接在云上享受稳定的数据库服务. MongoDB 3.4 的主要功能改进参考这里,简单总结一下就是: 更快的主备同步,参考 MongoD

MongoDB迎来原生数据分析功能

为了让大家更轻松地将分析机制引入自己的大数据存储体系当中,Pentaho公司今天公布了其业务分析与数据集成平台的最新版本已经正式进入通用阶段. Pentaho 5.1版本的设计目的在于为"数据与分析两个独立领域"架起一道往来的桥梁,从而为全部Pentaho用户--从开发人员到数据科学家再到商务分析师--提供支持.Pentaho 5.1为直接为MongoDB数据存储体系带来了运行无需使用代码的分析机制,并利用新的数据科学工具包作为相关专业人士的"个人助手".除此之外,

MongoDB副本集回滚那些事

回滚(rollback)操作是MongoDB副本集发生一些异常主备切换后可能发生的现象.回滚操作会撤销在当前节点上已执行的一些修改操作. 什么时候会触发回滚 MongoDB副本集节点上有个同步线程,负责拉取需要同步的oplog.被拉取oplog的节点称作同步源.那么,要回滚,首先要有一个同步源. 同步源 链式复制 平时我们都说主备同步主备同步,那同步源肯定是主节点了?其实不一定,MongoDB很早就支持了链式复制,即备节点可以从另外一个备节点拉取oplog,而不只从主节点拉取.这样一来可以减少主

MongoDB复制集自适应oplog管理

MongoDB复制集运行过程中,经常可能出现Secondary同步跟不上的情况,主要原因是主备写入速度上有差异,而复制集配置的oplog又太小,这时需要人工介入,向Secondary节点发送resync命令. 上述问题可通过配置更大的oplog来规避,目前官方文档建议的修改方案步骤比较长,而且需要停写服务来做,大致过程是先把oplog备份,然后再oplog集合删掉,重新创建,再把备份的内容导入到新创建的oplog. 我们团队)针对使用wiredtiger存储引擎的场景,开发了通过collMod命

我的第一个Ruby On Rails + MongoDB程序

    最近想进一步学习一下MongoDB,而很久之前使用过ROR,正好也凑个机会重新拾起来.下面是建立第一个项目的过程.        主要参考文档:        1. Rails 3 - Getting started        2. MongoDB and MongoMapper (可能需要翻墙)        3. Getting started with VMware CloudFoundry, MongoDB and Rails (可能需要翻墙) 一.创建程序的框架 创建项目时