文档章节

MongoDB在航空公司销售数据分析系统中的应用

AlvaYi
 AlvaYi
发布于 2015/04/10 19:10
字数 2589
阅读 81
收藏 5
点赞 0
评论 0

NoSQL在近几年发展得如火如荼,在经过一番研究选型之后,其中的代表产品MongoDB就被成功引入到我们新一版本的销售数据分析系统中了,它的使用,化解了我们在使用MySQL时需要自己想办法去解决的一些难题,在学习和使用的过程当中,有一些欣喜和心得,希望分享给大家。

先说我们系统的背景,我们的系统内部代号为“棱镜”,并非附庸风雅,在斯诺登爆出美国的“棱镜门”之前我们就开始使用了;就如其名称所暗示的:就像棱镜分解白光一样,我们的系统尝试从旅客订票信息,销售采样数据,火车余票数据中挖掘出对航空公司生产经营有用处的信息。一部分是对历史数据的分析用来更好的改善我们的产品和销售策略,或者发掘高端客户;一部分是要对目前销售情况,客流情况,历史同期情况,对未来航班安排进行部署和调整以及应对市场情况做出销售舱位和票价的调整,使得营销决策有数据作为依托,尽力使收益最大化。虽然我们只是一家只有22架飞机的分公司,我们也只保留了从我们属地机场关联的近几年的数据,但是存储了大概有5000万旅客信息;多种类型的销售采样数据差不多5亿条,数据库文件占用了60G的磁盘空间。对全国航线的销售数据每隔几分钟一次的快照监测,数据的增量不可小看;第一版很简单的就是使用MySQL的主从复制,读写分离,随着数据量的增加,除了响应有所延迟之外,其实还是可以接受的。这点数据量,跟别人真正的海量数据相比,还不算多,然而小产品有自己的大梦想,作为中国最大的航空公司,如果我们的产品有一天可以在整个公司用起来,面对着20倍以上的数据增量,我们的系统还能否承受?所以注意到查询性能的延迟之后,在新版本中,我们决定引入当前发展很快的NoSQL数据库,考虑到MongoDBSQL查询如聚合查询等一些特性的支持,它成为了我们的首选。

话说任何一个成功的产品要么是解决了用户的痛点,要么是触动了用户的G点,那么作为NoSQL优秀产品之一的 MongoDB与传统的关系型数据库相比它有哪些优势呢?

第一,    动态数据模型

传统的开发模式一般是从数据库表设计开始的,这种开发模式有一定的弊端,其中最大的矛盾就是应对快速变化的需求时那种束缚感。为了性能考虑,根据业务查询数据的需要,对索引和冗余数据字段的设计也不一样,而先设计数据表的这种方法无法预计到将来业务的变化;特别是对于我们在开发中遇到的情况,四个人的小型开发团队,不断变化的业务需求,有些甚至是实验性的探索性的功能,则对于产品的快速迭代带来了很多的问题,增加一个索引动辄几十分钟的情况经常遇到,使敏捷开发变得不敏捷。而MongoDB带来的几乎是随时,无成本的数据表结构的修改能力,可以根据数据查询的需要调整到最佳的存储结构,无需瞻前顾后。无需过多的在数据冗余和性能之间权衡取舍,无需在各种范式之间纠结踌躇,Just do it,快速迭代,快速交付,快速迁移。它还给我们在设计中带来了更加直观的思维模式,以文档存储为单位,不要过多去想结构化的数据如何变成行列化,如何处理各个表之间的关联关系,是否会造成1+N查询,是否需要使用JOIN来避免,这在数据存储方面带来的思维模式的变化就如同面向对象编程和面向过程编程对比的感觉一般。另外一个值得一提的地方,它的这种基于JSON文档格式存储的数据模型,让我们在项目进行过程中有一个很取巧的地方,我们有一些数据源接口,返回的是JSON格式的数据,直接把返回结果存储到MongoDB中即可,再也无需像以前那样要么组织成SQL语句,要么组织成实体对象再存储了,这让开发过程变得流程而自然。

第二,    SQL的查询特性和支持Map-Reduce功能

在接触MongoDB之前,NoSQL类的数据库给我的模糊印象,似乎停留在只是以key-value存储的内存数据库而已,最多考虑用它提供缓冲层,从未去想有一天它可以替代传统的关系数据库出现在我们的应用中。

MongoDB提供了对传统SQL查询方式的兼容特性,支持ORANDGreaterThan等等一系列除连表查询之外的完整查询功能的映射;它可在任意文档属性上快速的建立索引 ,所以查询的速度很快。

