存档

文章标签 ‘Mongodb’

MongoDB 3.0到来

2015年2月4日 2,711 views 没有评论

MongoDB 3.0:7到10 倍的性能提升、减少80%的存储,还有宣称的大大提高的维护性。

对比之下,以前的存储引擎就是个渣,当然,我早知道,它的存储引擎一直就是个渣,所以关注,但一直拒绝在生产上用。

其实MongoDB的问题一直存在,只是市场营销部门太过抢眼,商业公司在这方面很强大,因为你必须给外面一种光鲜的外表,你才能有更好的估值,你才能上市,各种场合下,它都是高大上,任何一个小小的利好,都会被放大,你可以看到各种统计,它貌似比任何产品的风头都更劲,所以我对于一些引用的数据库产品的占用率保持怀疑。

而对于用户出现的问题,官方却各种回避,不愿意承认其固有的存储引擎问题。我以前断言,这家公司只有被收购了,换一个引擎,他才可能发展起来,没想到他能够收购另一家公司,换掉自己的存储引擎。

一家公司的市场部门太过强势,不一定是好事,因为社区会不买账,用户对官方的宣告越来越怀疑,这个世界永远不缺“小白用户” ,许多公司的各种CIO,也许仅仅是相信他们,就引入了这个产品,我们也经常看到各种分享mongoDB的演讲,许多研发人员投入了很多精力,也有许多线上的案例,但这中间[……]

Read more

分类: 数据库 标签:

Mongodb的空间分配

2014年5月6日 2,376 views 没有评论

据我的生产实践,Mongodb占据的磁盘空间比MySQL大得多,可以理解文档数据如Json这种格式,存在许多冗余数据,但空间占用大得不正常,甚至是传统数据库的三四倍,不太契合工程实践,应该有改善的余地。 查阅了一些资料,具体理下Mongodb的空间分配。

1. MongoDB每个库逻辑上包含许多集合(collection),物理上存储为多个数据文件,数据文件的分配是预先分配的,预分配的方式可以减少碎片,程序申请磁盘空间的时候更高效,但MongoDB预分配的策略可能导致空间的浪费。默认的分配空间的策略是:随着数据库数据的增加,MongoDB会不断分配更多的数据文件。每个新数据文件的大小都是上一个已分配文件的两倍( 64M, 128M, 256M, 512M, 1G, 2G, 2G, 2G ),直到预分配文件大小的上限2G。虽然2G的阀值可以调整,但一般运维等时候往往也不会去调整,就这点来说,可能导致空间的浪费。

对于磁盘的空间的分配效率,我报以怀疑的态度,如果本身有IO瓶颈,预分配一个2G的文件,将可能导致服务出现严重性能问题。预分配文件,可以减少碎片,提高程序申请空间的效率[……]

Read more

分类: 数据库 标签: ,

mongodb的不足 再论mongodb

2013年8月8日 5,228 views 没有评论

mongodb的不足

mogodb的不足主要是因为mongodb的存储引擎是个问题.

也许我对mongodb的态度不够中肯,有偏见,毕竟一个产品的发展还是取决于现实的需要,被工业驱动,即使它实现得不好,并不妨碍他成为一些人的解决方案,解决一些实际问题。
我解释下为什么对mongodb不报以期望值。需要回顾下一些理论知识,存储引擎相关理论已经很成熟,一般的商业数据库,流行的开源数据库如Mysql都已经实现了自身的存储管理系统, 要点是:数据文件的修改 和 日志(write ahead logging)记录 需要配合好 来实现数据的持久化。 数据库必须控制何时写入什么数据到磁盘,如果按照mongodb让操作系统来决定何时刷新数据到磁盘( 使用mmap的方式),那么这个数据的写入顺序完全无法保证。操作系统有其自身的缓存机制,它和数据库之间是互相不清楚对方的行为的,所以mmap方式的数据库,往往从理论上,就注定灾难恢复性存在问题。即使10gen公司宣称的增加了灾难恢复的日志,但只是提高了灾难恢复性,离真实的生产标准还有遥远的距离,因为日志最多是把最近的记录重放一遍,但操作系统把数据库[……]

