从MySQL到MongoDB——视觉中国的NoSQL之路

从MySQL到MongoDB——视觉中国的NoSQL之路


2024年5月17日发(作者:)

MySQL ̄qMongoDB 

视觉中国的NoSQL之路 

维护量,如何有效监控和管理这些节点又成了新的问题。虽 

■ 

文,潘凡 

起因 

人群的专业网站。2009年以前,同很多公司一样,我们的 

使用7Master+Master的部署方案;前端使用自己的pHp)fil架 

进行开发;Memcached作为缓存;Nginx进行WebfiE务和负 

载均衡;Gearman进行异步任务处理。在传统的基于静态内 

 

视觉中国网站(www.chinavisua1.com)是国内最大的创意 

然虚拟化可以解决部分问题,但还是不能令人满意;

除了MySQL,能否找到一个更为简单、轻便的瑞士军 

 

CMS ̄I:]社区产品都构建于PHP+Nginx+MySQL之上;MySQL 

刀呢?我们的目光投向了NoSQL的方案。

候选方案 

最初,对于NoSQL的候选方案,我依据关注和熟悉程 

 

容(如文章,资讯,帖子)的产品,这个体系运行良好。通 

度,并且在甄别和选择合适的方案时特别制定了一些原则:

过分级的缓存,数据库端实际负载很轻。2009年初,我们进 

是否节省系统资源,对于CPU等资源是否消耗过大;客户 

行了新产品的开发。此时,我们遇到了如下一些问题。 

端/AP1支持,这直接影响应用开发的效率;文档是否齐全, 

用户数据激增:我们I ̄MySQL某个信息表上线1个月的 

社区是否活跃;部署是否简单;未来扩展能力。按以上几点 

s、MongoDB和 

数据就达到千万。我们之前忽略的很多数据,在新形势下需 

经过一段测试后,我们候选名单中剩下Redi

要跟踪记录,这也导致了数据量的激增; 

Flare。 

用户对于信息的实时性要求更高:对信息的响应速度 

和更新频度就要求更高。简单通过缓存解决的灵丹妙药不 

复存在; 

是惊人的。因此要求能够无痛的升级扩展,否则一旦停机, 

Redis对丰富数据类型的操作很吸引人,可以轻松解决 

些应用场景,其读写性能也相当高,唯一缺点就是存储能 

力和内存挂钩,这样如果存储大量的数据需要消耗太多的内 

Flare的集群管理能力令人印象深刻,它可以支持节 

点的动态部署,支持节点的基于权重的负载均衡,支持 

 

对于Scale.out的要求更高:有些创新产品的增长速度 

存(最新的版本已经不存在这个问题)。

那么用户流失的速度也是惊人的; 

大量文件的备份工作:我们面向的是创意人群,产生的 

数据分区。同时允许存储大的数据,其key的长度也不受 

内容是以图片为主。需要能够对这些图片及不同尺寸的缩略 

Memcached的限制。而这些对于客户端是透明的,客户端 

are的proxy节点就可以了。由 

图进行有效的备份管理。我们之前使用的Linux inotify+rsync 

使用Memcached协议链接到FI

的增量备份方案效果不佳; 

于使用集群,Flare支持fail-over,当某个数据节点宕掉, 

oxy节点forward ̄0对应的 

需求变化频繁:开发要更加敏捷,开发成本和维护成本 

对于这个节点的访问都会自动被pr

are的缺点是实际应用 

要更低,要能够快速地更新进化,新功能要在最短的周期内 

后备节点,恢复后还可以自动同步。Fl

上线。 

案例较少,文档较为简单,目前只在Geek使用。 

以上方案都打算作为一个优化方案,我从未想过完全放 

最初,我们试图完全通过优化现有的技术架构来解决 

以上问题:对数据时效性进一步分级分层缓存,减小缓存 

弃MySQL。然而,用MongoDB做产品的设计原型后,我彻 

 

粒度;改进缓存更新机制(线上实时和线下异步更新)提 

底被征服了,决定全面从MySQL迁移到MongoDB。

高缓存命中率;尝试对业务数据的特点按照水平和垂直进 

行分表;使用MogileFS进行分布存储;进一步优化Mysql 

为什么MongoDB可以替代MySQL? 

MongoDB是一个面向文档的数据库,目前由10gen开发 

的性能,同时增加MySQL节点等。但很快发现,即便实 

施了上述方案,也很难完全解决存在的问题:过度依赖 

并维护,它的功能丰富,齐全,完全可以替代MySQL。在 

Memcached导致数据表面一致性的维护过于复杂,应用程 

使用MongoDB做产品原型的过程中,我们总结了MonogDB 

序开发需要很小心,很多时候出现Memcached的失效会瞬 

的一些亮点: 

间导致后端数据库压力过大;不同类型数据的特点不同,数 

舍;MogileFS对我们而言是脚小鞋大,维护成本远远超过了 

使用JSON风格语法,易于掌握和理解:MongoDB使 

MongoDB的操作都使用JSON,5 ̄.格语法,客户端提交或接收 

据量差别也很大;分表的机制和方式在效率平衡上很难取 用JSON的变种BSON作为内部存储的格式和语法。针对 

