无情 @ Sat Sep 12 17:02:17 CST 2015 阅读(2120)
mongodb


目前由于新公司项目发展需要使用MongoDB,所以再次重温下MongoDB。虽然以前在项目中使用过,知识长时间不用就会忘记。


一:什么是MongoDB


 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:


面向集合存储,易存储对象类型的数据。

模式自由。

支持动态查询。

支持完全索引,包含内部对象。

支持查询。

支持复制和故障恢复。

使用高效的二进制数据存储,包括大型对象(如视频等)。

自动处理碎片,以支持云计算层次的扩展性

支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。

文件存储格式为BSON(一种JSON的扩展)

可通过网络访问



二:安装

环境和软件版本:centos6.5  mongodb-linux-x86_64-3.0.6.tgz


安装mongodb前需要进行安装openssl


#yum install -y openssl-devel openssl


下载 : wget  http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz


解压:tar  zxvf  mongodb-linux-x86_64-3.0.6.tgz  


重命名 mv mongodb-linux-x86_64-3.0.6.tgz   mongodb  本人的安装目录是/usr/local/mongodb


创建 db 和logs 2个文件  如图

启动脚本


./mongod --dbpath /usr/local/mongodb/db  --logpath /usr/local/mongodb/logs/mongodb.log --journal --fork

说明成功

启动命令常用选项说明:

    --dbpath 指定数据库的目录。

    --port 指定数据库端口,模式是27017。

    --bind_ip 绑定IP。

    --derectoryperdb为每个db创建一个独立子目录。

    --logpath 指定日志存放目录。

    --logappend 指定日志生成方式(追加/覆盖)。

    --pidfilepath 指定进程文件路径,如果不指定,将不产生进程文件。

    --keyFile 集群模式的关键标识

    --journal 启用日志

    --nssize 指定.ns文件的大小,单位MB,默认是16M,最大2GB。

    --maxConns 最大的并发连接数。

    --notablescan 不允许进行表扫描

    --noprealloc 关闭数据文件的预分配功能

    --fork 以后台Daemon形式运行服务

    更多的选项利用 mongod --help 进行查看


相关操作命令不在这里结束了

  


 

三:mongodb原来简介

1:BSON

在MongoDB中,文档是对数据的抽象,它被使用在Client端和Server端的交互中。所有的Client端(各种语言的Driver)都会使用这种抽象,它的表现形式就是我们常说的BSON(Binary JSON )。

BSON是一个轻量级的二进制数据格式。MongoDB能够使用BSON,并将BSON作为数据的存储存放在磁盘中。

当Client端要将写入文档,使用查询等等操作时,需要将文档编码为BSON格式,然后再发送给Server端。同样,Server端的返回结果也是编码为BSON格式再放回给Client端的。


2:写入协议

Client端访问Server端使用了轻量级的TCP/IP写入协议。这种协议在MongoDB Wiki中有详细介绍,它其实是在BSON数据上面做了一层简单的包装。比如说,写入数据的命令中包含了1个20字节的消息头(由消息的长度和写入命令标识组成),需要写入的Collection名称和需要写入的数据。


3:数据文件

在MongoDB的数据文件夹中 由构成数据库的所有文件。每一个数据库都包含一个.ns文件和一些数据文件,其中数据文件会随着数据量的增加而变多。所以如果有一个数据库名字叫做foo,那么构成foo这个数据库的文件就会由foo.ns,foo.0,foo.1,foo.2等等组成。


数据文件每新增一次,大小都会是上一个数据文件的2倍,每个数据文件最大2G。这样的设计有利于防止数据量较小的数据库浪费过多的空间,同时又能保证数据量较大的数据库有相应的空间使用。


MongoDB会使用预分配方式来保证写入性能的稳定(这种方式可以使用–noprealloc关闭)。预分配在后台进行,并且每个预分配的文件都用0进行填充。这会让MongoDB始终保持额外的空间和空余的数据文件,从而避免了数据增长过快而带来的分配磁盘空间引起的阻塞。


4:名字空间和盘区

每一个数据库都由多个名字空间组成,每一个名字空间存储了相应类型的数据。数据库中的每一个Collection都有各自对应的名字空间,索引文件同样也有名字空间。所有名字空间的元数据都存储在.ns文件中。

名字空间中的数据在磁盘中分为多个区间,这个叫做盘区。在下图中,foo这个数据库包含3个数据文件,第三个数据文件属于空的预分配文件。头两个数据文件被分为了相应的盘区对应不同的名字空间。

上图显示了名字空间和盘区的相关特点。每一个名字空间可以包含多个不同的盘区,这些盘区并不是连续的。与数据文件的增长相同,每一个名字空间对应的盘区大小的也是随着分配的次数不断增长的。这样做的目的是为了平衡名字空间浪费的空间与保持某一个名字空间中数据的连续性。上图中还有一个需要注意的名字空间:$freelist,这个名字空间用于记录不再使用的盘区(被删除的Collection或索引)。每当名字空间需要分配新的盘区的时候,都会先查看$freelist是否有大小合适的盘区可以使用。


5:内存映射存储引擎

MongoDB目前支持的存储引擎为内存映射引擎。当MongoDB启动的时候,会将所有的数据文件映射到内存中,然后操作系统会托管所有的磁盘操作。这种存储引擎有以下几种特点:


* MongoDB中关于内存管理的代码非常精简,毕竟相关的工作已经有操作系统进行托管。


* MongoDB服务器使用的虚拟内存将非常巨大,并将超过整个数据文件的大小。不用担心,操作系统会去处理这一切。


* MongoDB无法控制数据写入磁盘的顺序,这样将导致MongoDB无法实现writeahead日志的特性。所以,如果MongoDB希望提供一种durability的特性(这一特性可以参考我写的关于Cassandra文章:http://www.cnblogs.com/gpcuster/tag/Cassandra/),需要实现另外一种存储引擎。


* 32位系统的MongoDB服务器每一个Mongod实例只能使用2G的数据文件。这是由于地址指针只能支持32位。





四:mongodb结合java开发demo


1:API版本 mongo-java-driver-3.0.3 

2:maven添加jar

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.3</version>
</dependency>


3:demo代码

    MongoClientURI uri = new MongoClientURI("mongodb://127.0.0.1:27017/local",
                                                MongoClientOptions.builder().cursorFinalizerEnabled(false));
        MongoClient client = new MongoClient(uri);
        MongoDatabase db = client.getDatabase("demodb");
        MongoCollection<Document> users = db.getCollection("tabName");
        Document doc = new Document();
        doc.append("user", "zhp");
        doc.append("password", "11");
        doc.append("createtime", new Date());
        users.insertOne(doc);
        FindIterable<Document> iterable = db.getCollection("tabName").find();
        for (Document document : iterable) {
            System.out.println(document.get("user"));
        }



4:相关文档参考 

http://docs.mongodb.org/ecosystem/drivers/

http://api.mongodb.org/java/current/





五:mongodb项目实战场景

本人项目使用场景主要用在一下几个方面

1:APP端打点产生的结果

2:系统日记

3:语音通话记录

4:发生短信记录

5:其它相关大量数据的记录

实例代码后期开放出来