MongoDB基础

1.MongoDB的基本概念及原理

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

1.1 什么是NoSql

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

1.2 关系型数据库PK非关系型数据库

RDBMS

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

1.3 NoSql数据库分类

类型 部分代表 特点
列存储 Hbase
Cassandra
Hypertable
顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
文档存储 MongoDB
CouchDB
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。
key-value存储 Tokyo Cabinet / Tyrant
Berkeley DB
MemcacheDB
Redis
可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)
图存储 Neo4J
FlockDB
图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。
对象存储 db4o
Versant
通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。
xml数据库 Berkeley DB XML
BaseX
高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

1.4 MongoDB与关系型数据库的数据结构

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

1.5 MongoDB中的数据类型

数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。

1.6 MongoDB的应用场景和不适用场景

适用场景:
a.站点数据:mongo很适合实时的插入,更新与查询,并具备站点实时数据存储所需的复制及高度伸缩性。
b.缓存:因为性能非常高,mongo也适合作为信息基础设施的缓存层。在系统重新启动之后。由mongo搭建的持久化缓存能够避免下层的数据源过载。
c.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比較贵,在此之前。非常多程序猿往往会选择传统的文件进行存储。
d.高伸缩性的场景:mongo很适合由数十或者数百台server组成的数据库。
e.用于对象及JSON数据的存储:mongo的BSON数据格式很适合文档格式化的存储及查询。
不适合的场景:
a.高度事物性的系统:比如银行或会计系统。传统的关系型数据库眼下还是更适用于须要大量原子性复杂事务的应用程序。
b.传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
c.需要复杂SQL查询的问题。

2.图解MongoDB底层原理

MongoDB复(副)本集与分片
每个复(副)本集中存储的数据是相同的,相当于主备方式的数据冗余,目的是为了容灾。
分片是为了数据的拓展,按照片键进行结点划分,数据根据片键存储到对应的服务器上。

MongoDB部署方案
MongoDB的集群部署方案中有三类角色:实际数据存储结点、配置文件存储结点和路由接入结点。

连接的客户端直接与路由结点相连,从配置结点上查询数据,根据查询结果到实际的存储结点上查询和存储数据。MongoDB的部署方案有单机部署、复本集(主备)部署、分片部署、复本集与分片混合部署。
混合的部署方式如图:
MongoDB基础 - 图1

混合部署方式下向MongoDB写数据的流程如图:
MongoDB基础 - 图2

混合部署方式下读MongoDB里的数据流程如图:
MongoDB基础 - 图3

对于复本集,又有主和从两种角色,写数据和读数据也是不同,写数据的过程是只写到主结点中,由主结点以异步的方式同步到从结点中:
MongoDB基础 - 图4

而读数据则只要从任一结点中读取,具体到哪个结点读取是可以指定的:
MongoDB基础 - 图5

对于MongoDB的分片,假设我们以某一索引键(ID)为片键,ID的区间[0,50],划分成5个chunk,分别存储到3个片服务器中,如图所示:
MongoDB基础 - 图6

配置结点:
存储配置文件的服务器其实存储的是片键与chunk以及chunk与server的映射关系,用上面的数据表示的配置结点存储的数据模型如图:
MongoDB基础 - 图7

路由结点:
路由角色的结点在分片的情况下起到负载均衡的作用。

3.MongoDB实践

3.1 安装配置

下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装)

  1. #安装
  2. curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下载
  3. tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解压
  4. mv mongodb-linux-x86_64-3.0.6/ /usr/data/program/mongodb # 将解压包拷贝到指定目录
  5. #添加到环境变量
  6. export PATH=/usr/data/program/mongodb/bin:$PATH
  7. #创建数据库目录(需手动建一个文件夹)
  8. mkdir -p /usr/data/program/mongodb/data
  9. #启动 转到bin目录;--dpath指定数据库存储目录
  10. ./mongod --dbpath /usr/data/program/mongodb/data
  11. #后台启动
  12. ./mongod --dbpath=/usr/data/program/mongodb/data --bind_ip=192.168.98.165 --logpath=fork --logappend --fork
  13. #配置启动
  14. mongod -f mongodb.cfg
  15. #进入控制台
  16. ./mongo

mongodb.cfg

  1. dbpath=/usr/data/program/mongodb/data
  2. logpath=/usr/data/program/mongodb/logs/mongodb.log
  3. logappend=true
  4. fork=true
  5. bind_ip=192.168.98.165
  6. port=27017

3.2 客户端下载

studio 3t:链接

3.3 MongoDB的增删改查

数据库:创建删除
集合:创建删除
文档:增删改查
条件操作符:查询
$type操作符:查询
Limit与Skip方法:限制条数与忽略第几条
排序
聚合

java操作mongodb例子:链接
mongodb二次封装:链接

4.用户管理

4.1 新增用户

  1. use testdb
  2. db.createUser({user:"tom",pwd:"123456",roles:[{role:"readWrite",db:"tomdb"}]})

4.2 用户角色

(1).数据库用户角色 针对每一个数据库进行控制。 read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

(2).数据库管理角色 每一个数据库包含了下面的数据库管理角色。 dbOwner:该数据库的所有者,具有该数据库的全部权限。 dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。 userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

(3).集群管理权限 admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。 clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。 clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能) clusterMonitor:仅仅监控集群和复制集。 hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。 备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

(4).所有数据库角色 admin数据库提供了一个mongod实例中所有数据库的权限角色: readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。 readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。 userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。 dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

(5). 超级管理员权限 root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。

(6). 备份恢复角色:backup、restore; (7). 内部角色:__system

4.3 其他操作

  1. #和用户管理相关的在admin库
  2. use admin
  3. #查看
  4. db.system.users.find();
  5. #删除
  6. db.system.users.remove({user:'tom'});
  7. #########################################
  8. #以下操作要转testdb数据库
  9. use testdb
  10. #查看当前用户权限
  11. db.runCommand({usersInfo:"tom",showPrivileges:true});
  12. #修改密码
  13. db.changeUserPassword('tom','123456');
  14. #启用用户
  15. db.auth('tom','123456'); #注意是以库为单位,必须先选择库;

5.MongoDB高可用

5.1主从搭建

主配置

  1. dbpath=/usr/data/program/mongodb/data
  2. logpath=/usr/data/program/mongodb/logs/mongodb.log
  3. logappend=true
  4. fork=true
  5. bind_ip=192.168.98.165
  6. port=27017

从配置

  1. dbpath=/usr/data/program/mongodb/data
  2. logpath=/usr/data/program/mongodb/logs/mongodb.log
  3. logappend=true
  4. fork=true
  5. bind_ip=192.168.98.166
  6. port=27017
  7. ####声明从
  8. slave=true
  9. source=192.168.98.165:27017 #主ip

5.2 副本集

5.3数据分片

5.4索引

5.5数据备份与恢复

5.6监控

mongostat、mongotop

MongoDB 教程
http://www.runoob.com/mongodb/mongodb-tutorial.html