MongoDB的得与失

  ">MongoDB还存在许多需要改善的地方,比如全局写锁(现在仅仅是一个数据库级的写锁)。本文主要关注如何扩展以应对大数据,这里的大数据体积为100GB。

  当你着眼于底层存储的实现时,它将更有意义。基本上,MongoDB由一堆BSON文档mmap(内存映射)链表组成,它们使用了简单的B-tree索引,以及作为存储耐久性机制的基本日志。最终由OS写入磁盘,并在页面中读取由操作系统加载到内存中的数据结果。

  最初被称为杀手级优势的速度方面,其实只是使用了页面缓存的效果。很快你就会意识到“这仅仅是mmap”,所有BS架构相关优化也只是让你的工作集更加适合RAM,如果在分片上进行删除、增加记录等操作,将会产生重大影响。 OS不知道你正在运行数据库,它只是知道你想MMAP一些东西并给它最佳的访问效果。幸运的是,该算法是由一些非常聪明的人写的,因此只要搜索结果可以在缓存命中,运行的也不错,但是OS调度写入时不会考虑你的存储布局,甚至是你的索引和数据之间的差异。这当然不能推断出什么样的数据保持在缓存中或预先载入,因为它不知道你的数据是什么或在哪里。

  其实,类似MongoDB Tao这样的天才有很多,多数的数据库都使用了一些非常好的想法:Cassandra的一致性协议,Redis疯狂的数据结构,或Hadoop的数据处理能力。MongoDB拥有mmap,不必设计自己的缓存算法或写入策略,并利用一切尽可能简单的实现,让你快速进入市场并专注于你的销售基准,应对你的竞争对手,或者并发学习。对比之前,你会更有吸引力。到那个时候你可能已经变现或者编写了一个真正意义上的数据库,在任何情况下,你的客户都会被锁定,他们百依百顺以适应你的设计决策。但是请不要忽视,你正在向Oracle和IBM看齐,这并不是巧合。

  就像上文所说,MongoDB还存在许多需要改善的地方。需要关注的是,当你专注于存储引擎并忽略更广泛的持久性策略问题,杀手级应用应该类似于处理在线游戏中的用户数据:在给定的时间段中拥有一个一致的工作集,相对于整个数据库来说可能很小,读写操作都发生在同一个工作集上,你有大量的读取相对于写入来说,客户端为你做了大量的计算,如果你想获取更灵活的数据结构模式,你可以将其转换成一个关系模型,使用类似hstore或JSON列来填充图,或者像HBase或者Cassandra那样使用blobs/text来储存文档,但是绝对不会像使用MongoDB那么糟糕。

时间: 2024-09-20 00:31:39

MongoDB的得与失的相关文章

SequoiaDB 关于 MongoDB 安全事件的一些思考

刚刚过去的这个周末,各位大数据和数据库从业者想必是被MongoDB的"安全事件"给刷屏了,MongoDB作为当前NoSQL在全球的领军人物,遭到这么大规模的黑客攻击,这也再次让我们对于新一代的开源数据库的数据安全问题带来了思考.而 SequoiaDB 巨杉数据库作为国内领先的新一代分布式数据库厂商,我们也来说说我们对这个事件的看法. 事件回顾 此前,众多无需身份验证的开放式 MongoDB 数据库实例正在遭受多个黑客组织的攻击,被攻破的数据库内容会被加密,受害者必须支付赎金才能找回自己

python操作mongodb根据

  本文实例讲述了python操作mongodb根据_id查询数据的实现方法.分享给大家供大家参考.具体分析如下: _id是mongodb自动生成的id,其类型为ObjectId,所以如果需要在python中通过_id查询,就需要转换类型 如果pymongo的版本号小于2.2,使用下面的语句导入ObjectId ? 1 from pymongo.objectid import ObjectId 如果pymongo的版本号大于2.2,则使用下面的语句 ? 1 from bson.objectid

MySQL和MongoDB设计实例对比

MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚.下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢? 如果使用MySQL的话,应该如何存取数据呢? 如果使用MySQL话,手机的基本信息单独是一个表,另外由于不同手机的参数信息差异很大,所以还需要一个参数表来单独保存. CREATE TABLE IF NOT EXISTS `mobiles` (     `id` 

MongoDB · 特性分析 · MMAPv1 存储引擎原理

MongoDB 的 mongod 服务管理一个数据目录,可包含多个DB,每个DB的数据单独组织,本文主要介绍 MMAPv1 存储引擎的数据组织方式. Database 每个 Database(DB) 由一个.ns文件及若干个数据文件组成 $ll mydb.* -rw------- 1 ydzhang staff 67108864 7 4 14:05 mydb.0 -rw------- 1 ydzhang staff 16777216 7 4 14:05 mydb.ns 数据文件从0开始编号,依次

Windows下Mongodb安装及配置

参考:http://blog.csdn.net/mzbonnt/article/details/51461331#comments **欢迎加入疯狂源代码学习.QQ群127591054 工作中遇到了,所以学习下.** 这里装的是最新的 安装文件:mongodb-win32-x86_64-2008plus-ssl-3.4.6-signed.msi 电脑配置:win10 64位 mongodb的安装很简单,设置好安装路径后,一直Next直到安装结束. 最大的坑就是MongoDB服务的安装,下面具体说

mongodb WriteConcern

Java代码   http://www.reader8.cn/jiaocheng/20130826/1875289.html   Java代码       (1)不安全的操作 a)ERRORS_IGNORED:只是将消息发出,忽略一切错误,甚至网络错误也不理会. b)UNACKNOWLEDGED:将消息发送给socket即返回,不确保数据写入到数据库,因此发生网络错误时会有提示.默认值. (2)处于弱状态 a)ACKNOWLEDGED:确保已将数据写入到shard中的主节点中,这时如果有针对主节

MongoDB:副本集出现大量authenticate db日志

问题描述 MongoDB:副本集出现大量authenticate db日志 Sun Jan 11 00:15:06.082 [conn34] authenticate db: local { authenticate: 1, nonce: "b0d836d66e2ae743", user: "__system", key: "8c947498e52c2d06dedbef54493b2d59" } Sun Jan 11 00:15:08.987 [

Use mongodb 1.8.1's replicaSet with auth,journal,keyFile feature

MongoDB replicSet 1.8.1 产品部署推荐: 1. 文件系统加载时使用参数noatime 2. no VM PAGEs 3. 推荐使用逻辑卷,文件系统推荐ext4或xfs 4. 3个full nodes 或 2个full nodes+1个arbiter node (最好是奇数个物理服务器,否则仲裁会有问题,例如两台物理机,两个mongod进程,相互网络不通的话,任何一台都无法达到majority,因此都无法成为primary.那就是只读了.因此本例的物理服务器只有2台是不合理的

关于mongodb按照字段模糊查询方法

关于mongodb按照字段模糊查询方法   模糊查询:tname包含某个关键字测试' cd /opt/soft/mongodb/bin ./mongo --host 192.168.0.1  --port 17017  test db.test_info.find({"tname": {$regex: '测试', $options:'i'}})  db.test_info.find({"tname": {$regex:/测试.*/i}})