一、 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
5FirstName = "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
4wget 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/
出现以下信息表示启动成功
3、配置
配置mongodb1
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操作。
此时可以指定配置文件启动mongodb1
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
2use admin
db.shutdownServer()
(2)Use –shutdown1
mongod –shutdown
(3)Use CTRL-C
(4)Use kill1
2kill <mongod process ID>
kill -2 <mongod process ID>
禁止使用-91
2WARNING:
Never use kill -9 (i.e. SIGKILL) to terminate a mongod instance.
5、修复monogdb
当出现服务器非正常关机的情况,重新启动的时候会出现以下类似报错1
2ERROR: child process failed, exited with error number 100
ERROR: child process failed, exited with error number 48
解决方法为1
2
3mongod -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,如图所示
三、MongoDB操作
1、用户操作
创建用户1
2use 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
2CONTROL [main] ***** SERVER RESTARTED *****
ACCESS [main] permissions on /data/mongodb/mongo-keyfile are too open
可以看到是文件权限过大
调整权限为4001
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
重新启动,即可启动成功