MongoDB权威指南第八章 管理管理MongoDB无论是备份还是带有复制的多节点系统,都有快捷的方式。系统会自动完成各种配置。1.MongoDB是一个普通命令行程序,用mongod调用。2.MongoDB提供了内置的管理接口和监控功能,易与第三方监控包集成。3.MongoDB支持基本的,数据库级别的用户认证,包括只读用户,以及独立的管理员权限。4.多种方式备份MongoDB。8.1 启动停止MongoDB8.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.confcat > ~/.mongodb.conf <use admin> db.shutdownServer(); 8.2 监控8.2.1 使用管理接口启动MongoDB时,会启动一个非常基本的HTTP服务器,该服务器监听的端口比主服务器大1000。呈现的信息可以通过shell查看,也可以通过web页面查看。要利用好管理接口,需要用--reset选项开启REST支持。也可以在启动时使用--nohttpinterface关闭管理接口。8.2.2 serverStatusserverStatus呈现了MongoDB内部详细信息,比如服务器的版本,运行时间,当前连接数。MongoDB shell version: 2.4.9connecting to: 127.0.0.1:10001/test> db.runCommand({serverStatus : 1})"globalLock"表示全局写入锁占用了服务器多少时间(微秒)。"mem"包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存占用情况;"indexCounters"表示B树在磁盘检索和内存检索的次数;"backgroudFlushing"表示后台做了多少次fsync以及用了多少时间;"opcounters"包含了每种主要操作的次数。8.2.3 mongostatmongostat输出serverStatus提供的重要信息。每秒钟输出新的一行,比之前看到的静态计数实时性更好。分别为insert/s,commands/s,vsize和%locked。8.2.4 第三方插件支持Nagios,Munin,Ganglia,Cacti的MongbDB插件。8.3 安全MongoDB支持对单个连接的认证。8.3.1 认证的基础知识每个MongoDB实例中的数据库都可以有很多用户。开启认证后,只有数据库认证用户才能执行读写操作。认证后,管理员可以读写所有的数据库,执行特定的管理命令。开启安全认证前,需要有管理员帐号。> use adminswitched to db admin> db.addUser("root", "root123");{ "user" : "root", "readOnly" : false, "pwd" : "81c5bca573e01b632d18a459c6cec418", "_id" : ObjectId("530bd17622cceb4323a2b500")}> use testswitched 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 adminswitched to db admin> db.auth("root", "root123");18.3.2 认证的工作原理数据库用户帐户以文档形式存储在system.users集合里面。> use adminswitched 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和mongorestoremongodump对运行的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 testswitched to db test> db.repairDatabase(){ "ok" : 1 }