从十个方面深入理解MongoDB

  Serendip是个社交音乐服务,用作好友间的">音乐分享。基于“人以类聚”这个原因,用户有很大的几率在好友那发现自己喜欢的音乐。Serendip基于AWS构建,使用了的堆栈包括Scala(以及一些Java)、Akka(用以处理并发性)、Play框架(用于Web和API前端)、MongoDB以及Elasticsearch。

  堆栈的选择

  Serendip面临最大的挑战就是刚开始就需要处理大量数据,因为Serendip的一大特性就是从Twitter或者其他音乐服务上收集音乐相关信息。因此,在选择技术堆栈时,首要考虑的问题就是扩展性。

  1. JVM

  JVM非常适合Serendip的系统特性,同时它的性能也得到许多实践验证,选用它还很大程度上归结于许多开源系统都可以使用本地客户端。

  2. Scala、Akka及Play框架

  着眼JVM生态系统,Scala这种新式编程语言就非常突出了,同时Scala还可以与Java保持良好的互操作性。之所以选择Scala,Akka这个适合流处理的基础设施框架也占了很大一部分因素。在2011年服务开始构建时,Play web框架才刚变得流行,可靠性也才初见端倪,那时候这些技术都是非常前沿的,不过值得兴奋的是,Scala和Akka在2011年底合并成了Typesafe,而Play也在不久后合并了进来。

  3. MongoDB

  选择MongoDB的原因许多,比如对开发者友好、易于使用、特征集和可扩展性(使用自动分片)。然而,我们很快就发现,应用程序的数据使用和查询方式需求在MongoDB上建立大量索引,这样一来,系统将很快遭遇性能和内存瓶颈。因此,我们改变了MongoDB的使用策略——继续使用MongoDB作为主要的键值文档存储,同时还利用其原子增量支撑几个需要计数器的功能。

  在更换使用策略后,MongoDB表现的非常稳定。同时,MongoDB还有1个易维护的优点,虽然很大一部分原因在于一直避免使用分片和只使用了单一的副本集(MongoDB的分片架构确实非常复杂)。

  4. Elasticsearch

  为了更好的查询数据,我们需要一个具有搜索能力成熟的系统。在所有可能的开源搜索解决方案中,Elasticsearch是无疑面向云解决方案中最具扩展性的一个。通过动态索引模式及多种搜索和分类的可能性,Elasticsearch让我们看到了支撑很多特性的可能,无疑问的,它成为了系统架构中的一个核心组件。

  对于MongoDB和Elasticsearch的维护没有使用托管方案,这主要基于两个原因:首先,希望拥有两个系统的绝对控制,我们不期望将升级或者降级假手于人;其次,需要处理的数据量决定使用EC2将比自己托管贵得多。

  系统的统计

  Serendip的“pump”每天处理大约500万条信息,即处理来自Twitter、Facebook或其他系统的数据。这些信息经过一系列的“filter”(从其它的服务上抓取并处理音乐链接,比如YouTube、Soundcloud、Bandcamp等),并为这些信息加上元数据。pump和filter在系统中扮演的角色类似Akka,整个过程由一个专门的m1.large EC2实例支撑;因此,它可以按需的进行扩展,并通过Akka的remote actors将负载分配到集群处理。

  从这些数据中,系统大约每天可以获得85万条有效信息,这些信息中包含了相关的音乐链接。所有信息都会在Elasticsearch中进行索引,同时MongoDB中也会如此,用于备份和计数。因为每条信息都会修改几个对象,Elasticsearch的速度大约在每秒40个左右。

  在Elasticsearch中,信息(tweet和post)的索引按月进行,每个月大约包含2500万条信息,并且拥有3个分片。集群运行了4个节点,每个都建立在m2.2xlarge实例上,还会拥有一个m1.xlarge副本。

  Feed的建立

  在feed设计时,我们期望它是动态的并且记录了用户行为和输入。如果一个用户将“rock-on”标注到1首歌曲上,或者将“airs”打到某个艺术家上,我们希望这个行为在feed中立刻被反映。如果用户对某个艺术家比较无爱,那么以后将不会给他推荐这首歌。

  我们同样希望这个feed整合了多个资源,比如朋友的共享、喜欢艺术家的作品以及那些具有相同品味人们的推荐。这就意味着常用的“fan-out-on-write”方法将并不适合,服务需要一个更实时feed系统的构建方法,充分利用起从用户那收集的信息,而Elasticsearch的一组特性让一切成为可能。

  Feed的算法整合了几种策略,它会动态调整不同资源的比率,当然每个策略都会重点考虑用户最近的行为和输入。策略的整合会被转换成实时数据上的不同查询,这些数据会不停的被Elasticsearch索引。鉴于这些数据的实时性以及索引的按月建立,系统只需要查询所有数据中的很小一部分。

  幸运的是,Elaticsearch对这样的搜索支撑得非常好。同样它还提供了架构扩展的一个途径——通过增加分片数量,搜索可以通过增加更多的副本和物理节点进行扩展。

  “music soulmates”的寻找过程同样是Elasticsearch的充分应用,作为不间断社交流处理的一部分,系统会为社交网络用户计算它所收集中被共享最多的艺术家。

  每当Serendip的用户发射一个信号(不管是airing音乐还是与feed交互),都会引起一次“music soulmates”的重计算,算法依赖于喜爱艺术家列表(会被经常修改)重新匹配具有共同口味的用户,当然类似人气、被分享次数这些数据也会被考虑进去。同时,系统还会使用另一套算法来过滤垃圾推送者和异常值。

  经过长时间的生产环境测试,我们发现整个系统运行的非常平稳,同时也不需要去考虑附加的系统来运行更加复杂的集群或者推荐算法。

  监视和部署

  Serendip使用ServerDensity进行监控和提醒,ServerDensity是个付费服务,原生提供了MongoDB和服务器的监视。这个工具在系统内部得到了大量使用,通过自定义指标来显示内部系统的统计。

  使用内部统计收集机制收集系统内每个行为的事件,并将它们保存在MongoDB集合中。定时作业每分钟都会从MongoDB中读取这个数据。这样一来,操作数据的同时,ServerDensity还起到了监控Elaticsearch和报警的作用。

  服务器和部署的管理依赖于Amazon Elastic Beanstalk,Elastic Beanstalk是AWS定制PaaS解决方案,非常易于开始。虽然它并非完全意义上的PaaS,但是基础功能足以满足一般的用例需求。它提供了简易的自动扩展配置,同时还可以通过EC2来完全访问。

  应用程序的建立依赖于EC2上的Jenkins实例,Play网络应用程序被打包成一个WAR,通过post-build脚本将WAR推送给Elastic Beanstalk作为一个新应用程序版本。新版本不会自动地部署给服务器,必须通过手动完成,通常在阶段性的测试后部署到生产环境。

  经验总结

  下面总结了Serendip打造过程中的几个关键要素:

  1. 知道如何进行扩展。可能并不是第一天就需要扩展,但是需要清楚系统中每个部分的组件都可以扩展以及能扩展到什么程度,一定要给自己一定的时间进行扩展。

  2. 准备好应对峰值。特别是程序打磨的初期阶段,保留足够的空间以应对突发负载或者进行快速扩展。

  3. 选择一门不会拖你后腿的语言。确保语言具备你期望使用技术的本地客户端,或者至少是积极维护的,不要让你的应用程序卡在库的更新上。

  4. 相信炒作。你期望的技术必然是长久存在的,一个响亮的,具备活跃社区并且评论不断的技术恰恰证明了它的活力。

  5. 不要太相信一些争辩。多查一些该技术的热门评论,它可以让你知道技术的弱点所在。但是也别太在意它们,因为人们在失望时的情绪是非常激动的。

  6. 拥有足够的兴趣。选择一门让你兴奋的技术,这才能让你保持充足的动力。

  以“ 云计算大数据 推动智慧中国 ”为主题的 第六届中国云计算大会 将于5月20-23日在北京国家会议中心隆重举办。产业观察、技术培训、主题论坛、行业研讨,内容丰富,干货十足。票价优惠,马上 报名 !