Read more

分类: 数据库 标签: , , ,

mongodb写入数据要注意的一些细节

2013年3月9日 1,434 views 没有评论

mongodb写入数据

mongodb写入数据是靠操作系统的缓存来实现的,我们需要清楚这中间发生了什么?

对于更新操作,可能存在以下两种状态。
pre-fsync post-update state   对数据的变更已经写入journal日志,但日志并没有刷新(fsync)的磁盘上
post-fsync post-update state 对数据的变更已经刷新到日志文件,这个时候,如果宕机,可以利用journal日志进行灾难恢复。
那么在pre-fsync post-update state阶段,如果宕机了。很可能会丢失数据,因为连日志都没有刷新到磁盘。

此时会出现这样一种情况,用户读取到了新的数据,然后宕机了,这个数据被丢失了。 用户读到了数据,但这个数据后来又不存在了,这种情况是否有问题呢? 得看应用。
mongodb提供了其他选项,写入操作可被block,直到从库应答后(具体机制我不记得了,可能和MySQL的半同步类似的道理)。但主库上面的读取操作也许仍然可以读取到新的值(不必等从库应答)
注意:由于mmap的机制,如果只是mongod进程挂了。那么不会丢[……]

Read more

分类: 数据库 标签: , ,

mongodb使用建议 生产环境应慎用mongodb

2012年7月12日 3,631 views 没有评论

虽然很欣赏mongodb的一些特性,如schemaless .但就目前生产的使用来说,还是存在相当大的不足. 而业内明显是宣传过头了.

优势就不说了,网上很多.我说说这个产品的缺陷:
1. bug比较多,而且必须等待官方新版本发布才能解决bug,目前(2.0.4) 存在有时的备份bug(备份会失败),导致备份不能用,没有一个强大的研发团队支持,深入源码级别,可能你死得很难看;
2. 数据文件会比传统数据库存储大得多. 会导致存储成本大大增加;
3. mmap的方式io效率差, 很容易导致主机到达io瓶颈,产生许多毛刺,一般mongodb必须独占整个主机的资源,会影响上面的其他实例,无法充分利用资源,生产环境中即使主机只存在一个mongodb实例,也有时发现swap的使用;
4. 关于自动冗余切换的特性没有传说的那么好,官方的投票算法不是很完善,难以解决复杂的网络硬件故障异常导致的切换,所以高可用得打个折扣.
重要的是:
mongodb的宣传很出色,但存储引擎是个硬伤,目前的灾难恢复性还是很差的,宕机后数据损坏有时发现不了,会导致后期的数据异常. 如果基础的存储引擎没有大的[……]

Read more

分类: 数据库 标签: ,

数据库大会感想(一)

2012年4月18日 1,941 views 没有评论

这次数据库大会有一些收获, 主要是对于数据库中间层的认识更深刻了,看来百度,腾讯,淘宝都走在了前列.  相对来说,从百度同学的演讲,可以看出百度的运维水平,技术人员的素质还是高于腾讯和淘宝的. 淘宝可能出于互相竞争的目的,dba都开始直接参与监控系统设计,这样并不太好,很容易重复造轮子,没有太好的分工协作,我想淘宝内部可能存在很多的监控系统和各种类似的产品.

百度都是主从的架构, 而淘宝拥有很多主主的架构, Mysql本来就不是一个分布式的数据库,主主的架构其实伸缩性有限, 更稳健的方式其实是主从的架构, 然后用中间层和单点切换系统搞定主从切换,主从数据一致.  就这点来说,百度也比淘宝要稳健和更符合工程学一些.