对于一个数据分析应用而言,不得不对数据库的聚合查询能力提出要求,MongoDBAggregation功能满足了我们的所有需求,对countdistinctgroupproject这些常用的数据库查询操作都支持;另外还有map-reduce功能,相比Aggregation,提供了更灵活的查询处理数据以及组织返回结果的能力。

第三,    与生俱来的高可用,数据复制和自动分片支持

    传统关系型数据库诞生有几十年了,在它诞生之初根本无法预料到如今应用的需求和发展程度,但是MongoDB之类的新生代数据库就可以从一开始就考虑大数据量,大并发,高可用这些我们在平常应用架构设计中需要着力去解决的问题。在我们使用MySQL的时候,我们经常会使用主从复制来实现高可用,使用诸如mysql-proxy之类的实现读写分离;或者精心设计应用程序分表分库来缓解大数据量和高并发的压力。而在MongoDB身上,这些都成为了标配,再无需组合各种技术和方案甚至奇技淫巧来达到目的,使用MongoDB只需几个配置文件,写个脚本启动即可,其他的专注使用即可。

第四,    为现代应用特别设计的功能特性。

如果说对SQL查询的兼容方便了传统数据库用户向MongoDB的迁移,那么MongoDB中的一些特别设计的特性就是会让你欣喜的感觉中了彩蛋。在我们的应用中,用到了几个特性,我觉得对于我们来说很有用。

(1)      Capped Collection方便了日志的存储和自动清除

在我们的应用中,高频度的数据采集会产生大量的日志,这些日志信息在一定时期内是需要的,但是也会占用很多的空间,之前的解决方案是使用一个cron脚本定期对日志表进行清理。而Capped Collection直接考虑了这种需求,它是一个固定大小的集合,支持快速的插入和查询操作,容量满了之后,直接复写旧的文档实现空间循环利用,这是不是和应用程序日志的存储需求完全一致啊?是的,Capped Collection非常好的切合了这以需求。

(2)      基于地理位置的查询

在地理位置上,比如我们应用中要考虑机场和火车站的可选择性,那么如何定义“附近”呢?MongoDB提供的基于地理位置查询的功能,很好的解决了我们的问题,原本以为要考虑的通过经纬度的复杂计算,MongoDB代劳了。

(3)      GridFS满足了文件存储的高可用和实时备份需求

在遇到集群中需要文件存储的场景时,我们通常通过网络共享存储来解决,作为分公司,我们没有磁盘阵列这种高可靠性的共享存储设备,怎么解决呢?直接使用一台服务器的提供NFS访问么?那么这实际上还是一个单点故障,我们以前的做法是利用Linux内核的inotify特性,检测文件系统变化,然后近乎实时的把文件系统的变化复制到另外一个节点中备份。而MongoDB内置的GridFS功能,直接利用其数据库的高可用能力帮助我们实现了我们对文件存储实现高可用的需求,简单直接,作为开发人员,我无需再过多考虑。

第五,    快速上手

MongoDB提供了完善的文档,支持各个主流平台,无论MacLinuxWindows,无论是服务端还是客户端,都提供了开箱即用的特性;基于JSON的查询一看就能让人明白。所以在项目中引入时,团队成员只花一天时间就可以掌握基本的使用的方法,这些方便使用的特性,可以让学习成本降得很低。

总之,MongoDB所体现出来的特性以及它在一些生产应用充分体现了它的优越性,对于我们的架构师和开发人员而言,是时候拥抱新一代的数据库了!


© 著作权归作者所有

共有 人打赏支持
AlvaYi
粉丝 4
博文 3
码字总数 7331
作品 0
深圳
部门经理
大数据分析挖掘学习方向?数据分析师的就业前景怎么样?

加米谷数据分析挖掘课程明细,从理论到云端实操环境到项目实战,手把手教您从0掌握数据分析与挖掘技术,带您走进数据时代。 第一阶段(python基础) python入门:1、Python版本特性介绍2、P...

加米谷大数据
04/17
0
0
阿里专家视频课限时抢!精讲+实操12节课学懂MongoDB数据库!

想要学习MongoDB却不知道如何入门? 漫天的培训课程却无一讲解实战案例? 云栖社区联手阿里云大学独家出品—— 阿里云MongoDB技术负责人、MongoDB中文社区联席主席联合操刀 12期精讲+实操,全...

a独家记忆
07/12
0
0
PHP程序员应了解MongoDB的五件事

2010年应该被人们记住,因为SQL将在这一年死去。这一年关系数据库行将就木,这一年开发者发现他们再不需要长时间辛苦的构造列或者表格来存放数据。 2010年将是文档型数据库的起始年。尽管这样...