时间: 2024-08-03 09:31:59

从十个方面深入理解MongoDB的相关文章

深入浅出理解MongoDB的设计与实现

本文来自中生代技术群talk show"深入浅出理解MongoDB的设计与实现"总结稿.MongoDB是NoSQL的一种,它是面向文档存储.但是为什么使用MongoDB呢? 以MongoDB为代表的NoSQL与传统的关系型数据库存储有何不同呢?本文精彩不容错过. MongoDB是NoSQL的一种,它是面向文档存储.为什么使用MongoDB?这要先从大数据说起,其中一个经典问题就是从互联网上抓数据.从互联网上我们能抓取大量的数据,那么就面临着存储,更新,查找,错误处理等问题.概括而言就是

深入理解MongoDB分片的管理_MongoDB

前言 在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集.分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量. 数据集被拆分成数据块(chunk),每个数据块包含多个do

MongoDB实战(1)MongoDB安装与存储结构

一.linux平台的安装 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz tar -zxvf mongodb-linux-x86_64-2.4.8.tgz #创建数据存放目录和日志目录 /data/db /data/log/mongo.log #启动mongod服务进程 --fork后台运行 /mongodb/bin/mongod --dbpath=/data/db --logpath=/data/log/m

自然语言理解(Natural Language Understanding)

