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 }