MonDB目前是一个热门的NoSQL数据库
文件,它提供了一些优秀的
功能:自动
故障转移机制,自动分片,非模态的无
模式,在大多数
情况下,
性能优良。但薄荷遇到了很多在使用过程中存在的问题mondb深度。这里有几个坑,我们见过面。特别声明:我们目前的版本是mondb 2.4.10,已经
升级到mondb 2.6.0版,和仍然存在的问题和回2.4.10版本。
mondb数据库级锁
陨石坑指数:5颗恒星(最高的5颗恒星)
mondb锁机制和关系数据库(Oracle,InnoDB InnoDB)有很大的差异,Oracle可以提供锁的粒度,而mondb只能提供基地级粒度的锁,这就意味着当MonDB写锁在被占领的国家,其他的读和写的所有
工作等。
看看图书馆的水平锁在
并行环境有严重的问题,但mondb依然能够保持高并发、高性能,这是因为锁的粒度mondb虽然很广泛,但在锁机制和关系型数据库的锁有很大的不同,主要表现在:
MonDB没有完整的事务
支持,
操作的原子性只是一个单一的文件,所以它通常是较小的操作粒度;
对mondb锁的实际时间是存储数据的计算和改变的时候,通常很快;
mondb锁已暂时放弃机制。当需要
等待慢速IO读取和写入数据时,它可以暂时放弃,然后等待IO再次获取锁。
通常没有问题,并不意味着没有问题,如果数据将导致操作不当,仍长时间占用写锁,如下面提到的索引操作施工,当这一切发生的时候,整个数据库完全堵塞,无法进行任何写操作,情况是很严重的。
解决问题的办法,尽量避免长时间占用写锁操作,如果有一些
设置操作是难以避免的,你可以在一个单一的mondb图书馆这本集子,MonDB图书馆不同的锁是相互隔离的,分离的集合可以避免一组操作触发一个全局拥塞问题。
对数据库阻塞建立电缆引导
作弊指数:3
上述问题mondb锁,索引是一种以久的写锁造成的简单问题,需要写在索引建立前锁MonDB(但不放弃当临时),如果大量的数据采集、索引通常需要比较长的时间,特别容易引起问题。
这个解决方案非常简单。mondb提供两种索引访问。一种是
背景模式。它不需要占用写锁很长时间。另一种是非后台模式。占用锁需要很长时间。后台的使用可以解决这个问题。例如,为超大型表帖建立索引,不要使用它。
复制代码代码如下所示:
db.posts.ensureindex({ 1 } user_id:)
应该使用
复制代码代码如下所示:
db.posts.ensureindex({ 1 },{ user_id:背景:1 })
不
正确使用嵌入式嵌入
文档 陨石坑指数:5颗恒星
嵌入的文件是一个明显的差异之间的MonDB和关系数据库。它可以将其他子文档嵌入到文档中,使父子文档
保存在一个集合中,便于
搜索和
修改。
例如,在
应用程序场景中有一个组文档。
用户申请加入集团模型为grouprequest文件。在开始的时候,我们将把grouprequest组。Ruby代码如下所示(用半群的ORM):
复制代码代码如下所示:
班集体
包括半群::文件
…
embeds_many:group_requests
…
终点
类grouprequest
包括半群::文件
…
embedded_in:组
…
终点
这样我们就掉进了坑,几乎爬不出来,它导致一次
系统的近两周,高峰时段
经常有几分钟的卡顿,最严重的甚至停机所造成的mondb。
经过仔细分析,
发现一些活性组group_requests增加(当新的应用程序应用)和变化(通过或拒绝用户应用)频繁,这些操作往往需要很长一段时间写锁,导致整个数据库块。
原因是,当有group_request手术组增加,足够的预分配
空间,需要重新分配空间(
内存和
硬盘是必需的),耗时长,集团还建立在指标很多,导致大量移动
位置索引的更新操作非常耗时,造成锁问题,需要很长的时间。
这个问题的答案,它也很简单,就是普通的外键嵌入相关的变化,类似于关系数据库的
方法,使group_request增加或修改只发生在GroupRequest,简单、快速,避免长时间占用写锁的问题。当
关联对象的数据是不固定的或经常的变化,就要避免使用嵌入的关联,否则会死的很惨。
不合理地使用数组字段
作弊指数:4
对mondb数组字段是一个独特的功能,可以存储一些简单的一对多关系在一个单一的文件。
薄荷醇有一个应用程序场景来使用一个严重的性能问题,直接如下面的代码所示:
复制代码代码如下所示:
类用户
包括半群::文件
…
现场:follower_user_ids,
类型:数组,
默认:{ }
…
终点
用户通过follower_user_ids阵列类型字段保存用户的ID的关注,用户的注意力从10到3000的范围内,变化较为频繁,造成上述问题将是类似的,follower_user_ids频繁修改导致大量长时间数据库写锁,造成在mondb数据库性能急剧下降。
解决问题的办法是,我们将follower_user_ids到内存数据库Redis,避免用户在MonDB的频繁变化,从而彻底解决问题。如果你不使用redis,你也可以设置一个userfollower集与外键关联的形式。
以上几个坑的第一单,是用mondb过程造成无限伤害人的陷阱,我们必须高度重视,避免落入坑。