本篇文章直接研究 mongodb的基本部署方案以及后续在 crm(crm是之前参与的一个数据平台项目) 平台中使用的可行性以及一些实战案例。
【Mongodb是什么】
mongodb 由 C ++写就,其名字来自humongo us这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source,schema-free, document-oriented database 。 MongoDB 的主要目标是在键/ 值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS 系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json 的 bjson格式,因此可以存储比较复杂的数据类型。 Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
关于概念与特点不说太多,大家可以去线上看,直接进入实战主题。
【Mongodb的安装与部署】
1.
a)
2.
a)
b)
3.
a)
./mongod
b)
尝试安装 libstdc++失败,可能需要和 infobright 一样需要 redhat 4+ 的版本。到时候上线是个问题
4.
a)
b)
【Mongodb初探险】
5.
a)
b)
c)
d)
6.
a)
Show dbs
Use
b)
c)
d)
db. collection 名字 .find()查看所有记录
db. collection 名字 .findOne()查看一条记录
e)
f)
db.collection 名字.getIndexes()
db.collection 名字.getIndexKeys()
db. collection 名字.totalIndexSize()
【Mongodb的JAVA实战】
1.
2.
3.
4.
5.
返回单条记录
返回多条记录,那么则会返回一个 DBCursor 对象,类似于 jdbc 中的resultset 对象
6.
注意到更新是以新增列的方式进行的,也就是说它不会改变原有的记录,但是会以新增列的形式加入到该记录中;这个特性在 mysql 中是无法支持的,因为对动态加列的结构有着重大的意义。
【Mongodb在CRM中的应用可行性探讨】
1.
目前CRM 在从LOG平台导入数据时,主要有两种类型
一,纯数值型的数据:针对这种类型的数据目前CRM的一体化框架可以支持多值的录入,比如查看ting 的pv、cookie 、UV等可以在一个任务中配置完成。但缺点是后期扩展性较差,比如需要添加60S字段的话,则可能需要修改表结构。采用mongodb的话,由于它的数据存储很方便支持扩展,因此不存在这个问题
二,文件类型数据:在crm普遍存在一种数据任务是录多个项目的不同属性值。如查看ting 不同页面的pv、cookie 等。在log平台中,统计项的存在是不同页面的pv 是一个统计项,cookie也是一个统计项;这样子CRM在入库时必须分开录入,同时在做转换的时候也必须做多种Union(相当于有几个项就有几个Union )。
2.
使用mongodb键值对存储的特性,针对数值型字段,可以以< 日期+表名称> 做为key,针对文件类型的字段,可以以< 日期+表名+ 项目> 作为key。同时参考上述的更新数据方法,即当log统计项有新数据生成的时候,即往表中添加新的数据。
3.
从mongodb 对java的支持来看实现成本较低,具体实现相当于在build任务中添加一个新的任务类型,在transfer任务中也添加一个任务类型字段。而具体的业务实现参照一般流程的增删改查操作即可。
【Mongodb分布式部署】
mongodb 在分布式部署上也有着非常好的支持,主要包括
1.
2.
3.
初步调研在分布式部署上的配置成本也很低(相对于mysql 的主从和分区),由于初期试用可以暂不考虑这么多,如果后续真的确认在crm 中使用mongodb,且数据量达到一定程度并影响到性能时候可以考虑扩展。有兴趣的同学也可直接访问 http://www.elain.org/?p=602 查看。