热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库学习笔记

概念与说明MongoDB介绍MongoDB的名称取自“humongous”(巨大的)的中间部分。于2010年8月5日发布了最新的正式版本v1.6,这是其继1.0、1.2、1.4版本后的第四个主要稳定版本。由10gen公司为其提供商业支持。它是一个开源的、面向文档的数据库,属于nosql数据

概念与说明
MongoDB介绍

MongoDB的名称取自“humongous”(巨大的) 的中间部分。于2010年8月5日发布了最新的正式版本v1.6,这是其继1.0、1.2、1.4版本后的第四个主要稳定版本。由10gen公司为其提供商业支持。它是一个开源的、面向文档的数据库,属于nosql数据库中的一种。(nosql全称是”notonly sql”,是非关系型数据存储的广义定义)。
它可运行在Linux、Windows或OSX平台,支持32位和64位应用并且提供了Java,PHP,Ruby,C#,C++,Javascript等多种语言的驱动程序。
MongoDB特性

MongoDB是一个可扩展、高性能的下一代数据库,由C++语言编写,旨在为web应用提供可扩展的高性能数据存储解决方案。它的特点是高性能、易部署、易使用,存储数据非常方便,主要特性有:

l模式自由,支持动态查询、完全索引,可轻易查询文档中内嵌的对象及数组。

l面向集合存储,易存储对象类型的数据, 包括文档内嵌对象及数组。

l高效的数据存储,支持二进制数据及大型对象(如照片和视频) 。

l支持复制和故障恢复;提供了主-从、主-主模式的数据复制及服务器之间的数据复制。

l自动分片以支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器。
MongoDB结构

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB同样也是由数据库(database) 、集合(collection)、文档对象(document)三个层次组成。 MongoDB里的集合对应于关系型数据库里的表,但是集合中没有列、行和关系的概念,这体现了模式自由的特点。

MongoDB存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。这种数据格式称作 BSON,即“Binary Serialized Document Notation”,是一种类似JSON的二进制序列化文档。

MongoDB使用了内存映射文件进行数据管理,把所有空闲内存当缓存使用,且不能指定内存大小。这既是优点也是缺点:优点?可以最大限度提升性能;缺点?容易受其它程序干扰。

数据空间采用预分配,目的是为了避免形成过多的硬盘碎片。它为每个数据库分配一系列文件,每个数据文件都会被预分配一个大小,第一个文件名字为“.0 ”,大小为64MB,第二个文件“.1”为128MB ,依此类推,在32位模式运行时支持的最大文件为2GB。随着数据量的增加,可以在其数据目录里看到这些不断递增的文件。

MongoDB没有自动递增或序列特性,当BSON对象插入到数据库中时,如果没有提供“_id”字段 ,数据库会自动生成一个ObjectId对象作为“_id”的值插入到集合中作为该文档的主键

(这就避免了其它数据库意外地选择相同的惟一标识符的情况) ,“_id”的值由4字节的时间戳,3字节的机器号,2字节的进程id以及3字节的自增计数组成。当然字段“_id”的值可以手动生成(任意类型都可),只要能够保证惟一性。

每个插入的BSON对象大小不能超过4MB,如果超过4M时需使用 GridFS来储存数据。删除记录后不会释放已分配的空间,换句话说:原记录空间不删除。
MongoDB二进制文件功能

MongoDB的服务器端程序只有两个:

Mongod.exe: MongoDB的主要的数据存储服务程序和配置服务程序。

Mongos.exe:MongoDB的集群路由程序,负责自动分片,用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器,可以将数据库分表存储在集群的各个节点上。

MongoDB的客户端工具有很多,最常用的就是Mongo.exe,它做为对MongoDB的管控程序,可以使用输入命令的方式修改、查询MongoDB的数据和配置。
MongoDB常用命令

lHelp:查看mongodb支持的命令。

ldb.help:查看当前数据库支持哪些方法当前数据库下的表。

ldb.dbname.help():查看当前表collection支持哪些方法。

lshow dbs:列出所有数据库。

luse test:使用数据库test ,即使这个数据库不存在也可以执行,但该数据库不会立刻被新建,要等到执行了insert之类的操作时,才会建立这个数据库。

lshow collections :列出当前数据库的所有文档。

