MongoDB基础文档

一、 MongoDB简介

1、MongoDB历史

MongoDB最初于2007年开发,当时公司正在建立一个类似于窗口天蓝(window azure)的服务平台。
“Window azure是由Microsoft创建的云计算平台和基础设施,通过全球网络构建,部署和管理应用程序和服务。”
MongoDB由位于纽约的一个名为10gen的组织开发,现在被称为MongoDB Inc.,它最初被开发为PAAS(平台即服务)。 2009年晚些时候,它被作为一个由MongoDB公司维护和支持的开源数据库服务器在市场上引入。
MongoDB的第一个真正产品是从2010年3月发布的MongoDB 1.4版本开始的。2014年1月10日发布的最新版本:MongoDB2.4.9。
首先应该知道什么是面向文档的数据库?
面向文档的数据库示例
MongoDB是面向文档的数据库。这是MongoDB的一个主要功能。它提供面向文档的存储。这很简单,可以很容易地编程。
MongoDB将数据存储为文档,因此被称为面向文档的数据库。

1
2
3
4
5
FirstName = "Max", 
Address = "Haikou City",
Spouse = [{Name: "Maxsu"}].
FirstName ="Kobe",
Address = "LAC"

有两个不同的文件(用“.”分隔开)。以这种方式存储数据称为面向文档的数据库。 Mongodb属于一类名为面向文档数据库(Document Oriented Databases)。它属于一个叫作“NoSQL数据库”的数据库类别称。

2、MongoDB特点

MongoDB的一些重要功能特性:

  • 支持特别查询
    在MongoDB中,可以通过字段,范围查询进行搜索,并且还支持正则表达式搜索。
  • 索引
    可以索引文档中的任何字段。
  • 复制
    MongoDB支持主从复制。主机可以执行读写操作,从机从主机复制数据,只能用于读取或备份(不写入)
  • 复制数据
    MongoDB可以在多台服务器上运行。 复制数据以保持系统正常运行,并在硬件故障的情况下保持其运行状态。
  • 负载均衡
    由于数据放在碎片中,因此具有自动负载平衡配置。
  • 支持映射缩减和聚合工具
  • 使用JavaScript而不是Procedure
  • 它是一个用C++编写的无模式数据库
  • 提供高性能
  • 轻松存储任何大小的文件,而不会使您的堆栈复杂化
  • 在故障的情况下易于管理
  • 具有动态模式的JSON数据模型
  • 自动分片用于水平可扩展性
  • 内置复制高可用性
    现在,许多公司使用 MongoDB 来创建新类型的应用程序,以提高性能和可用性。

3、MongoDB数据库的优点

到目前为止,MongoDB是一个新的和普遍使用的数据库。它是一个基于文档的非关系数据库提供程序。
虽然它比传统的数据库快100倍,但早期说它将广泛地取代传统的RDBMS。但是,不可否认的是:在性能和可扩展性方面 MongoDB 有着明显的优势。
关系数据库具有典型的架构设计,可以显示表的数量以及这些表之间的关系,而在MongoDB中则没有关系的概念。
(1)MongoDB优点

* MongoDB 的架构较少。它是一个文档数据库,它的一个集合持有不同的文档。 
* 从一个到另一个的文档的数量,内容和大小可能有差异。 
* MongoDB 中单个对象的结构很清淅。 
* MongoDB 中没有复杂的连接。 
* MongoDB 提供深度查询的功能,因为它支持对文档的强大的动态查询。 
* MongoDB 很容易扩展。 
* 它使用内部存储器来存储工作集,这是其快速访问的原因。

(2)MongoDb的独特功能

* 使用方便
* 重量轻/轻量级 
* 比RDBMS快得多

(3)MongoDB应用场景

* 大而复杂的数据 
* 移动和社会基础设施数据 
* 内容管理和交付 
* 用户数据管理 
* 数据中心

(4)MongoDB和RDBMS的性能分析

* 在关系数据库(RDBMS)中,表用作存储元素,而在 MongoDB 中使用的是集合。 
* 在RDBMS中有多个模式,在每个模式中,可创建用于存储数据的表,而 MongoDB 是面向文档的数据库,数据是以类似JSON格式的BSON格式编写的存储的。 
* MongoDB几乎比传统数据库系统快100倍。

4、MongoDB快速入门

MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展。MongoDB是工作在集合和文档上一种概念。
数据库
数据库是一个集合的物理容器。每个数据库获取其自己设定在文件系统上的文件。一个单一的MongoDB服务器通常有多个数据库。
集合
集合是一组MongoDB的文件。它与一个RDBMS表是等效的。一个集合存在于数据库中。集合不强制执行模式。集合中的文档可以有不同的字段。通常情况下,在一个集合中的所有文件都是类似或相关目的。
文档
文档是一组键值对。文档具有动态模式。动态模式是指,在同一个集合的文件不必具有相同一组集合的文档字段或结构,并且相同的字段可以保持不同类型的数据。

二、MongoDB安装

1、下载

MongoDb的linux版本下载地址为
https://www.mongodb.org/dl/linux/
选择合适的版本下载

1
2
3
4
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.20.tgz?_ga=2.11328048.543796309.1528358506-412859566.1526522668
mv mongodb-linux-x86_64-rhel70-3.2.20.tgz\?_ga\=2.11328048.543796309.1528358506-412859566.1526522668 mongodb-linux-x86_64-rhel70-3.2.20.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-3.2.20.tgz
mv mongodb-linux-x86_64-rhel70-3.2.20 /data/mongodb

2、安装

将Mongod移动到/data目录下,然后加入系统环境变量

1
2
#set mongodb environment
export PATH=/data/mongodb/bin:$PATH

执行以下命令使配置生效

1
source /etc/profile

新建log、data、conf目录,如下

1
2
3
4
5
6
7
8
9
10
11
12
# pwd
/data/mongodb
# ll
total 104
drwxr-xr-x 2 root root 4096 Jun 7 04:16 bin
drwxr-xr-x 2 root root 6 Jun 7 04:29 conf
drwxr-xr-x 4 root root 4096 Jun 7 04:43 data
-rw-r--r-- 1 root root 34520 May 8 18:08 GNU-AGPL-3.0
drwxr-xr-x 2 root root 6 Jun 7 04:43 log
-rw-r--r-- 1 root root 16726 May 8 18:08 MPL-2
-rw-r--r-- 1 root root 2262 May 8 18:08 README
-rw-r--r-- 1 root root 35910 May 8 18:08 THIRD-PARTY-NOTICES

mongodb的bin下各工具的用途:

* mongod:数据库服务端,类似mysqld,每个实例启动一个进程,可以fork为Daemon运行
* mongo:客户端命令行工具,类似sqlplus/mysql,其实也是一个js解释器,支持js语法
* mongodump/mongorestore:将数据导入为bson格式的文件/将bson文件恢复为数据库,类似xtracbackup
* mongoexport/mongoimport:将collection导出为json/csv格式数据/将数据导入数据库,类似mysqldump/mysqlimport
* bsondump:将bson格式的文件转储为json格式的数据
* mongos:分片路由,如果使用了sharding功能,则应用程序连接的是mongos而不是mongod
* mongofiles:GridFS管理工具
* mongostat:实时监控工具启动mongodb

启动

1
mongod --dbpath /data/mongodb/data/

出现以下信息表示启动成功
Alt text

3、配置

配置mongodb

1
2
3
4
5
6
7
8
9
10
11
# cat conf/mongodb.conf 
dbpath=/data/mongodb/data
logpath=/data/mongodb/log/mongodb.log
pidfilepath=/data/mongodb/data/mongodb.pid
logappend=true
#bind_ip=10.186.21.85
bind_ip=0.0.0.0
port=27017
maxConns=20000
fork=true
#auth = true # 先关闭, 创建好用户在启动

mongod的主要参数有:
dbpath: 数据文件存放路径,每个数据库会在其中创建一个子目录。
logpath:错误日志文件
logappend: 错误日志采用追加模式(默认是覆写模式)
bind_ip: 对外服务的绑定ip,一般设置为空,及绑定在本机所有可用ip上,如有需要可以单独指定。只能绑定本机网卡上绑定的ip地址,如果指定ip没有绑定在本机网卡,则绑定0.0.0.0,此种情况适用于绑定云服务器的外网ip。
port: 对外服务端口。Web管理端口在这个port的基础上+1000
fork: 以后台Daemon形式运行服务
journal:开启日志功能,通过保存操作日志来降低单机故障的恢复时间,在1.8版本后正式加入,取代在1.7.5版本中的dur参数。
syncdelay: 执行sync的间隔,单位为秒。
directoryperdb: 每个db存放在单独的目录中,建议设置该参数。
maxConns: 最大连接数
repairpath: 执行repair时的临时目录。在如果没有开启journal,异常宕机后重启,必须执行repair操作。
此时可以指定配置文件启动mongodb

