mongodb和mysql结合mongodb的优缺点
对⽐mysql, mongo的优缺点有:
缺点
l 不⽀持事务操作
l 占⽤空间过⼤
l MongoDB没有如MySQL那样成熟的维护⼯具
l ⽆法进⾏关联表查询,不适⽤于关系多的数据
l 复杂聚合操作通过mapreduce创建,速度慢
| 模式⾃由,⾃由灵活的⽂件存储格式带来的数据错误
|
1. 预分配模式带来的磁盘瓶颈。
mongodb采⽤数据⽂件预分配模式来⽣成数据⽂件,数据⽂件的⼤⼩从64M开始,每增加⼀个⽂件,⼤⼩翻倍,直到2G,以后每次增加数据就会⽣成2G左右的数据⽂件,结合mongodb的mmap内存模型,对于写数据⽂件,将随机写转换为顺序写,⼀定程度上缓解了磁盘的io压⼒。
但在实际使⽤中,遇到了在预分配2G的数据⽂件时,如果磁盘io较慢,则mongodb基本锁死,⽆法响应请求的情况。持续时间则根据磁盘io 的性能来确定。这个问题在2.0之后版本可能会有些改善,但在磁盘性能低的服务器上,该问题依旧存在.
这个问题⽬前没有太好的解决⽅案,只能建议使⽤读写性能⽐较好的服务器来跑mongodb。
1. 在数据存量⼤于内存⼤⼩时,mongodb遇到冷数据查询速度变慢。
mongodb使⽤mmap的内存管理模式,如果查询的都是热数据,那么会在内存中直接查询,如果遇到冷数据,就需要从磁盘读取,并将⼀部分热数据从内存卸载掉.
有⼈曾经说mongodb内存管理是加载固定⼤⼩的⽂件块到内存,即如果冷数据在磁盘上,他会根据请求的数据,加载⼀定⼤⼩的数据块到内存,并卸载掉同样的热数据,这个操作本⾝会带来⼀定io.
因为mongodb使⽤的是全局锁,在某个操作缓慢时,整个操作队列会全部变慢。这个问题造成了mongodb会出现偶发性堵塞问题,连带整个库的性能下降。
该问题在应⽤需要尽量避免出现,需要将mongodb的数据⼤⼩规划好,尽量不要使数据量超过内存的⼤⼩,如果超过内存⼤⼩后,尽量不要去请求冷数据。
1. Mongodb全局锁机制。
mongodb最⼤的问题或者可以说是它的锁机制,在2.2版本之前,⼀个实例只有⼀个读写锁,不管有多少数据库和数据集合,当⼀个操作进⾏时其他操作只能等待,在2.2版本后,mongodb锁降低了粒度,改为按库锁。
MongoDB 使⽤的是“readers-writer”锁,可以⽀持并发但有很⼤的局限性,当⼀个读锁存在,许多读操作可以使⽤这把锁,然⽽, 当⼀个写锁的存在,⼀个单⼀的写操作会exclusively 持有该锁,同时其它读,写操作不能使⽤共享这个锁;举个例⼦,假设⼀个集合⾥有 10 个⽂档,多个 update 操作不能并发在这个集合上,即使是更新不同的⽂档。
1. 删除数据集合后空间不会⾃动释放
mongodb删除集合后磁盘空间不释放,只有⽤db.repairDatabase()去修复才能释放。
修复可能要花费很长的时间,在使⽤db.repairDatabase()去修复时⼀定要停掉读写,并且mongodb要有备机才可以,不然千万不要随便使⽤db.repairDatabase()来修复数据库,切记。
但是在修复的过程中如果出现了⾮正常的mongodb的挂掉,再次启动时启动不了的,需要先修复才可以,可以利⽤./mongod --repair --dbpath=/data/mongo/ 如果你是把数据库单独的放在⼀个⽂件夹中指定dbpath时就指向要修复的数据库就可以。
7. replica set⼀些隐含问题
a) replica set模式最多⽀持12台服务器,⽽有投票权的服务器只⽀持7台,如果超过7台服务器,需设置部分服务器为⽆投票权服务器
b) replica set模式中,⼀个set服务器如果⼩于2台服务器,则⾃动故障恢复不会起作⽤,如果4台服务器出现2/2互相ping不通的情况,同样不会⾃动故障恢复。⼀般来说,⼀个set中尽量是有单数服务器。
c). replica set中,因为mongodb是按照时间进⾏操作,如果set中某个服务器时间超前或者延迟,很容易出现secondaries不断尝试更新oplog或者同步延迟的问题。甚⾄造成某些操作失败,如drop操作。
8. 分⽚模式的⼀些隐含问题
1. config server尽量按照官⽅的要求,有3个configserver,如果只有2个configserver,则shard的⾃动负载均衡和⾃动切⽚功能不可⽤。
2. api中的nearest模式在shard中,判断的是set到mongos的距离⽽⾮set到client的距离,在切⽚模式下,尽量不要使⽤nearest模式,可能会造成⼀些请求延迟增加的问题。
优点
l ⽂档结构的存储⽅式,能够更便捷的获取数据
l 内置GridFS,⽀持⼤容量的存储
l 内置Sharding,分⽚简单
l 海量数据下,性能优越
l ⽀持⾃动故障恢复(复制集)
mongodb是⼀个介于nosql数据库和mysql数据库之间的⼀个数据存储系统,它没有严格的数据格式,但同时⽀持复杂查询,⽽且⾃带sharding模式和Replica Set模式,⽀持分⽚模式,复制模式,⾃动故障处理,⾃动故障转移,⾃动扩容,全内容索引,动态查询等功能。扩展性和功能都⽐较强⼤。
mongodb在数据查询⽅⾯,⽀持类sql查询,可以⼀个key多value内容,可以组合多个value内容来查
询,⽀持索引,⽀持联合索引,⽀持复杂查询,⽀持排序,基本上除了join和事务类型的操作外,mongodb⽀持所有mysql⽀持的查询,甚⾄某个客户端api⽀持直接使⽤sql语句查询mongodb。
mongodb的sharding功能⽬前⽇渐完善,⽀持⾃定义范围分⽚,hash⾃动分⽚等,分⽚⾃动扩容,shard之间⾃动负载均衡等功能。实际使⽤中功能还不错。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论