1. 引言       Siri,Cortana,Google Now,小冰,度秘,随着技术的进步和自然人机交互需求的扩大,个人智能助理渐渐成了各大巨头争夺的下一个入口.这些智能助理尽管能力有大有小,但有一个共同特点--用户能通过"自然语言"与其交互,这比起传统的用关键词进行搜索的方式,显然是一个不小的进步.比如,当你说"订一张明天北京去杭州的机票,国航头等舱"时,一般的搜索引擎会给出如下的网页列表: 而我们的个人智能助理能直接给出你期望的答案: 要想从"

Redis、Memcache和MongoDB的区别

1.Memcached Memcached的优点: Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右).适用于最大程度扛量. 支持直接配置为session handle.Memcached的局限性: 只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型. 无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失. 无法进行数据同步,不能将MC

mongoDB CRUD特性介绍

mongoDB以类JSON的方式,即BSON来组织和封装数据,实现了非机构化数据的存储.那对于其数据的查询,增删改,则由所谓的CRUD方法来实现,相当于关系型数据库的DQL,DML.CRUD特性基本上与SQL数据库的操作命令有很多相似的地方,也有一些差异.本文简要描述CRUD,便于快速认识及理解mongoDB的日常操作. 预备热身 Linux下快速安装MongoDB Windows平台下安装MongoDB mongoDB 启动与停止 mongo shell连接到mongoDB及shell提示符下

centos 6.4系统中mongodb安装配置笔记

一.MongoDb是什么 MongoDB是一个面向文档的数据库系统,与我们平常使用的关系型数据库mysql不同.他使用C++编写,不支持SQL,但有自己功能强大的查询语法.MongoDB使用BSON作为数据存储和传输的格式.BSON 是一种类似JSON的二进制序列化文档,支持嵌套对象和数组.MongoDB很像MySQL,document对应MySQL的 row,collection对应MySQL的table.是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/

I have a dream

我们本学期学了数字图像处理,上机实验使用C语言,内容都相对比较简单.唯一复杂一点的也就是如何从BMP文件里读取图像信息,反倒是真正与课程相关的算法处理却像做加减法一样很简单.我觉得我们的课程安排上有很多不合理的地方,往往在学一门课程时需要很多前置知识.比如以前学"计算机图形学"是要求上机用C++&OpenGL,结果很多同学上机不成功不是因为课堂内容不理解,纯粹是因为OpenGL不晓得怎么使用. 我一直憧憬着我们的计算机能平民化.大众化,降低大家的学习.使用门槛.如果我们学习时,

想扩展你的数据库吗?那么先了解一下I/O

作为一名http://www.aliyun.com/zixun/aggregation/6434.html">软件开发者,我们非常看重那些抽象化的东西.API越简单,对我们越有吸引力.辩证地讲,MongoDB最大的优势就是"优雅"的API和它的敏捷性,这让开发者的编码过程变得异常的简单. 但是,当MongoDB涉及到大数据可扩展性问题时,开发者还是需要了解一下它的底层,弄明白那些潜在的问题,然后才能快速地进行解决.如果不理解,最终可能会选择一个低效的解决方案,而且浪费了