1
2
3
4
# mongod -f /data/mongodb/conf/mongodb.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 20815
child process started successfully, parent exiting

以上即表示启动成功

4、管理mongodb服务

官网文档https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/#stop-mongod-processes
Start mongod Processes
(1)mongod
(2)mongod –dbpath /srv/mongodb/
(3)mongod –port 12345
(4)mongod –fork –logpath /var/log/mongodb.log
(5)mongod -f /data/mongodb/conf/mongodb.conf
Stop mongod Processes
(1)Use shutdownServer()

1
2
use admin 
db.shutdownServer()

(2)Use –shutdown

1
mongod –shutdown

(3)Use CTRL-C
(4)Use kill

1
2
kill <mongod process ID>
kill -2 <mongod process ID>

禁止使用-9

1
2
WARNING:
Never use kill -9 (i.e. SIGKILL) to terminate a mongod instance.

5、修复monogdb

当出现服务器非正常关机的情况,重新启动的时候会出现以下类似报错

1
2
ERROR: child process failed, exited with error number 100
ERROR: child process failed, exited with error number 48

解决方法为

1
2
3
mongod -f /data/mongodb/conf/mongodb.conf –repair
mongod -f /data/mongodb/conf/mongodb.conf --auth
mongod -f /data/mongodb/conf/mongodb.conf

通过repair修复
连接mongodb方法为

1
mongo --host 101.132.37.169:27017

其中ip地址为配置文件中bind_ip地址,如果是本地可以直接mongo连接
6、打开网页
在mongodb.conf配置文件中加入以下参数

1
rest=true

即可打开网页端口,默认为28017,如图所示
Alt text

三、MongoDB操作

1、用户操作

创建用户

1
2
use admin 
db.createUser({user:"root",pwd:"root",roles:[{role:"readWrite",db:"admin"}]})

查看已存在的用户

1
2
3
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "1hkiX4Tscoj6bUpxF2x7+A==", "storedKey" : "ciyQR1bc5Bbm6Qxg4euAijnadCw=", "serverKey" : "F/Gg0NmM19ih62VjbccW/SYOAh4=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "testdb.testdb", "user" : "testdb", "db" : "testdb", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "VhSm/77+cGXEUwYAbdHvSw==", "storedKey" : "hDtO9gq4OVNdcChNSoRhYiXmSQQ=", "serverKey" : "L1bPBquYwey5O0BYsDl7zsiSojs=" } }, "roles" : [ { "role" : "dbOwner", "db" : "testdb" } ] }

删除用户

1
2
> db.system.users.remove({user:"testdb1u1"})
WriteResult({ "nRemoved" : 1 })

用户登录数据库测试

1
mongo -u testdb -p 123456 127.0.0.1:27017/testdb

2、数据库操作

创建数据库

1
2
> use newdb
switched to db newdb

检查当前选择的数据库

1
2
> db
newdb

检查数据库列表

1
2
3
> show dbs
admin 0.000GB
local 0.000GB

新创建的数据库(newdb)不在列表中。要显示数据库,需要至少插入一个文档,否则空的数据库是不显示出来的。

1
2
3
4
5
6
> db.items.insert({"name":"yiibai tutorials"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
local 0.000GB
newdb 0.000GB

在 MongoDB 中默认数据库是:test。 如果您还没有创建过任何数据库,则集合/文档将存储在test数据库中。
删除数据库
MongoDB中的 db.dropDatabase()命令用于删除现有的数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> show dbs
admin 0.000GB
local 0.000GB
newdb 0.000GB
> show dbs
admin 0.000GB
local 0.000GB
newdb 0.000GB
> db
newdb
> db.dropDatabase()
{ "dropped" : "newdb", "ok" : 1 }
> show dbs
admin 0.000GB
local 0.000GB

以上过程已把数据库newdb删除

四、MongoDB集群

1、MongoDB主从模式搭建

(1)Master-Slave搭建
两台服务器IP分别为:10.186.21.85(主)、10.186.21.84(从)
关于mongodb的详细配置可以从配置文件看到
主库配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# cat /data/mongodb/conf/mongodb.conf 
dbpath=/data/mongodb/data #数据库路径
logpath=/data/mongodb/log/mongodb.log #日志输出文件路径
logappend=true #日志输出方式
pidfilepath=/data/mongodb/data/mongodb.pid #pid文件路径
#bind_ip=10.186.21.85
bind_ip=0.0.0.0
port=27017 #端口号
rest=true #设置后打开28017网页端口
httpinterface=true
maxConns=20000
fork=true #设置后台运行
shardsvr=true
#directoryperdb=true
#auth = true # 先关闭, 创建好用户在启动
#nohttpinterface=false

journal=true
quiet=true
master=true

从库配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# cat /data/mongodb/conf/mongodb.conf 
dbpath=/data/mongodb/data #数据库路径
logpath=/data/mongodb/log/mongodb.log #日志输出文件路径
logappend=true #日志输出方式
pidfilepath=/data/mongodb/data/mongodb.pid #pid文件路径
#bind_ip=10.186.21.84
bind_ip=0.0.0.0
port=27017 #端口号
rest=true #设置后打开28017网页端口
httpinterface=true
maxConns=20000
fork=true #设置后台运行
shardsvr=true
#directoryperdb=true
#auth = true # 先关闭, 创建好用户在启动
#nohttpinterface=false

journal=true
quiet=true
slave=true
source=10.186.21.85:27017

验证
主库添加数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
> show dbs
admin 0.000GB
local 0.000GB
> use testdb
switched to db testdb
> db.items.insert({"name":"yiibai tutorials"})
WriteResult({ "nInserted" : 1 })
> use testdb
switched to db testdb
> show dbs
admin 0.000GB
local 0.000GB
testdb 0.000GB

从库查看数据库验证

1
2
3
4
5
> rs.slaveOk()
> show dbs
admin 0.000GB
local 0.000GB
testdb 0.000GB

登录从库后执行命令可能会报错

1
[thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :

解决方法为登录从库后执行rs.slaveOk(),如下

1
2
3
4
5
6
7
8
9
10
11
12
> show dbs
2018-06-08T05:25:43.065-0400 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1

> rs.slaveOk()
> show dbs
admin 0.000GB
local 0.000GB

(2)Master-Slave安全
这个主从安全在 MongoDB官网说的很清楚。不能和普通的mongod权限验证那样。这里除了需要加入 —auth 还需要加入 —keyFile 的验证。
首先,我们生成我们的keyFile,根据官网提供的说明,这个keyfile是可以任意内容的,只要保证所有集群中的机器都拥有同样的文件即可。在linux环境下,我们通过

1
openssl rand -base64 741 > /data/mongodb/mongo-keyfile

这条命令来生成我们的keyFile。
保证主从库上使用的配置文件相同,在配置文件中加入

1
keyFile=/data/mongodb/mongo-keyfile

重新启动monodb,报错

1
2
3
4
# mongod -f /data/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 16492
ERROR: child process failed, exited with error number 1

查看日志

1
2
CONTROL  [main] ***** SERVER RESTARTED *****
ACCESS [main] permissions on /data/mongodb/mongo-keyfile are too open

可以看到是文件权限过大
调整权限为400

1
2
3
4
5
6
7
8
9
10
11
12
# chmod 400 mongo-keyfile 
# ll
total 108
drwxr-xr-x 2 root root 4096 Jun 7 04:16 bin
drwxr-xr-x 2 root root 25 Jun 8 05:44 conf
drwxr-xr-x 4 root root 4096 Jun 8 05:49 data
-rw-r--r-- 1 root root 34520 May 8 18:08 GNU-AGPL-3.0
drwxr-xr-x 2 root root 24 Jun 7 05:20 log
-r-------- 1 root root 7 Jun 8 05:42 mongo-keyfile
-rw-r--r-- 1 root root 16726 May 8 18:08 MPL-2
-rw-r--r-- 1 root root 2262 May 8 18:08 README
-rw-r--r-- 1 root root 35910 May 8 18:08 THIRD-PARTY-NOTICES

重新启动,即可启动成功

本文标题:MongoDB基础文档

文章作者:Francis

原始链接:http://www.cnops.com/posts/dc462543.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。