【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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:075750
用户头像

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

关注

评论

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

从零实现一个 k-v 存储引擎

roseduan

存储 Go 语言 KV存储引擎 存储系统

阿里技术分享:闲鱼IM基于Flutter的移动端跨端改造实践

JackJiang

flutter 即时通讯 IM

分布式认知工业互联网

CECBC

从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

华为云开发者联盟

鸿蒙

Nacos配置中心交互模型是 push 还是 pull ?你应该这么回答

程序员小富

Java 编程 程序员 分布式 nacos

今天,「浪潮云说」直播间开讲啦!

浪潮云

云计算

并发王者课-铂金7:整齐划一-CountDownLatch如何协调多线程的开始和结束

MetaThoughts

Java 多线程 并发

并发王者课-铂金8:峡谷幽会-看CyclicBarrier如何跨越重峦叠嶂

MetaThoughts

Java 并发 多线

合肥智慧社区平台建设解决方案,平安小区建设

iOS不行?还是个人能力有限?

ios 程序员 IT 编程之路

一文讲懂Hive高可用、HiveServer2高可用及Metastore高可用

白程序员的自习室

数据仓库 7月日更 HiveServer2高可用 Metastore高可用 Hive高可用

Ubuntu Server 20.04安装KVM虚拟机

玏佾

ubuntu 虚拟机 Ubuntu20.04 kvm

DDD笔记

topsion

免费分享学习Java框架Netty的优秀图书

Java入门到架构

Java 书籍推荐

涨薪50%,从小厂逆袭,坐上美团L8技术专家(面经+心得)

Java 编程 程序员 面试

Flink 的底层API

五分钟学大数据

flink 7月日更

数字化转型提升太平洋保险风险治理能力

数据湖洞见

大数据

聊聊数据仓库中维度表设计的二三事

云祁

数据仓库 维度建模 7月日更

并发王者课-铂金6:青出于蓝-Condition如何把等待与通知玩出新花样

MetaThoughts

Java 多线程 并发

Rust从0到1-Cargo-安装来自Crates.io的程序

rust cargo install

不愧是阿里内部“SpringCloudAlibaba学习笔记”竟然在GitHub霸榜月余

Java 编程 架构 微服务

Serverless 崛起背后的五大挑战

Serverless Devs

Serverless

《持之以恒的从事运动》二

Changing Lin

CDH安装搭建(一)

大数据技术指南

CDH 7月日更

为什么nginx主机的io使用率会100%?

BUG侦探

nginx proxy_buffering docker镜像

数字经济时代,国家与国家的核心竞争力就是算力

CECBC

Java开发从二面被拒到收割阿里架构offer,我花了一年时间,复盘成功经历!

Java架构追梦

Java 阿里巴巴 架构 offer 成长笔记

iOS开发 · iOS音视频开发 - ARKit 教学:如何搭配SceneKit来建立一个简单的ARKit Demo

iOSer

ios ios开发 ARKit iOSAR.

论文解读丨文档结构分析

华为云开发者联盟

模型 文档 文档结构分析 分割 文档结构

CloudQuery 使用教程 No.4 数据查询(下)

BinTools图尔兹

dba 数据库管理工具 国产数据库 运维开发

阿里P8耗时半年总结的Java核心面试知识,助我轻松拿下蚂蚁offer

Java 程序员 面试 java编程 java技术宅

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