为什么没有公司讲述mongodb,即使是新浪微博唐福林 说的大数据,也只是对redis遇到的问题进行了一些介绍,很中肯指出一些问题.  这里面我想主要的原因还是一个成本原因.  新浪微博的redis集群都是96G的主机,>100台主机(记得不是很清楚) , 把数据不分冷热放到内存中,本来就是一个成本高昂的方案,信价比很差,唐福林说在一定规模下,使用redis[……]

Read more

mongodb运维手册:常用命令

2012年4月9日 2,108 views 没有评论
概述
如果插入数据,mongodb会自动创建集合和数据库.如果查询不存在的集合,mongodb认为是一个空集.
即use mydb(不存在),并不会创建mydb,也不会报错,但如果插入了数据,则自动创建相应的数据库和集合, show dbs可以显示mydb.
mongodb的collection(集合)可对应传统关系数据库的table, document 对应行(记录)
按照时间先后顺序更新,the last update will “win.”,所以冲突不会破坏数据.
在MongoDB 中,写操作默认是通过 fire-and-forget 的模式来进行的,也就是说写操作通常不关心是否成功,发完请求后客户端就认为成功了。
Mongodb,也是支持IP限制,用户权限限制等一些常用的数据库权限设定,但一般不做限制,官方默认也是无权限认证的.
管理员常用的命令
help                         show help
show dbs                     show database names
sho[......]

Read more

分类: 数据库 标签: ,

mongodb运维手册:优化

2012年4月8日 3,724 views 没有评论
mongodb使用了memory mapped files, top输出的
VIRT  virtual size   : the size of mapped data
RES   resident bytes : how much data is being cached in RAM.
注意: mongodb的机制是预分配数据文件,最大的一次可以分配2G的数据文件. ext3据说分配文件比较慢.
由于预分配的关系, 数据文件可能比实际数据大得多,可能分配了额外的内存. 因为momory mapped files的机制,RES也需要分配相应的内存.
mongodb的内存并不能释放,因为内存是交给os来管理的. 单主机单节点,独立的mongodb主机,不用太过care. 但如果和其他服务部署在一起,可能导致内存资源的争用.
高性能
支持Group Commits, 批量写入数据,默认是100ms, 可以配置为2~300毫秒 .
对于一个insert操作,那么需要4次写入(写入collection,写入oplog, 再加上前面两个写入都记录日志)
字段名并不存储[……]

Read more

分类: 数据库 标签: ,

mongodb运维手册:监控

2012年4月7日 2,535 views 没有评论
mongodb监控
有一个免费的监控服务,MMS可以尝试下.会定时把你生产环境的性能数据发送到这个监控服务.有利于你监控生产或者开发环境.

Installation

  • Install Python (2.4+) and pymongo (1.9+)
  • See the README that comes with the agent or the complete docs for more information.
  • Start the agent:
    nohup python agent.py > /YOUR_LOG_DIRECTORY/agent.log 2>&1 &

Add Hosts

  • You do not have any hosts configured. Click the add host button To add a host, click the plus/+ button on the top of the page above to get started.
1. 获取mongo[……]

Read more

分类: 数据库 标签: ,

mongodb运维手册:复制,failover

2012年4月6日 2,278 views 没有评论
两种模式: replication set 和 master/slave
当前的存储引擎,不能确保single-server durability, 生产环境需要自动冗余切换,故需要用到replication set模式.
5.1 Replica Sets模式
Replica set 包括Primary node和secondary node
Replica set 其实就是一个有自动故障切换功能的主从集群.如果当前primary node失效了,会选举出一个新的primary node.如果宕机的node重启后,它将成为secondary node . mongodb保证当前只有一个实例是active的(primary node),可写入数据,保证强一致性.  客户端可以自动检测到primary node的变更,发送读写请求给新的primary node.
客户端参数是逗号分隔的主机名(ip):port 字符串.   192.168.1.1:27017,192,168.1.2:27017,192.168.1.3:27017

[……]

Read more

分类: 数据库 标签: ,