关于MongoDB的全局锁

对MongoDB有所了解的人都知道,MongoDB有一个让人头疼的全局锁(读写锁,允许并发读,而写会阻塞所有的读写),要命的是这个锁不是表级的,不是库级的,而是整个Server级别的,这让人听起来是不是非常的蛋疼。

在2.0版本以前,这一问题一直没有得到解决,于是有人提出,在可预见某个update操作的记录可能在磁盘上时,为了减少写锁占用的时间,可以采用先读后写的方式,通过先读一次,将要操作的记录加载到内存中,再进行内存中的update,这样写锁就不包括将数据从磁盘加载到内存的时间了。

在可预见数据冷热的情况下,这种操作能够有一定的效果,但是很明显,这种变态的方法不应该是一个终极解决方案。

值得庆幸的是,在2.0版本中,MongoDB宣称有很大程度的并发性能提升,而这一提升的基础正是解决了这个全局锁的问题。

解决的方法并不是通过减少锁粒度来解决,虽然collection级别的锁机制也正在开发中。(SERVER-1240)

解决方法是通过对一些可能造成长时间锁占用的操作进行锁抑制。比如和我们上面的方法类似,在进行update操作时,如果发现需要更新的记录在磁盘上,那么这个锁就不会一直占用,而是等到将数据从磁盘加载到内存后再添加写锁进行update。

而同理,对于其它一些可能耗时比较长的操作也可以采用类似的方法,通过将长时间占用的全局锁拆分成多个细粒度的小锁来使需要获取锁来进行的操作能够交错的执行,从而避免一夫当关万夫莫开的情况,主要包括下面一些操作:

查询操作

批量更新操作

批量删除操作

批量insert写入操作

阅读全文

例子:

以认证模式启动本地MongoDB,限定只能本地登陆,需要认证:

默认连接到本地服务器的默认端口:

以用户名’fred’和密码’foobar’连接并登录到admin数据库:

以用户名’fred’和密码’foobar’连接并登录到baz数据库:

阅读全文

原文:MongoDB as in huMONGOus, not retarded

最近公司有一个比较大的项目,涉及到的数据很多,需要做一个统计分析系统,供做决策使用。考虑放弃mysql,使用NoSql数据库,我觉得MongoDB最适合了,看了一片MongoDB入门的文章,觉得不错,抽时间一点点翻译翻译,翻译的不对、不好的地方,还请大家多多指教。

——————————————————————————-

与其他人不一样,我不会在iPad上写任何东西。是的,我仍在写Popurls Clone系列的后续部分,而且和往常一样,它花费了我比预期更长的时间。生活是美好的一大堆账单蜂拥而至,它证明:你确实需要通过“工作”来“挣钱”。但是,我们为什么会这么认为??那是相当愚蠢的,就像在动画《星球大战》前传/续集中发生克隆战争一样(不知道这么翻译对不对,看《The Big Bang Theory》也多次提到了《星球大战》,一直想看,也没机会看,将来会抽时间学习下的~:))当人们开始思考一些人生伟大的、有意义的事情时,比如说:你怎样逃掉你的账单。我想,是时候写一些关于数据库的东西了。你看到前面这些话之间的联系了么?–看懂了?太好了,虽然我不知道有啥关系,哈哈哈哈。。。。在谷歌搜索mysql,大约有1.17亿条结果,如果搜索MongoDB,只有1、2百万左右,很好。这意味着,如果我的这篇文章被谷歌收录了,它将构成不少于8.33 × 10-7 %的相关搜索的结果。与mysql的形成鲜明的对比,是5.88 × 10-9 %。我也已经写了不少关于mysql的东西,我真是个大好人啊[害羞]…简单来说,本文将覆盖MongoDB以及你如果在PHP中使用它,前边的东西让大家高兴下,如果你不感冒,那么你还是不用看了

简要介绍MongoDB

首先,MongoDB不是像mysql一样的关系型数据库RDBMS,关系数据库是基于关系模型、基于埃德加·弗兰克在1969年提出的一阶逻辑。数据及它们的内在关系,不存储为表,表构成了它们之间的关系,这些表由一些固定数量的垂直列和不固定数量的行的模型组成,理论上,行可以无限大。数据通过SQL语句来进行查询,好了——-我们这里讨论的是关于NoSql技术的一部分–MongoDB,在Nosql技术中,有三种类型的数据库:以列为导向的,Key/Value键值对的,以及以文档存储为导向的,MongoDB属于第三类。在这里,一个文档,就是一个带有一些给定属性的数据结构,这些属性可以是字符串、数字、数组或者Objects等等,如果你在PHP中接触过复合数组或者Object对象,你就明白是什么意思了。你也可以在collections中给文档分组,同样的,有一些叫做子文档的,你也可以那样认为。

阅读全文

摘自:http://pronewb.com/mongodb-as-in-humongous-not-retarded

Unlike the rest of the known world, I won’t write anything on the iPad. Yet. Instead, I’m still in the process of writing the upcoming parts of my Popurls Clone series and as per usual, it takes a lot more time than expected. In combination with a massive amount of bills, life is good! As it turns out, you actually need to “work” in order to get “money”. How, when and why did we agree upon that? That’s just as stupid as, say, doing a fully animated Star Wars prequel/sequel to take place during the Clone Wars. Oh, wait… While pondering life’s great mysteries, such as how you can evade paying your bills, I felt it was time to write something about databases. You see the connection, right? Good, because I don’t. A quick Google search for MySQL rendered roughly 117 million results so I figured that another article about it would be kinda superfluous. A search for MongoDB on the other hand resulted in “only” 1,2 million results. Much better. That means that if and when this article gets indexed by the Google, it will constitute no less than ~ 8.33 × 10-7 % of the relevant search results, in stark contrast to the ~ 5.88 × 10-9 %, should I’ve written some stuff about MySQL. Goodie! In short, this article will cover MongoDB and how you can use it with PHP. Good times ahead so if you’re a killjoy, you’re not welcome.

阅读全文

作者的图片

DigDeeply

Technology Stack: Golang/PHP/Openresty, and so on…

Web Development Engineer

Beijing China