全部博文(1144)
分类: Mysql/postgreSQL
2011-10-09 07:54:58
| > db.foo.insert({"x":new Date(2010,0,24,9,23,34)}); > db.foo.insert({"x":new Date(2010,0,26,9,23,34)}); > db.foo.insert({"x":new Date(2010,0,27,9,23,34)}); > db.foo.insert({"x":new Date(2010,0,30,9,23,34)}); > db.foo.insert({"x":new Date(2010,1,02,9,23,34)}); > > db.foo.find(); { "_id" : ObjectId("4d65bbec3ebb3cfc9ca664e0"), "x" : "Sun Jan 24 2010 09:23:34 GMT+0800 (CST)" } { "_id" : ObjectId("4d65bbf23ebb3cfc9ca664e1"), "x" : "Tue Jan 26 2010 09:23:34 GMT+0800 (CST)" } { "_id" : ObjectId("4d65bbf53ebb3cfc9ca664e2"), "x" : "Wed Jan 27 2010 09:23:34 GMT+0800 (CST)" } { "_id" : ObjectId("4d65bbf93ebb3cfc9ca664e3"), "x" : "Sat Jan 30 2010 09:23:34 GMT+0800 (CST)" } { "_id" : ObjectId("4d65bc023ebb3cfc9ca664e4"), "x" : "Tue Feb 02 2010 09:23:34 GMT+0800 (CST)" } > > db.foo.find({"x":{$lt:new Date(2010,0,27,9,23,34)}}); { "_id" : ObjectId("4d65bbec3ebb3cfc9ca664e0"), "x" : "Sun Jan 24 2010 09:23:34 GMT+0800 (CST)" } { "_id" : ObjectId("4d65bbf23ebb3cfc9ca664e1"), "x" : "Tue Jan 26 2010 09:23:34 GMT+0800 (CST)" } > > db.foo.find({"x":{$gt:new Date(2010,0,27,9,23,34)}}); { "_id" : ObjectId("4d65bbf93ebb3cfc9ca664e3"), "x" : "Sat Jan 30 2010 09:23:34 GMT+0800 (CST)" } { "_id" : ObjectId("4d65bc023ebb3cfc9ca664e4"), "x" : "Tue Feb 02 2010 09:23:34 GMT+0800 (CST)" } > |
| #!/usr/bin/perl |
| 002 |
| 003 | use strict; |
| 004 | use warnings; |
| 005 | use Getopt::Std; # Parm passing routine |
| 006 | use MongoDB; |
| 007 | use Time::Local; |
| 008 |
| 009 | format HEADER = |
| 010 | ------------------------------------------------------------------------------ |
| 011 | Syntax : $0 -h vipname -p portnum -u usage |
| 012 |
| 013 | Options: |
| 014 |
| 015 | -h vipname |
| 016 | -p portnum - default is 27017 |
| 017 | -u usage |
| 018 |
| 019 | ------------------------------------------------------------------------------ |
| 020 | . |
| 021 |
| 022 | my $hostname; |
| 023 | my $portnum; |
| 024 | my $dbconn; |
| 025 | my $dbadmin; |
| 026 | my $dbcollection; |
| 027 |
| 028 | # --------------------- |
| 029 | # Main |
| 030 | # --------------------- |
| 031 |
| 032 | &do_opts(); |
| 033 | &db_connect(); |
| 034 | &get_stats(); |
| 035 | &db_disconnect(); |
| 036 |
| 037 | sub do_opts { |
| 038 | #-------------------------------------------------------------------------- |
| 039 | # Split the options and load variables |
| 040 | #-------------------------------------------------------------------------- |
| 041 |
| 042 | # Exempt these varaibles from needing to be declared |
| 043 | use vars '$opt_h','$opt_p','$opt_u'; |
| 044 |
| 045 | my $returncode = getopts('h:pu') ; |
| 046 |
| 047 | &do_help if (defined $opt_u or $returncode != 1 ); |
| 048 | &do_help if (! $opt_h); |
| 049 |
| 050 | $hostname = $opt_h; |
| 051 | $portnum = 27017 || $opt_p; |
| 052 | } |
| 053 |
| 054 | sub db_connect { |
| 055 | $dbconn = MongoDB::Connection->new(host => "$hostname:$portnum"); |
| 056 | $dbadmin = $dbconn->admin; |
| 057 | } |
| 058 |
| 059 | sub db_disconnect { |
| 060 | } |
| 061 |
| 062 | sub do_help { |
| 063 | #-------------------------------------------------------------------------- |
| 064 | # Give help screen and exit |
| 065 | #-------------------------------------------------------------------------- |
| 066 | $~ = "HEADER"; |
| 067 | write; |
| 068 | &quit(0); |
| 069 | } |
| 070 |
| 071 | sub quit { |
| 072 | exit; |
| 073 | } |
| 074 |
| 075 | sub get_stats { |
| 076 |
| 077 | my $result = $dbadmin->run_command({serverStatus => 1}); |
| 078 | #my $result = $dbadmin->run_command({'serverStatus' => 1, 'repl' => 2}); #didn't work with 2 parameters |
| 079 | #my $result = $dbadmin->get_collection('$cmd')->find_one(Tie::IxHash->new('serverStatus' => 1, 'repl' => 2)); #works, but complex syntax |
| 080 |
| 081 | print "current : $result->{connections}->{current}\n"; |
| 082 |
| 083 | print "resident : $result->{mem}->{resident}\n"; |
| 084 | print "mapped : $result->{mem}->{mapped}\n"; |
| 085 | print "virtual : $result->{mem}->{virtual}\n"; |
| 086 |
| 087 | print "accesses : $result->{indexCounters}->{btree}->{accesses}\n"; |
| 088 | print "hits : $result->{indexCounters}->{btree}->{hits}\n"; |
| 089 | print "misses : $result->{indexCounters}->{btree}->{misses}\n"; |
| 090 | print "resets : $result->{indexCounters}->{btree}->{resets}\n"; |
| 091 |
| 092 | print "flushes : $result->{backgroundFlushing}->{flushes}\n"; |
| 093 | print "total_ms : $result->{backgroundFlushing}->{total_ms}\n"; |
| 094 | print "average_ms : $result->{backgroundFlushing}->{average_ms}\n"; |
| 095 | print "last_ms : $result->{backgroundFlushing}->{last_ms}\n"; |
| 096 |
| 097 | print "insert : $result->{opcounters}->{insert}\n"; |
| 098 | print "query : $result->{opcounters}->{query}\n"; |
| 099 | print "update : $result->{opcounters}->{update}\n"; |
| 100 | print "delete : $result->{opcounters}->{delete}\n"; |
| 101 | print "getmore : $result->{opcounters}->{getmore}\n"; |
| 102 | print "command : $result->{opcounters}->{command}\n"; |
| 103 |
| 104 | my $lagsec = -1; |
| 105 | my $primary_optimeDate; |
| 106 | my $primary_time; |
| 107 | my $my_optimeDate; |
| 108 | my $my_time; |
| 109 | $result = $dbadmin->run_command({replSetGetStatus => 1}); |
| 110 | foreach my $repl ( @{$result->{members}} ) { |
| 111 | if ($repl->{stateStr} eq "PRIMARY") { |
| 112 | $primary_optimeDate = $repl->{optimeDate}; |
| 113 | } |
| 114 | if (exists($repl->{self}) && $repl->{self} == 1) { |
| 115 | $my_optimeDate = $repl->{optimeDate}; |
| 116 | } |
| 117 | } |
| 118 |
| 119 | #data format: 2011-09-20T21:08:04 |
| 120 | #print "$primary_optimeDate : $my_optimeDate\n"; |
| 121 | if($primary_optimeDate =~ /(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)/) { |
| 122 | my ($p_sec, $p_min, $p_hour, $p_day, $p_mon,$p_year) = ($6, $5, $4, $3, $2, $1); |
| 123 | $p_mon = $p_mon - 1; |
| 124 | $p_year = $p_year - 1900; |
| 125 | $primary_time = timegm($p_sec, $p_min, $p_hour, $p_day, $p_mon,$p_year); |
| 126 | } |
| 127 | if($my_optimeDate =~ /(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)/) { |
| 128 | my ($m_sec, $m_min, $m_hour, $m_day, $m_mon,$m_year) = ($6, $5, $4, $3, $2, $1); |
| 129 | #print "$m_sec, $m_min, $m_hour, $m_day, $m_mon, $m_year\n"; |
| 130 | $m_mon = $m_mon - 1; |
| 131 | $m_year = $m_year - 1900; |
| 132 | $my_time = timegm($m_sec, $m_min, $m_hour, $m_day, $m_mon,$m_year); |
| 133 | } |
| 134 | $lagsec = $primary_time - $my_time if($my_time && $primary_time); |
| 135 | print "$primary_time: $my_time\n"; |
| 136 | print "lagSeconds : $lagsec\n"; |
| 137 | } |
| shared:PRIMARY> db._adminCommand({replSetGetStatus : 1}); |
| 02 | { |
| 03 | "set" : "shared", |
| 04 | "date" : ISODate("2011-09-22T14:36:40Z"), |
| 05 | "myState" : 1, |
| 06 | "members" : [ |
| 07 | { |
| 08 | "_id" : 0, |
| 09 | "name" : "shared.mongodb.org:27017", |
| 10 | "health" : 1, |
| 11 | "state" : 2, |
| 12 | "stateStr" : "SECONDARY", |
| 13 | "uptime" : 28033, |
| 14 | "optime" : { |
| 15 | "t" : 1316677688000, |
| 16 | "i" : 2 |
| 17 | }, |
| 18 | "optimeDate" : ISODate("2011-09-22T07:48:08Z"), |
| 19 | "lastHeartbeat" : ISODate("2011-09-22T14:36:39Z") |
| 20 | }, |
| 21 | { |
| 22 | "_id" : 1, |
| 23 | "name" : "shared.mongodb.org:27017", |
| 24 | "health" : 1, |
| 25 | "state" : 1, |
| 26 | "stateStr" : "PRIMARY", |
| 27 | "optime" : { |
| 28 | "t" : 1316677688000, |
| 29 | "i" : 2 |
| 30 | }, |
| 31 | "optimeDate" : ISODate("2011-09-22T07:48:08Z"), |
| 32 | "self" : true |
| 33 | } |
| 34 | ], |
| 35 | "ok" : 1 |
| 36 | } |
| ./getMongoDBStats.pl -h sharedmongo1.mongodb.com |
| 02 | current : 3 |
| 03 | resident : 33 |
| 04 | mapped : 1392 |
| 05 | virtual : 3915 |
| 06 | accesses : 1 |
| 07 | hits : 1 |
| 08 | misses : 0 |
| 09 | resets : 0 |
| 10 | flushes : 10508 |
| 11 | total_ms : 27876 |
| 12 | average_ms : 2.65283593452608 |
| 13 | last_ms : 0 |
| 14 | insert : 0 |
| 15 | query : 9 |
| 16 | update : 164909 |
| 17 | delete : 32 |
| 18 | getmore : 164897 |
| 19 | command : 253693 |
| 20 | 1316677688: 1316677688 |
| 21 | lagSeconds : 0 |
Of course, it’s a quite simple one for MongoDB administrator. But it’s a good and great start