五味格子
2011/05/11
0
0
面对Schema free的MongoDB,如何规范你的schema

作为近年最为火热的文档型数据库,MongoDB受到了越来越多人的关注,但是由于国内的MongoDB相关技术分享屈指可数,不少朋友都在抱怨无从下手。本期【DBA+社群】联合发起人周李洋为大家分享面对...

周李洋
2016/01/15
0
0
MongoDB之Hadoop驱动介绍

MongoDB之Hadoop驱动介绍 ------------------------ 1. 一些概念 Hadoop 是一套Apache开源的分布式计算框架,其中包括了分布式文件系统DFS与分布式计算模型MapReduce,而MongoDB是一个面向文...

李长春
2011/09/02
0
1
MongoDB 4.0 RC 版本强势登陆

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前4.0第一个RC版本已经发布,本文将介绍 MongoDB 4.0 核心的一些新特性。...

张友东
05/30
0
0
Redis,Memcache,mongoDB的区别

从以下几个维度,对redis、memcache、mongoDB 做了对比,欢迎拍砖 1、性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2、操作的便利性...

Surjur
2014/12/02
0
0
MongoDB在windows下安装配置

安装文件:官方网站 http://www.mongodb.org/downloads 选择对应系统的文件下载。 一、解压缩文件。 将压缩包解压,在D盘创建文件夹MongoDB,将压缩包中所有的.exe文件拷到D:MongoDB文件夹中。...

moz1q1
2014/08/12
0
0
从以下几个维度,对redis、memcache、mongoDB 做了对比

1、性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2、操作的便利性 memcache数据结构单一 redis丰富一些,数据操作方面,redis更好一...

安安-Anan
2015/08/10
0
0
MongoDB 4.0 首个 RC 版发布,支持多文档事务

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前 4.0 第一个 RC 版本已经发布。 开始体验 MongoDB 4.0 RC:下载地址 ...

局长
06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MyBatis源码解读之延迟加载

1. 目的 本文主要解读MyBatis 延迟加载实现原理 2. 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延...

无忌
10分钟前
0
0
javascript 类变量的实现

代码如下: function echo(){ for(let i=0;i<arguments.length;i++) console.log(arguments[i]);}function extend(o, p){for (prop in p) {o[prop] = p[prop]}retur......

backbye
14分钟前
0
2
编程语言对比分析:Python与Java和JavaScript(图)

编程语言对比分析:Python与Java和JavaScript(图): 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?[图] 编程语言生而为何? 我们人类从原始社会就是用语言表达自己,互相沟通...

原创小博客
22分钟前
0
0
Akka构建Reactive应用《one》

看到这Akka的官网,描述使用java或者scala构建响应式,并发和分布式应用更加简单,听着很高级的样子,下面的小字写着消息驱动,但是在quickstart里面又写容错事件驱动,就是这么钻牛角尖。 ...

woshixin
34分钟前
0
0
ffmpeg源码分析 (四)

io_open 承接上一篇,对于avformat_open_input的分析还差其中非常重要的一步,就是io_open,该函数用于打开FFmpeg的输入输出文件。 在init_input中有这么一句 if ((ret = s->io_open(s, &s-...

街角的小丑
35分钟前
0
0
String,StringBuffer ,StringBuilder的区别

不同点 一、基类不同 StringBuffer、StringBuilder 都继承自AbStractStringBuilder,String 直接继承自 Object 2、底层容器“不同” 虽然底层都是字符数组,但是String的是final修饰的不可变...

不开心的时候不要学习
51分钟前
0
0
nodejs 文件操作

写文件code // 加载文件模块var fs = require("fs");var content = 'Hello World, 你好世界!';//params 文件名,内容,编码,回调fs.writeFile('./hello.txt',content,'utf8',function (er......

yanhl
53分钟前
0
0
SpringBoot mybits 查询为0条数据 但是在Navicat 中可以查询到数据

1.页面请求: 数据库查询: 2018-07-16 17:56:25.054 DEBUG 17312 --- [nio-9010-exec-3] c.s.h.m.C.selectSelective : ==> Preparing: select id, card_number, customer_id, customer_nam......

kuchawyz
今天
0
0
译:Self-Modifying cod 和cacheflush

date: 2014-11-26 09:53 翻译自: http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code Cache处在CPU核心与内存存储器之间,它给我们的感觉是,它具......

我叫半桶水
今天
0
0
Artificial Intelligence Yourself

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流...

孟飞阳
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部