实际的效益;引入更多的MySQL数据库节点增大了我们的 的数据都使用JSON形式来展现。相对于SQL来说,更加直 

2010 O6 79 

Cover Story封面报道 

观,容易理解和掌握。 

CRUD更加简单,支持in-place update:只要定义一个 

Schema-Iess,支持嵌入子文档:MongoDB是一 

数组,然后传递给MongoDB的insert/update方法就可自动插 

个Schema-free的文档数据库。一个数据库可以有多个 入或更新;对于更新模式,MongoDB支持一个upse ̄选项, 

Collection,每个Collection是Documents的集合。Collection 

即:“如果记录存在那么更新,否则插入”。MongoDB的 

和Document和传统数据库的Table和Row并不对等。无需事 

update方法还支持Modifier,通过Modiifer可实现在服务端即 

先定义Collection,随时可以创建。 

Collection中可以包含具有不同schema的文档记录。 

时更新,省去客户端和服务端的通讯。这些modifer可以让 

MongoDB具有和Redis、Memcached等KV类似的功能:较 

这意味着,你上一条记录中的文档有3个属性,而下一条记 之MySQL,MonoDB更加简单快速。Modiifer也是MongoDB 

录的文档可以有1 0个 

可以作为对用户行为跟踪的容器。在实际中使用Modifier来 

属性,属性的类型既可 

将用户的交互行为快速保存 ̄fJMongoDB中以便后期进行统 

以是基本的数据类型 计分析和个性化定制。 

(如数字、字符串、日 

曩 2 

苷 

所有的属性类型都支持索引,甚至数组:这可以让某些 

期等),也可以是数组 任务实现起来非常的轻松。在MongoDB中,“

id”属性是 

或者散列,甚至还可以 

主键,默认MongoDB会对id ̄lJ建一个唯一索引。 

是一个子文档(embed 

document)。这样, 

譬 

服务端脚本和MapfReduce:MongoDB允许在服务端 

执行脚本,可以用Javascript编写某个函数,直接在服务 

用即可。MongoDB不支持事务级别的锁定,对于某些需要 

自定义的“原子性”操作,可以使用Server side脚本来实 

现,此时整个MongoDB处于锁定状态。Map/Reduce也是 

MongoDB中比较吸引人的特性。Map/Reduce可以对大数 

可以实现逆规范化 端执行,也可以把函数的定义存储在服务端,下次直接调 

(deno rmalizing)的 

数据模型,提高查询的 

一 一 … 

速度。 

图1 MongoDB是一个Schema-free的文档数据库 

据量的表进行统计、分类、合并的工作,完成原先SQL的 

图2是一个例子, 

GroupBy等聚合函数的功能。并I ̄Mapper和Reducerl ̄定义 

都是用Javascript来定义服务端脚本。 

性能高效,速度快:MongoDB使用c++/boost编写,在 

多数场合,其查询速度对I;LMySQL要快的多,对于CPU占 

用非常小。部署也很简单,对大多数系统,只需下载后二进 

制包解压就可以直接运行,几乎是零配置。 

作品和评论可以设计 

为一个collection,评 

论作为子文档内嵌在 

a rt的COmments属性 

中,评论的回复则作 

为comment子文档的 

支持多种复制模式:MongoDB支持不同的服务器问进 

行复制,包括双机互备的容错方案。 

Master-Slave是最常见的。通过Master-Slave可以实现数 

据的备份。在我们的实践中,我们使用的是Master-Slave模 

图2 MongoDB支持嵌入子文档 

式,Slave只用于后备,实际的读写都是从Master节点执行。 

Replica Pairs/Replica Sets允许2个MongoDB相互监 

子文档内嵌于rePIles 

属性。按照这种设计 

模式,只需要按照作 

品id检索一次,即可获 

得所有相关的信息了。在MongoDB中,不强调一定对数据 

 

进行Normalize,很多场合都建议De-normalize,开发人员 

听,实现双机互备的容错。

可以扔掉传统关系数据库各种范式的限制,不需要把所有 

的实体都映射为一个Collection,只需定义最顶级的class。 

MongoDB的文档模型可以让我们很轻松就能将自己的 

Object映射 ̄Jcollection中实现存储。 

MongoDB只能支持有限的双主模式(Maste卜 

Master),实际可用性不强,可忽略。 

内置GridFS,支持大容量的存储:这个特点是最吸引 

我眼球的,也是让我放弃其他NoSQL的一个原因。GridFS 

jifles. 

简单易用的查询方式:MongoDB中的查询让人很舒 

具体实现其实很简单,本质仍然是将文件分块后存储 ̄l

ile和files.chunk 2个collection中,在各个主流的driver实现 

适,没有SQL难记的语法,直接使用JSON,相当的直观。 

idFS的操作。由于GridFS自身也是一 

对不同的开发语言,你可以使用它最基本的数组或散列格式 

中,都封装了对于Gr

进行查询。配合附加的operator,MongoDB支持范围查询, 

个Collection,你可以直接对文件的属性进行定义和管理, 

正则表达式查询,对子文档内属性的查询,可以取代原来大 

