NoSQL数据库:盘点MongoDB的八宗罪
【IT168 评论】出于某些政治上的原因,我对这个问题沉默了一段时间,但是现在我觉得我有责任站出来以我的亲身经历来告诫那些想要在它们的业务中使用MongoDB的人们。
我们团队在一个很大的项目(几千万用户)中使用了MongoDB,根据早期的使用,我们希望可以像10gen公司吹捧的那样,通过长期使用来获得它 们宣扬的伸缩性上的好处,但是事实证明,我们错了,我觉得有必要分享下我们的教训,即使只有一个人从中收益,我认为也值了。要说明的是,10gen公司确 实尽了他们最大的努力并且很热情的帮助我们,有时甚至热心过度,但是,这并不妨碍我对他们失败产品的批评。
1. MongoDB为了追求赢得基准测试导致它默认以不安全的方式进行写操作
如果你不调用getLastError(),MongoDB会在写操作实际完成之前就返回了,这会导致2种问题:
在并发环境下(比如连接池),如果你在“完成”一个写操作后接着去读刚刚写入的数据,可能会遇到一个读错误,并且你没法知道数据库会在什么时候完成这个写操作。
很多情况下,队列中的保存操作会被丢弃,而你得不到任何通知,比如连接中断,或者数据库崩溃或者其它意外情况下,TCP缓存中保存的操作就人间蒸发了。
2. MongoDB会以很多莫名其妙的方式弄丢你的数据
数据忽然就没了,不知道为什么。
损坏的数据库没法恢复。
主节点和从节点的备份存在缝隙,导致从节点经常缺少某些数据,是得,没有校验和,并且备份状态显示从节点的数据是同步的。
备份经常不工作,没有错误,你需要自己监控你的备份状态。
3. 需要全局锁来发出写请求
4. MongoDB的分区(sharding)在带负载的情况下工作也不正常
在高负载的情况下添加一个shard简直就是噩梦,Mongo要么就是过快的在分区之间移动数据块,变成对自己的DOS攻击,要么就是拒绝接受更多的块。
5. Mongo完全没有可靠性可言
Mongod/配置服务器/mongos的架构确实很聪明,但不幸的是,mongos完全就是垃圾,在有负荷的情况下,它随时都会崩溃,短则几小时,长则几天,并且重启管理进程有时也不管用,有时它会抛出断言破坏一个关键线程,但是进程却依然在运行。
你猜怎么着,唯一可行的方式就是在mongos前面配置一个haproxy,然后启动一个外部监管程序对mongos进行轮询,定期清除老实例然后创建新实例,没错,就是这样,不开玩笑。
6. MongoDB有次甚至删除了整个数据库
MongoDB 1.6,在配置了备份后,有时会错误的将一个全新节点的数据当作是最新的数据,然后删除其它所有节点的所有数据(大约有700G的好数据被删掉了),并将 这个空数据同步到其它所有节点,作为一个数据库,这种事情是绝对不应该发生的,如果不能确定,应该询问管理员来选择合适的操作,而不是删除所有数据。
谢天谢地,这个Bug在1.8已经修复了。
7. 他们总是交付些压根就不应该交付的东西
一个令人尴尬的事实就是,即使是稳定版也会存在破坏数据的Bug——而且总是在我们的数据被破坏之后我们才发现——我们购买了10gen的白金支持,但是我们得到的支持就是一堆它们称之为内部RC的热补丁,直接运行在我们的数据上。
8. 备份(Replication)在忙碌的服务器上基本就是废柴
备份经常性不工作,要么就是DOS master,要么就是消耗太多时间直到耗光oplog(即使oplog有50G的空间)。
但是,这些都不是最主要的,真正的问题:
你可能会说,这些都是老黄历了,他们已经在最新版修复了这些问题,但这不是我想说的,我要表达的是,作为一个数据库开发公司,它们应该按照下面的顺序来排列它们的工作优先级:
1. 不能丢失数据,确保数据非常可靠
2. 通过实践确保可达性
3. 多节点的伸缩性
4. 降低延迟到99%和95%之间
5. 单个资源的每秒请求数
10gen的排序似乎是#5是第一位的,其它几项的排序未知,但是可以肯定,第一条肯定不在它们的前三之列。
最后,希望你能认真考虑以上警告。
NoSQL数据库:盘点MongoDB的八宗罪相关推荐
- Nosql数据库之mongodb c++使用实例
mongodb是一个非关系型高速数据库,由多个文档(相当于关系数据库中的行记录)组成集合,多个集合(相当于关系数据库中的数据表)组成数据库. 使用命令安装或者源码安装mongodb,安装完成后mong ...
- NoSQL数据库之MongoDB
一.NoSQL数据库背景 传统关系型数据库遇到的问题 2008 年左右,网站 . 论坛.社交网络开始高速发展,传统的关系型数据库在存储及处理数据的时候受到了很大的挑战 ,其中主要体现在以下几点: 难以 ...
- 【捷哥浅谈PHP】第十一弹---NoSQL数据库之MongoDB的CURD操作(二)
上文给大家详细介绍了下MongoDB数据库的CURD的一些基本语句,我们来回顾一下: 插入文档: SQL语句: INSERT INTO 表名 (列名.......) VALUES(对应的列值..... ...
- 如何选择合适的NoSQL数据库
与传统的表格(或SQL)数据库相比,NoSQL数据库为软件开发人员和其他用户提供了更高的运行速度和更高的灵活性. NoSQL数据库使用的数据结构 - 键值对,宽列,图形或文档 - 与关系数据库使用的数 ...
- NoSQL介绍及MongoDB的安装及使用
前言 本篇文章会介绍Nosql和关系型数据库之间的区别,了解NoSQL ,NoSQL数据库与关系型数 据库有什么不一样.对比关系型数据库理解 MongoDB,MongoDB安装及JAVA客户端使用 , ...
- 开源NoSQL数据库介绍
目录 一.概述 二.NoSQL数据库 1. MongoDB 2. Cassandra 3. CouchDB 4. Hypertable 5. Redis 6. Riak 7. Neo4j 8. Had ...
- java 连nosql_浅谈 Java 中 MongoDB NoSQL数据库使用指南
MongoDB是当今非常流行的一款NoSQL数据库,本文介绍如何使用MongoDB的Java驱动来操作MongoDB. 一.引入MongoDB Java Driver包 如果需要操作MongoDB的J ...
- NoSQL数据库-MongoDB和Redis
NoSQL数据库-MongoDB和Redis 发布于2012-12-20,来源:比特网 1NoSQL简述 CAP(Consistency,Availabiity,Partitiontolera ...
- HBase、Redis、MongoDB、Couchbase、LevelDB 五款主流NoSQL数据库大比拼
在 HBase.Redis.MongoDB.Couchbase.LevelDB 五款较主流的数据库产品中,本文将主要对它们进行分析对比. 鉴于缺乏项目中的实战经验沉淀,本文内容和观点主要还是从各平台资 ...
最新文章
- 【LeetCode】233. 数字1的个数
- vue开发黑科技--利用引用类型的值处理复杂数据的编辑
- QEvent的accept()和ignore()函数功能
- 在您的构建过程中添加微基准测试
- 小程序 bindtouchmove 使用拖动按钮 页面跟着滑动并拖动卡顿感 问题
- idea 热部署时 tomcat处 没有update classes and resource 选项
- 大数据分析平台的发展趋势如何
- 动环监控系统价格,动环监控系统价格多少
- 千方百剂创建账套服务器文件,千方百剂辅助工具使用手册(图解).doc
- RJ45与网络变压器脚位及网线线序的关系?
- 计划超越苹果!诺基亚在印度推出笔记本电脑
- 申请免费领取阿里云服务器
- 持续集成(Continous Integration)
- ROC-RK3328-CC 开发板开箱和上手指南
- webpack基础篇(三):管理资源(image、css、fonts、csv、json5)
- Android短信数据库简析
- 二维码如何转为链接,看了这篇文章才知道多好用!
- 安装程序无法继续,因为您的计算机上安装了更新的internet explorer
- 强烈推荐:视频该如何推广?
- cmd imp导入dmp文件_导入Oracle的dmp备份的dmp文件报错“IMP-00002:无法打开c:/Documents.DMP进行读取”...
热门文章
- 区块链赋能商品溯源防伪 | TokenInsight
- [Unity]ShaderGraph问题所有材质丢失Maximum number (256) of shader keywords exceeded
- jass 添加资源的代码
- 数字政府智慧政务一网通办解决方案2022(ppt可编辑)
- Visual Studio Code 入门教程
- php怎么判断是个几数组,php如何判断数组是几维
- OSChina 周二乱弹 —— 昔人已乘地铁去,此地空余一只鞋
- ApowerMirror(手机投屏软件)v1.4.4.1 中文版
- 线下零售行业要看看的数据分析小要求
- 知乎日报客户端的模拟实现(进行时)