ldb :显示当前数据库。

lshow users :列出用户。

ldb.printShardingStatus() :将当前MongoDB分片的状态打印出来。

ldb.runCommand({ xxxx}) :在当前DB上执行一些命令。

ldb.xxx.stats() :显示当前db的某个collection的状态。

ldb.xxx.find():显示当前db的某个collection的所有内容。

详细的MongoDB的shell命令见:http://www.mongodb.org/display/DOCS/dbshell+Reference
GridFS

MongoDB自带的分布式文件系统GridFS ,可以支持海量的数据存储。

GridFS将文件分块存储,分别将文件的元信息和文件块存入不同的collection,mongoDB提供的GridFS类将文件默认分块大小设置为256K。如果不改变设置,GridFS在存入文件时,将文件块存入db.fs.chunks的collection中,将文件信息存入db.fs.files中。

文件必须的信息有以下字段:

{
“_id” : ,                  // unique ID for this file
“length” : data_number,                 // size of the file in bytes
“chunkSize” : data_number,              // size of each of the chunks.  Default is 256k
“uploadDate” : data_date,               // date when object first stored
“md5″ : data_string                     // result of running the “filemd5″ command on this file’s chunks
}

文件块的信息字段包括:

{
“filename” : data_string,               // human name for the file
“contentType” : data_string,            // valid mime type for the object
“aliases” : data_array of data_string, // optional array of alias strings
“metadata” : data_object,               // anything the user wants to store }

“_id”的类型可以自选,但是默认类型是BSON对象的objectid。

块信息的“files_id”是外键与files集合中的“_id”相关联。

详情可参考:http://www.mongodb.org/display/DOCS/GridFS+Specification
Sharding

一个mongodb集群包括一些shards(每个shard包括一至多个mongod进程),mongos路由进程,一个或多个config服务器。

名词:

Shards : 每一个shards包括一个或多个存储数据的mongod进程,典型的每个shards开启多个服务来提高服务的可用性。这些mongod进程在shards中组成一个复制集(replica pairs)。

Chunks: Chunks是一个集合中的一个数据范围,(collection,minKey,maxKey)描叙一个chunks,它介于minKey和maxKey范围之间。例如假设chunks 的maxsize大小是100M,如果一个文件达到或超过这个范围时,会被切分到2个新的chunks中。当一个shard的数据过量时,会将一整个chunks迁移到其他的shards上。同样,chunks也可以迁移到其他的shards上。

Config Servers : Config服务器存储着集群的metadata信息,包括每个服务器,每个shard的基本信息和chunk信息Config服务器主要存储的是chunk信息。每一个config服务器都复制了完整的chunk信息。

一个分布式集群至少需要三部分:

1、两个或更多的Shards。

2、最少一台Config Server。

3、一个mongos路由进程。

Sharding的介绍:http://www.mongodb.org/display/DOCS/Sharding+Introduction

Sharding配置说明:http://www.mongodb.org/display/DOCS/Configuring+Sharding

Sharding配置的官方示例:http://www.mongodb.org/display/DOCS/A+Sample+Configuration+Session
MongoDB编译和构建

1、下载MongoDB源码并解压。

2、下载boost并且解压到MongoDB所在盘根目录,目录名为boost,然后编译之。如果已经拥有了Boost可以使用mklink在根目录下面创建目录链接。

3、下载SpiderMonkey做为js引擎库(http://github.com/dwight/vc2010_js/tree/master/src/),并解压到和mongodb文件夹同级的“js”文件夹内。

4、打开db/db_10.sln,选择相应的平台并且编译,有可能要修改一些语法错误。

5、安装python和SCons(一种构建工具)。http://www.python.org/download/releases/2.6.4/http://sourceforge.net/projects/scons/files/scons/1.2.0/scons-1.2.0.win32.exe/download.

6、在MongoDB文件夹中运行命令行,并且有可能需要运行VS2010设置环境变量的批处理文件vcvars*.bat。

To build:

scons// build mongod

scons mongoclient.lib// build C++ client driver library

scons all// build all end user components

scons .// build all including unit test
服务架设

在Mongod、Mongos等程序的同级目录下创建三个文件夹data_shard1、data_shard2 、data_config作为数据库目录。

1、shard1启动

start mongod ?dbpath %cd%\data_shard1 ?port 27020

2、shard2启动

start mongod ?dbpath %cd%\data_shard2 ?port 27021

3、配置服务器启动

start mongod ?dbpath %cd%\data_config ?port 27022 ?configsvr

4、路由服务器启动(使用的默认的端口27017)

start mongos?configdb 127.0.0.1:27022

5、启动mongo,也使用默认端口,连接的是mongos.此时config服务器中有默认的admin数据库。

使用use admin切换成admin数据库

> cOnfig= connect(“127.0.0.1:27022″)

> cOnfig= config.getSisterDB(“config”)

使用db.runCommand({addshard: “127.0.0.1:27020″, allowLocal:1, maxSize:100}) 添加shard1

使用db.runCommand({addshard: “127.0.0.1:27021″, allowLocal:1, maxSize:100}) 添加shard2

6、创建一个可以被sharding的数据库test。

>test=db.getSisterDB(“test”)

>db.runCommand({enablesharding:”test”})

一旦设置了某数据库可以被sharding,那么此数据库中的不同数据集就会放在不同的分片上。

7、数据集分块:db.runCommand( { shardcollection : “test.fs.chunks”, key:{files_id:1}}) ,此数据集的主shards被设置为了shard1。

8、查看分块状态:db.printShardingStatus()

经过以上步骤,就架设成功了一个MongoDB集群,每个Shards的容量由“maxSize:100”限定为了100M大小,并且test.fs.chunks这个collection里的内容会被自动分片存放。
实例分析

在上面的程序架设好了之后,使用MongoDB工具集中的Mongofiles.exe程序连续地put一个20M的文件。

使用db.fs.chunks.stats()命令查看chunks的分块状态得知mongos优先将文件块放在了shard1上,当shard1的大小超过一定规模后(这个规模又不是maxSize设定的100M)才会将文件块迁移向Shard2。

当chunks这个collection在Shard2上面占用的空间大于100M之后(实际上是108906496字节),mongos不断提示“[Balancer] no availalable shards to take chunks”,然后我又新建了shard3同样设置为“maxsize:100”并且添加到集群中,这时mongos自动将一些块迁移到shard3中。等到停止迁移后我新增块,新增的块还是先写入shard1并且不断地有chunks迁移到shard3,但是最终shard1的数据大小远大于100M。

另外,db.fs.chunks在shard2的分布情况如下:

“shard0001″ : {

“ns” : “test.fs.chunks”,

“count” : 340,

“size” : 88506100,

“avgObjSize” : 260312.0588235294,

“storageSize” : 108906496,

“numExtents” : 11,

“nindexes” : 3,

“lastExtentSize” : 21645312,

“paddingFactor” : 1,

“flags” : 1,

“totalIndexSize” : 90112,

“indexSizes” : {

“_id_” : 32768,

“files_id_1″ : 24576,

“files_id_1_n_1″ : 32768

},

“ok” : 1

}

由状态信息可知,实际储存的文件大小是88.5M,但是占用的储存空间确是108.9M,可能chunks多余的未用部分用来做了对齐操作。
MongoDB的C++ API使用

想要自己编写MongoDB的客户端应用,可以先编译出MongDB的客户端静态库“mongoclient.lib”并且包含在自己的工程中。接着可以使用MongoDB源码中的一些头文件,“client/dbclient.h”,“client/gridfs.h”等。

对于文件分布式存储来说,使用gridfs.h中的GridFS、GridFile、GridFSChunk等类就可以完成简单的本地文件上传、文件下载、文件块读取、内存数据上传,想完成其它更为复杂的操作把文件块当做普通的BSON对象来操作,需要自己实现代码。

例:存储本地文件

DBClientConnectionc;

c.connect(“localhost”);

GridFS fs(c, “test”);

BSOnObjfile= fs.storeFile(filename.c_str(), filename.length(), filename);


推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 迎接云数据库新时代:程序员如何应对变革?
    在数据无处不在的时代,数据库成为了管理和处理数据的核心工具。从早期的信息记录方式到现代的云数据库,数据库技术经历了巨大的变革。本文将探讨云数据库的特点及其对程序员的影响。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
author-avatar
北京超凡传媒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有