前面介绍MongoDB时,我们提到,其管理理念就是尽量简化系统操作,自动完成各种配置。但人工参与有时仍然是不可避免的,我们这次主要就从数据库管理员的角度来看一下MongoDB。
【启动MongoDB】
执行mongod命令,启动mongod进程,就会启动MongoDB数据库服务。我们在命令行窗口中运行mongod --help可以看到这个命令有大量可选的option,我们这里重点介绍几个:
1》 --dbpath:指定数据目录,每一个mongod进程都要有一个独立的数据目录,如果不指定这个选项,默认的数据目录是/data/db/(Windows下是C:\data\db\)。当mongod启动后,会在数据目录中创建mongod.lock文件,这个文件可以防止别的mongod进程再次使用这个目录作为数据目录。
2》 --port:指定数据库服务监听端口号,默认为27017,如果同一台服务器要启动多个mongod进程,这些进程要分别指定不同端口。
3》 --fork:以守护进程的形式运行MongoDB,Windows平台不支持这个参数,Linux和Unix平台支持!
4》 --logpath:指定日志输出路径
5》 --config:指定配置文件,通过该配置文件配置上述各类信息。
E:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongod --dbpath E:\mongoddata --port 27777 --logpath E:\mongodlog\log1.log all output going to: E:\mongodlog\log1.log
上面我们启动了一个指定数据目录、日志输出目录并且监听端口在27777上的mongod服务!我们再通过配置文件的形式启动一个,配置文件的内容是:
#mongod启动配置文件 port = 27777 #指定端口 dbpath = E:\mongoddata #指定数据目录 logpath = E:\mongodlog\log1.log #指定日志输出目录 # 对于如--fork这类的开关选项,在配置文件中使用要指定值为true,fork = true
E:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongod --config E:\config.conf all output going to: E:\mongodlog\log1.log
上述即通过配置文件启动了mongod服务。我们前面也介绍了,Windows平台中,通过--install选项,还可以将mongod以服务的形式进行安装,这里就不在演示了。
【停止MongoDB】
Windows平台上,如果mongod服务是作为前台进程运行在服务器上(即cmd窗口的形式),可以直接ctrl + c的方式结束,如果mongod是以服务的形式运行,可以到“服务”管理窗口进行结束,或在命令行中,通过net stop mongodb来结束服务(通过net start mongodb来启动服务)。Linux/Unix平台,则通过kill命令来关闭服务。
--注意:MongoDB权威指南还提到了在admin数据库下,通过运行shutdown({"shutdown" : 1})命令的方式,或在shell中调用其包装函数db.shutdownServer()的形式停止服务,经试验,这种方式在Windows平台上,在关闭掉服务后,都会再次重启服务,不会将服务完全停止掉!
【运行监控】
默认情况下,启动mongod服务的同时,会启动一个非常基本的http服务器,该服务器监听的端口总是mongod服务监听端口+1000, 通过浏览器可以访问这个http服务,这里会列举出当前mongod服务的一些运行信息。
除了上述这种方式外,shell中通过运行serverStatus命令同样可以查看mongod的运行信息:
> db.runCommand({"serverStatus" : 1}) { "host" : "liuxj-PC", "version" : "2.0.6", "process" : "mongod", "uptime" : 1012, "uptimeEstimate" : 674, "localTime" : ISODate("2012-08-25T07:08:07.120Z"), "globalLock" : { "totalTime" : 1011540200, "lockTime" : 0, "ratio" : 0, "currentQueue" : { "total" : 0, "readers" : 0, "writers" : 0 }, "activeClients" : { "total" : 0, "readers" : 0, "writers" : 0 } }, "mem" : { "bits" : 64, "resident" : 20, "virtual" : 61, "supported" : true, "mapped" : 0, "mappedWithJournal" : 0 }, "connections" : { "current" : 1, "available" : 19999 }, "extra_info" : { "note" : "fields vary by platform", "page_faults" : 5381, "usagePageFileMB" : 20, "totalPageFileMB" : 4094, "availPageFileMB" : 2603, "ramMB" : 2047 }, "indexCounters" : { "note" : "not supported on this platform" }, "backgroundFlushing" : { "flushes" : 16, "total_ms" : 0, "average_ms" : 0, "last_ms" : 0, "last_finished" : ISODate("2012-08-25T07:07:15.749Z") }, "cursors" : { "totalOpen" : 0, "clientCursors_size" : 0, "timedOut" : 0 }, "network" : { "bytesIn" : 157, "bytesOut" : 186, "numRequests" : 2 }, "opcounters" : { "insert" : 0, "query" : 1, "update" : 0, "delete" : 0, "getmore" : 0, "command" : 3 }, "asserts" : { "regular" : 0, "warning" : 0, "msg" : 0, "user" : 0, "rollovers" : 0 }, "writeBacksQueued" : false, "dur" : { "commits" : 22, "journaledMB" : 0, "writeToDataFilesMB" : 0, "compression" : 0, "commitsInWriteLock" : 0, "earlyCommits" : 0, "timeMs" : { "dt" : 3104, "prepLogBuffer" : 0, "writeToJournal" : 0, "writeToDataFiles" : 0, "remapPrivateView" : 0 } }, "ok" : 1 } >
上面返回的文档,就是当前服务器的相关运行信息,基本上都是顾名思义的,我们解释其中几个,"globalLock"表示了全局写入锁占用服务器多少时间(微妙),“mem”代表了服务器内存映射了多少数据,服务器进程的常驻内存和虚拟内存的占用情况(MB),“backgroundFlushing”表示后台做了多少次fsync(后面后讲到)及用了多少时间,“opcounters”表示各种操作执行的次数,“asserts”:统计了断言的次数。这些统计信息从mongod服务起来后就开始进行,如果数字超过一定范围,就会复位,一旦某个计数器复位,所有计数器同时复位,asserts中的rollovers键对应的值会加1。
上面提到的两种监控方式给出的都是静态信息,MongoDB还给出了一个工具 mongostat(bin目录中),这个工具动态给出当前数据库服务的相关信息,每秒钟刷新一次,以列表的形式展现:
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn time 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:36 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:37 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:38 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:39 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:40 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:41 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:42 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:43 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:44 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:45 insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn time 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:46 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:47 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:48 0 0 0 0 0 1 0 0m 62m 20m 0 0 0 0|0 0|0 62b 1k 2 15:20:49
现在除了MongoDB本身提供的多种监控方式外,还有很多第三方插件可以做这个事情(通过执行serverStatus命令或访问http://ip:port/_status来获取数据,并给出各种易用的展示),如Nagios, Munin, Ganglia, Cacti。最后给大家一个网址:http://www.mongodb.org/display/DOCS/Monitoring+and+Diagnostics 这里可以查看监控相关的文档和工具。