通过这些属性就可以快速找到所需要的文件,轻松管理海量 

的文件,无需费神如何hash才能避免文件系统检索性能问 

多数任务的SQL查询。 

8O 程序员 

题,结合下面的Aut0.sharding,GridFS ̄扩展能力是足够  ̄

片和各种尺寸的缩略图。 

内置Sharding,提供基 

于Range的Auto Sharding机 

制:一个collection可按照记录 

Map/Reduce来完成这种表数据的处理;属性的类型插 

询时用数字1是不匹配的; 

优化MongoDB的性能可以 

从磁盘速度和内存着手; 

MongoDB对每个Document 

的限制是最大不超过4MB; 

在符合上述条件下多启用 

Embed Document,避免使 

用DatabaseReference; 

我们使用了。在实践中,我们用MongoDB ̄GridFs存储图 入和查询时应该保持一致。若插入时是字符串“1”,则查 

的范围,分成若干个段,切分 

到不同的Shard上。Shards可 ,一 

以和复制结合,配合Replica 

sets ̄,够实现Sha rding+fa.1- : 

over,不同的Shard之间可以 

内部缓存可以避免N+1次查 

询问题(MongoDB不支持 

joins)。 

用Capped Collection 

负载均衡。查询是对客户端是 

透明的。客户端执行查询,统 

计,MapReduce等操作,这些 

会被MongoDB自动路由到后 

端的数据节点。这让我们关注 

图3 MongoDB的Auto-sharding结构 

解决需要高速写入的场合, 

如实时日志;大数据量情况 

于自己的业务,适当的时候可以无痛的升级。MongoDB的 下,新建同步时要调高oplogSize的大小,并且自己预先生 

Sharding设计能力最大可支持约20 petabytes,足以支撑一 成数据文件,避免出现客户端超时;Collection+lndex合 

般应用。 

计数量默认不能超过24000;当前版本(<v1.6)删除数据 

第三方支持丰富: MongoDB社区非常活跃,很多开发 

的空间不能被回收,如果你频繁删除数据,那么需要定期 

框架都迅速提供了对MongDB的支持。不少知名大公司和网 

执行repairDatabase,释放这些空间。 

站也在生产环境中使用MongoDB,越来越多的创新型企业转 

而使用MongoDB作为和Django,RoR来搭配的技术方案。 

擎i q 

结束语 

MongoDB的里程碑是1.6版本,预计今年7月份发布, 

届时,MongoDB的Sharding将首次具备在生产环境中使用 

实施结果 

实施MOnoDB的过程是令人愉快的。我们对自己的 的条件。作为MongoDB的受益者,我们目前也在积极参与 

PHP开发框架进行了修改以适应MongoDB。在PHP中,对 

MongoDB社区活动,改进Perl/PHP对于MongoDB的技术 

MongoDB的查询、更新都是围绕Array进行的,实现代码变 

方案。在1.6版本后也将年内推出基于MongoDB的一些开源 

得很简洁。由于无需建表,MonoDB运行测试单元所需要的 

项目。 

时间大大缩短,对于TDD敏捷开发的效率也提高了。当然, 

对于那些刚刚起步,或者正在开发创新型互联网应用的 

由于MongoDB的文档模型和关系数据库有很大不同,在实 公司来说,MongoDB的快速、灵活、轻量和强大扩展性, 

践中也有很多的困惑,幸运的是,MongoDB开源社区给了 

正适合我们快速开发产品,快速迭代,适应用户迅速变化和 

我们很大帮助。最终,我们使用了2周就完成了从MySQL ̄0 

更新的种种需求。 

MongoDB的代码移植比预期的开发时间大大缩短。从我们 总而言之,MongoDB是一个最适合替代MySQLI ̄全功 

的测试结果看也是非常惊人,数据量约2千万,数据库300G 能的NoSQL产品,使用MongoDB+Perl/PHP/Django/RoR 

的情况下,读写2000rps,CPU等系统消耗是相当的低(我 的组合将很快成为开发Web2.0、3.0的产品的最佳组合,就 

们的数据量还偏小,目前陆续有些公司也展示了他们的经典 

像当年MySQL替代Oracle/DB2/Informix--样,历史总是惊 

案例:MongoDB存储的数据量已超过5O亿,>1.5TB)。目 

人的相似,让我们拭目以待吧!.置I . 

前,我们将MongoDB和其他服务共同部署在一起,大大节 

约了资源。 

些小提示 

切实领会MongoDB ̄Document模型,从实际出发,扔 

掉关系数据库的范式思维定义,重新设计类;在服务端运行 

I ̄JavaScript代码避免使用遍历记录这种耗时的操作,相反 

一 潘联计Pn作ieg凡合和、rh者l编t(创底分sna程i布始层简gleh人产式。rt sc介Ta品文,owiml家研件et:/r 发存,有N工储:1 狗@S作、2.)Nn。猫,oig视当。Sh觉前Qts目La关中前、ile国注负高r 网:责性B站A网能Iop技g站后s:术平现h总t台代p监设的:/, 

2O10 06 81 


发布者:admin,转转请注明出处:http://www.yc00.com/news/1715915184a2691258.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信