Mongodb实战

本篇文章直接研究 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)         http://www.mongodb.org/downloads 下载,选择合适的版本( linux window 环境,服务器位数等)。本次实战以在 64 linux 服务器安装 mongodb 2.0.4 版本为例,目前版本已经到 2.0.6

2.       解压下载的安装包

a)         tar -xzvf mongodb-linux-i686-2.0.4 .tgz.tar

b)         创建两个目录,分别用于存放数据文件和日志文件

mongodb实战

3.       启动 Mongodb

a)   执行启动命令( dbpath 为数据存放文件夹, logpath 为日志产生文件夹)

./mongod --dbpath=/data/mongodb_data/ --logpath=/data/mongodb_log/mongodb.log --logappend &

b)         目前来看百度提供的默认机器版本不支持 mongodb 安装,提示错误:

尝试安装 libstdc++ 失败,可能需要和 infobright 一样需要 redhat 4+ 的版本。到时候上线是个问题

4.       Mongodb 启动

a)     可以使用netstat -lanp | grep "27017" 或者ps aux | grep mongod 查看当前进程

b)   bin 目录下直接执行 ./mongo 进入数据库,下图显示连接成功

mongodb实战

Mongodb 初探险】

5.       Mongodb 的一些概念

a)         可以将 mongodb 当成一般的数据库来看待

b)         Mongodb 中每个数据库也有多张表,它的表名称叫做 collection

c)         每个 collection 或者说每张表可以存放多个文档,其实也就是多条记录。 Mongodb 中没有列的概念,它是以 BSON( 可以直接理解为 json) 的形式存放在硬盘中的,因此可以无限拓展存储各种复杂型的数据

d)         Mongodb 中没有列的概念,在存储数据时全部以键值对的形式存在,如查看某个 collection 的数据如下,形如 json ,以键值对的形式存在。

mongodb实战

6.       Mongodb 的一些基本操作

a)         查看数据库:

Show dbs    显示数据库

Use  数据库名   进入某一数据库,当此数据库不存在时, mongodb 会自动化创建

b)        新建 collection

            db.createCollection("collection 名字 ");

c)         插入数据:

       db. collection 名字 .insert({_id:"339129_2011-01-09", "userid" : 175, "planid" : 339129, "wordNum" : 2, "showableNum":0})

d)        查询数据:

db. collection 名字 .find() 查看所有记录

db. collection 名字 .findOne() 查看一条记录

     db. collection 名字 .find({_id:” 339129_2011-01-09”});db

e)        更新数据:

     db. collection 名字 .update({"_id":"53198848_1592759_2010-12-31"},{$set:{"lastOffTime":"2010-12-31 14:30:34"}})

f)          查看 collections 中索引的建立情况

db.collection 名字 .getIndexes()  

db.collection 名字 .getIndexKeys()

db. collection 名字 .totalIndexSize()  查看当前 collection 中索引的大小

Mongodb JAVA 实战】

1.       要使用 Java 操作 MongoDB 的话,要到官方网站下载一个驱动包,把包导入后,可以尝试来操作了(记得一定要开着服务器)

2.       配置相应的基本参数

mongodb实战

3.       连接数据库,并取得 test 这个表的操作对象

mongodb实战

mongodb实战

4.       插入数据,如上文所述,在 mongodb 中所有的对象都是以键值对的形式存在,而且可以支持字段的无限扩展,类似于一对多关系。且不同的对象与对象之间的列可以不一样。

mongodb实战

 

5.       查询数据

返回单条记录

mongodb实战

返回多条记录,那么则会返回一个 DBCursor 对象,类似于 jdbc 中的 resultset 对象

mongodb实战

6.       更新数据

注意到更新是以新增列的方式进行的,也就是说它不会改变原有的记录,但是会以新增列的形式加入到该记录中;这个特性在 mysql 中是无法支持的,因为对动态加列的结构有着重大的意义。

mongodb实战

 

Mongodb CRM 中的应用可行性探讨】

1.  背景

目前CRM 在从LOG 平台导入数据时,主要有两种类型

一, 纯数值型的数据:针对这种类型的数据目前CRM 的一体化框架可以支持多值的录入,比如查看tingpvcookieUV 等可以在一个任务中配置完成。但缺点是后期扩展性较差,比如需要添加60S 字段的话,则可能需要修改表结构。采用mongodb 的话,由于它的数据存储很方便支持扩展,因此不存在这个问题

二, 文件类型数据:在crm 普遍存在一种数据任务是录多个项目的不同属性值。如查看ting 不同页面的pvcookie 等。在log 平台中,统计项的存在是不同页面的pv 是一个统计项,cookie 也是一个统计项;这样子CRM 在入库时必须分开录入,同时在做转换的时候也必须做多种Union (相当于有几个项就有几个Union )。

2.  解决方案

使用mongodb 键值对存储的特性,针对数值型字段,可以以< 日期+ 表名称> 做为key ,针对文件类型的字段,可以以< 日期+ 表名+ 项目> 作为key 。同时参考上述的更新数据方法,即当log 统计项有新数据生成的时候,即往表中添加新的数据。

3.  成本

mongodbjava 的支持来看实现成本较低,具体实现相当于在build 任务中添加一个新的任务类型,在transfer 任务中也添加一个任务类型字段。而具体的业务实现参照一般流程的增删改查操作即可。

Mongodb 分布式部署】

mongodb 在分布式部署上也有着非常好的支持,主要包括

1.  主从部署

2.  分片部署(类似于数据表分区,但更加强大)

3.  副本集

初步调研在分布式部署上的配置成本也很低(相对于mysql 的主从和分区), 由于初期试用可以暂不考虑这么多,如果后续真的确认在crm 中使用mongodb ,且数据量达到一定程度并影响到性能时候可以考虑扩展。有兴趣的同学也可直接访问 http://www.elain.org/?p=602 查看。

 

(本文内容由 深圳至善互联 提供)

猜你喜欢

转载自heshenmi.iteye.com/blog/1714574