1

バックアップ目的で fsyncLock() を使用して mongoDB がロックされている時間を確認する nagios チェックを構築しようとしています (たとえば、iSCSI スナップショット スクリプトが失敗し、mongo がロック解除されていない場合)。

シンプルに使おうと思ってた

    $currentLock->run_command({currentOp => 1})
    $isLocked = $currentLock->{fsyncLock}

しかし、run_command() は currentOp をまだサポートしていないようです。(そこに見られるように: https://github.com/MLstate/opalang/blob/master/lib/stdlib/apis/mongo/commands.opa )

mongo が perl スクリプトでロックされているかどうかを確認する方法について、誰かアドバイスをいただけませんか? そうでない場合は、バッシュに行くと思います。db.eval('db.currentOp()') を使用することを考えていましたが、少し迷っています。

ありがとう!

4

2 に答える 2

2

私は実際に bash のソリューションに切り替えることにしました (後でデータを処理するのがより簡単になります)。

currentOp=`mongo --port $port --host $host --eval "printjson(db.currentOp())"`

それからある種のgrep -Po '"fsyncLock" : \d'

Perlの洞察に感謝しますが、完全に機能しました

于 2013-02-08T17:39:39.250 に答える
2

直接run_command行うことをサポートしていないあなたは正しいです。ただし、シェルcurrentOpでの実装を見ると、内部でどのように機能するかがわかります。db.currentOpmongo

> db.currentOp
function (arg) {
    var q = {};
    if (arg) {
        if (typeof arg == "object") {
            Object.extend(q, arg);
        } else if (arg) {
            q.$all = true;
        }
    }
    return this.$cmd.sys.inprog.findOne(q);
}

したがって$cmd.sys.inprog、Perl 側で特別なコレクションを照会inprogして、シェルで返されるのと同じ配列を取得できます。

use strict;
use warnings;

use MongoDB;

my $db = MongoDB::MongoClient->new->get_database( 'test' );
my $current_op = $db->get_collection( '$cmd.sys.inprog' )->find_one;

サーバーがロックされていない$current_op場合、次のような構造を返します。

{
      'inprog' => [
                  {
                    'connectionId' => 53,
                    'insert' => {},
                    'active' => bless( do{\(my $o = 0)}, 'boolean' ),
                    'lockStats' => {
                                   'timeAcquiringMicros' => {
                                                            'w' => 1,
                                                            'r' => 0
                                                          },
                                   'timeLockedMicros' => {
                                                         'w' => 9,
                                                         'r' => 0
                                                       }
                                 },
                    'numYields' => 0,
                    'locks' => {
                               '^' => 'w',
                               '^test' => 'W'
                             },
                    'waitingForLock' => $VAR1->{'inprog'}[0]{'active'},
                    'ns' => 'test.fnoof',
                    'client' => '127.0.0.1:50186',
                    'threadId' => '0x105a81000',
                    'desc' => 'conn53',
                    'opid' => 7152352,
                    'op' => 'insert'
                  }
                ]
    };

の間、fsyncLock()空のinprog配列を取得しますが、役立つinfoフィールドと予想されるfsyncLockブール値があります。

    {
      'info' => 'use db.fsyncUnlock() to terminate the fsync write/snapshot lock',
      'fsyncLock' => bless( do{\(my $o = 1)}, 'boolean' ),   # <--- that's true
      'inprog' => []
    };

したがって、すべてをまとめると、次のようになります。

use strict;
use warnings;

use MongoDB;

my $db = MongoDB::MongoClient->new->get_database( 'fnarf' );
my $current_op = $db->get_collection( '$cmd.sys.inprog' )->find_one;

if ( $current_op->{fsyncLock} ) {
    print "fsync lock is currently ON\n";
} else {
    print "fsync lock is currently OFF\n";
}
于 2013-02-08T05:07:01.657 に答える