写点什么

Wordnik 的 MongoDB 使用经验

  • 2010-11-12
  • 本文字数:1875 字

    阅读完需:约 6 分钟

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 提供商业支持

2010-11-12 00:075834
用户头像

发布了 157 篇内容, 共 54.5 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

数字化背景下,为何J2PaaS低代码平台,能成为企业技术升级的优选?

J2PaaS低代码平台

低代码 数字化 企业数字化转型 低代码平台 企业级低代码平台

JAVA只要掌握内部类,多继承和单继承都不是问题

华为云开发者联盟

Java jdk 多继承 内部类 单继承

加入XTransfer,和技术大咖一起大展身手!

XTransfer技术

程序员 招聘 跨境支付

深度文 | 一文看懂云原生时代 DevOps 如何选型

星汉未来

运维 云原生 降本增效

恒源云(Gpushare)_UNIRE:一种可以共享标签空间的方法

恒源云

OpenCV 计算机视觉 服务器

TiDB 5.4 发版丨新功能解读

PingCAP

【C语言】结构体

謓泽

C语言 结构体 3月月更

深度剖析数仓CN增量备份技术

华为云开发者联盟

华为云 备份 GaussDB(DWS) 备份容灾 CN增量备份

Apache Flink 在移动云实时计算的实践

Apache Flink

大数据 flink 开源 编程 实时计算

数字化时代,银行如何建设管理小程序平台促进线上金融业务发展?

FinClip

小程序 银行

MongoDB常见问题解答:时间与时区

MongoDB中文社区

mongodb

云原生背景下的应用安全建设

火线安全

云原生 云安全

【数据库】云数据库rds是什么意思?有什么优势?

行云管家

数据库 云数据库 RDS

直播系统聊天技术(七):直播间海量聊天消息的架构设计难点实践

WorkPlus

不会Netty,你永远是个Java菜鸟

博文视点Broadview

大数据培训:Kafka存储结构及Log清理机制

@零度

大数据 kafka log

高级IO模型之kqueue和epoll

程序那些事

Java io nio 程序那些事 3月月更

记某核心MongoDB集群索引优化实践

MongoDB中文社区

mongodb

科创人·弘玑Cyclone CEO高煜光:从RPA到超自动化,以客户需求构建战略纵深

科创人

NFT卡牌盲盒游戏系统开发搭建

薇電13242772558

NFT

带你掌握Redis数据类型:string和Hash

华为云开发者联盟

redis string hash 数据类型

云开发在教育应用开发、运维全流程实践

阿里云云效

云计算 阿里云 DevOps 云原生 开发

ZStack 与龙蜥操作系统完成兼容性认证,共同打造安全可信的云+OS技术生态

OpenAnolis小助手

云计算 开源 操作系统 云平台

什么是SDK,它是怎样威胁我们的隐私?

郑州埃文科技

车辆GPS定位整套管理系统,轨迹播放,车辆管理,电子围栏,报警记录,数据库/人员定位/宠物定位/物流跟踪/资产定位

Geek_7jiynf

Java Java web GPS

fastposter v2.5.1 发布 轻松在线作图

物有本末

45个 GIT 经典操作场景,专治不会合代码

程序员小富

git

福昕软件与中国船级社签署框架合作协议,共建数字船舶发展新高地

联营汇聚

基于大数据的医疗健康疾病筛查及风险评估系统

Geek_7jiynf

医疗方案 医疗AI 医疗信息化

web前端培训:js算法面试es6实现

@零度

JavaScript ES6

【云计算】云计算六大优点简单说明

行云管家

云计算 IT 企业上云 IT运维

Wordnik的MongoDB使用经验_架构_赵劼_InfoQ精选文章