BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Wordnik的MongoDB使用经验

| 作者 赵劼 关注 5 他的粉丝 发布于 2010年11月13日. 估计阅读时间: 6 分钟 | AICon 关注机器学习、计算机视觉、NLP、自动驾驶等20+AI热点技术和最新落地成功案例。

Wordnik是一项在线字典及百科全书服务,在大约一年前,它们逐渐开始从MySQL迁移至文档型数据库MongoDB,后者是著名的NoSQL产品之一。最近Wordnik的技术团队通过官方博客分享了这12个月来使用MongoDB经验及现状

据Wordnik技术团队描述,它们起初决定使用MongoDB,是看中了它的弱一致性(最终一致)及文档结构的存储方式。

在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值。这在某些情况下,例如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义,反而会产生很大的延迟。他们需要的是一个“大约”的数字以及更快的处理速度。

此外,Worknik的数据结构是“层级”式的,如果要将这样的数据使用扁平式的,表状的结构来保存数据,这无论是在查询还是获取数据时都十分困难:

就拿一个“字典项”来说,虽然并不十分复杂,但还是会关系到“定义”、“词性”、“发音”或是“引用”等内容。大部分工程师会将这种模型使用关系型数据库中的主键和外键表现出来,但把它看作一个“文档”而不是“一系列有关系的表”岂不更好?使用“dictionary.definition.partOfSpeech='noun'”来查询也比表之间一系列复杂(往往代价也很高)的连接查询方便且快速。

经过了一年的使用,Worknik描述了他们从MySQL全面迁移至MongoDB后的感受。

首先是性能上的提高,这也是使用MongoDB的主要原因。MongoDB解决了Worknik在使用MySQL的时候,在存储和数据查询时都遇到的一些问题。下面是一些统计数据:

  • MongoDB承受了平均50万每小时的请求(包括周末和夜间),高峰期大约是4倍的量。
  • MongoDB中有超过120亿个文档。
  • 每个节点大约3TB数据。
  • 一般情况下文档插入速度为每秒8千条,峰值为每秒5万条。
  • 单个Java客户端在千兆带宽下,对单个MongoDB节点的可持续的传输速度为每秒10MB。同一个客户端的四个读取器可以保持每秒40MB的读取速度。
  • 各种形式的查询都比MySQL的实现要快许多:
    • 示例的获取速度,从400ms减少为60ms。
    • 字典项获取速度,从20ms减少为1ms。
    • 文档元数据的获取速度,从30ms减少为0.1ms。
    • 拼写提示的获取速度,从10ms减少为1.2ms。

Worknik表示,在压力较高的情况下,MongoDB的内置缓存机制,让系统对memcached层的每次调用节省了1-2ms,同时还剩下了许多GB的内存。此外,所有的数据不可能都在内存中,因此获取示例的60ms还包括磁盘访问时间。

其次,使用MongoDB还带来了许多灵活性,除了之前提到的文档型存储让查询变得十分迅速之外,MongoDB还带来了其他一些好处。例如以前Worknik使用集群文件系统保存音频文件,如今这些文件保存在MongoDB的GridFS中。这给IT维护带来了许多方便,例如可以使用相同的方式来维护数据和文件内容,数据库和文件也是保持同步的。

Worknik对MongoDB的可靠性也很满意,从四月起,MongoDB只重启了两次,一次是从1.4.2版升级到1.4.4版,还有一次是由于数据中心断电。

唯一可能的抱怨是对于维护性上的。MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。不过幸运的是,MongoDB提供了许多“接入点”,因此Worknit创建了一些辅助工具,并打算开源,他们表示将在十二月份的MongoSV上提供更多信息。

在运营过程中,数据中心断电造成了很大的问题。由于断电发生在写密集的情况下,因此对主从节点都造成了损害。当时主节点正忙于将数据写回磁盘,而从节点正在通过日志获取数据。在电力回复之后,他们花费了超过24小时了来修复主节点上的数据,在这段时间内,他们将从节点提升为主节点使系统得以正常工作。

最后,Worknik还分享了一些经验:

数据尺寸:在四月份的MongoSF会议上,我们曾抱怨MongoDB耗费了4倍的数据空间。之后10gen指出了MongoDB的集合填充机制,以及Worknik某些使用场景上造成的浪费。我们将一些对象作为子文档存储,并去除一些索引之后,则大约使用了MySQL的1.5至2倍的存储空间。

锁:某些情况下MongoDB会锁住数据库。如果此时正有数百个请求,则它们会堆积起来,造成许多问题。我们使用了下面的优化方式来避免锁定:

  • 每次更新前,我们会先查询记录。查询操作会将对象放入内存,于是更新则会尽可能的迅速。在主/从部署方案中,从节点可以使用“-pretouch”参数运行,这也可以得到相同的效果。
  • 使用多个mongod进程。我们根据访问模式将数据库拆分成多个进程。

MongoDB是一个可扩展、高性能的下一代数据库。最新版本为1.6.3,并由10gen提供商业支持

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

国内有NoSQL在线社区吗? by Liu Huanqing

老赵,现在国内有专门面向NoSQL的网上社区或交流平台吗?

别字? by 俞 宏杰

“他们需要的是一个“大约”的数字已经更快的处理速度。”
已经--以及?

Re: 别字? by 俞 宏杰

每条8千条

每秒8千条

用得好吗? by Zou Yong

大家访问以下wordnik就知道了,random一个词,词出现后,内容要等好久才出来。

Re: 用得好吗? by Jun Luo

大家访问以下wordnik就知道了,random一个词,词出现后,内容要等好久才出来。

速度很不错,通过美国服务器访问,0.2s。速度慢主要是国内访问的网速慢。

为了更好的性能 升级单台机器的内存 by yuanfeng xia

可以把单台机器升级到60GB。。使用MongoDB,监控很重要。要监控内存使用和硬盘I/O。。

Re: 国内有NoSQL在线社区吗? by xingon xingon

blog.nosqlfan.com/

这个BLOG不错,可以看下你

希望再详细一点 by 付 辉

写的如果能在细节一点,详细一点

希望再详细一点 by 付 辉

写的如果能在细节一点,详细一点

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

9 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT