MongoDB权威指南——管理

MongoDB权威指南

第八章 管理
管理MongoDB不管是备份仍是带有复制的多节点系统,都有快捷的方式。系统会自动完成各类配置。
1.MongoDB是一个普通命令行程序,用mongod调用。
2.MongoDB提供了内置的管理接口和监控功能,易与第三方监控包集成。
3.MongoDB支持基本的,数据库级别的用户认证,包括只读用户,以及独立的管理员权限。
4.多种方式备份MongoDB。

8.1 启动中止MongoDB
8.1.1 命令行启动
命令行启动,能够mongod --help查看全部选项。
--dbpath 默认值为/data/db/。每一个Mongod进程都须要独立的数据目录,要有三个mongod实例,必需要有三个独立的数据目录。mongodb启动时,会在数据目录喜好建立mongod.lock文件,防止其余mongod进程使用该数据目录。
--port
指定监听端口,默认为27017,运行多个mongod进程,须要指定不一样的端口号。
--fork
以守护进程运行mongodb,建立服务器进程。
--logpath
指定日志输出路径,而不是输出命令行,它会覆盖已有文件,清除原来的日记记录。若是要保留,须要使用--logappend选项。
--config
指定配置文件,加载命令行未指定的各类选项。
8.1.2 配置文件
MongoBD支持从文件获取配置信息。指定配置文件能够用-f或者--config选项。例如:
# mongod --config ~/.mongodb.conf
cat > ~/.mongodb.conf <<EOF
port = 10001
fork = true
logpath = /data/mongodb.log
dbpath =  /data/node2
logappend = true
EOF
8.1.3 中止MongoDB
数据库关闭方法:
1. kill -2 SIGTERM或者kill -2 SIGINT,能够稳妥退出,会等到当前运行的操做或者文件预分配,关闭全部打开的链接,将缓存的数据刷新到磁盘,最后中止。
不能kill -9(SIGKILL),这样会致使数据文件损毁。
2. 使用管理命令{"shutdown" : 1}
> use admin
> db.shutdownServer(); 

8.2 监控
8.2.1 使用管理接口
启动MongoDB时,会启动一个很是基本的HTTP服务器,该服务器监听的端口比主服务器大1000。呈现的信息能够经过shell查看,也能够经过web页面查看。
要利用好管理接口,须要用--reset选项开启REST支持。也能够在启动时使用--nohttpinterface关闭管理接口。
8.2.2 serverStatus
serverStatus呈现了MongoDB内部详细信息,好比服务器的版本,运行时间,当前链接数。
MongoDB shell version: 2.4.9
connecting to: 127.0.0.1:10001/test
> db.runCommand({serverStatus : 1})
"globalLock"表示全局写入锁占用了服务器多少时间(微秒)。"mem"包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存占用状况;
"indexCounters"表示B树在磁盘检索和内存检索的次数;
"backgroudFlushing"表示后台作了多少次fsync以及用了多少时间;
"opcounters"包含了每种主要操做的次数。
8.2.3 mongostat
mongostat输出serverStatus提供的重要信息。每秒钟输出新的一行,比以前看到的静态计数实时性更好。分别为insert/s,commands/s,vsize和%locked。
8.2.4 第三方插件
支持Nagios,Munin,Ganglia,Cacti的MongbDB插件。

8.3 安全
MongoDB支持对单个链接的认证。

8.3.1 认证的基础知识
每一个MongoDB实例中的数据库均可以有不少用户。开启认证后,只有数据库认证用户才能执行读写操做。
认证后,管理员能够读写全部的数据库,执行特定的管理命令。
开启安全认证前,须要有管理员账号。
> use admin
switched to db admin
> db.addUser("root", "root123");
{
        "user" : "root",
        "readOnly" : false,
        "pwd" : "81c5bca573e01b632d18a459c6cec418",
        "_id" : ObjectId("530bd17622cceb4323a2b500")
}
> use test
switched to db test
> db.addUser("test_user", "root123", true);
{
        "user" : "test_user",
        "readOnly" : true,
        "pwd" : "d436badec207e3821abbaf337fcbdd06",
        "_id" : ObjectId("530bd24322cceb4323a2b501")
}
在shell中建立只读用户将adduser的第三个参数设为true。调用addUser()必须对数据库有写权限。
addUser不只能够增长新用户,还能修改用户口令或只读状态。
重启服务器,加入--auth选项,开启安全检查。
> use admin
switched to db admin
> db.auth("root", "root123");
1
8.3.2 认证的工做原理
数据库用户账户以文档形式存储在system.users集合里面。
> use admin
switched to db admin
> db.system.users.find();
{ "_id" : ObjectId("530bd17622cceb4323a2b500"), "user" : "root", "readOnly" : false, "pwd" : "81c5bca573e01b632d18a459c6cec418" }
能够执行db.system.users.remove({"user":"root"});删除账号。
用户认证时,服务器将认证和链接绑定来跟踪认证。
8.3.3 其余安装考虑
除了认证还有许多选项来锁定MongoDB实例。即使使用认证,MongoDB传输协议是不加密的。如需加密,须要使用SHH隧道或相似作客户端和服务器之间的加密。
MongoDB服务器建议布置在防火墙或内网中,可是若是须要被外部访问,使用--bindip选项,能够指定mongod绑定在本机IP地址。
能够用--noscripting彻底禁止服务器端JavaScript的执行。

8.4 备份和修复
8.4.1 数据文件备份
MongoDB将全部数据存放在数据目录下。只要简单的备份数据目录下的全部文件的副本就能够了。
除非服务器作了完整的fsync,还不容许写入,不然创建副本并不安全。
须要关闭MongoDB,而后复制数据目录。
下面介绍不停机备份方式
8.4.2 mongodump和mongorestore
mongodump对运行的MongoDB作查询,而后将全部查到的文档写入磁盘。备份时的查询对其余客户端的性能产生不利影响。
[root@test02 ~]# mongodump --help
[root@test02 ~]# mongodump --port 10001 -d test -o backup
[root@test02 ~]# mongorestore --port 10001 -d foo --drop backup/test/
-d指定了要恢复的数据库,就是foo。--drop表明在恢复前删除集合(若存在)。
8.4.3 fsync和锁
MongoDB的fsync命令能够在运行时复制数据目录还不损坏数据。
fsync命令会强制服务器将全部缓冲区写入磁盘。还能够选择上锁阻止对数据库的进一步写入,直到释放锁位置。写入锁是fsync在备份时发挥做用的关键。
> db.runCommand({"fsync" : 1, "lock", 1});
Tue Feb 25 07:50:36.145 SyntaxError: Unexpected token ,
> db.runCommand({"fsync" : 1, "lock" : 1});
{
        "info" : "now locked against writes, use db.fsyncUnlock() to unlock",
        "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
        "ok" : 1
}
至此,数据目录的数据就是一致的,且为数据的实时快照。由于上了写入锁,能够安全的将数据目录副本做为备份。要是在数据库运行在有快照功能的文件系统上时,好比LVM或EBS,就很是有效了。
备份好了,就要解锁:
> db.$cmd.sys.unlock.findOne();
{ "ok" : 1, "info" : "unlock completed" }
> db.currentOp();
{ "inprog" : [ ] }
运行db.currentOp()是为了确保已经解锁了。
惟一的影响是写入操做被暂时阻塞了。惟一不耽误读写的方法是经过从服务器备份。
8.4.4 从属备份
上面的几种方式都不如在从服务器上备份,从服务器几乎与主服务器同步。由于从服务器再也不会性能或者读写,就能够随意选择上面的3种备份方式:关停,转储和恢复工具或fsync命令。
8.4.5 修复
作备份是为了防止不测,总有机器宕机,又没有备份的状况。MongoDB的存储方式不能保证磁盘上的数据可用。MongoDB内置的修复功能会试着恢复损毁的数据文件。
[root@test02 ~]# mongod --config ~/.mongodb.conf --repair
修复服务器的过程是将全部文档导出而后立刻导入,忽略无效的文档。完成后,会重建索引。
修复运行中的服务器数据库
> use test
switched to db test
> db.repairDatabase()
{ "ok" : 1 }
相关文章
相关标签/搜索