学习MongoDB--(8-1):管理(启动停止 & 运行监控)

前面介绍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 这里可以查看监控相关的文档和工具。

 

你可能感兴趣的:(学习MongoDB--(8-1):管理(启动停止 & 运行监控))