2013-02-08 4 views
1

iSCSI 스냅 샷 스크립트가 폭파되고 몽고 (mongoDB)가 잠겨있는 경우 백업을 위해 fsyncLock()을 사용하여 mongoDB가 잠겨있는 시간을 확인하기 위해 Nagios 검사를 작성하려고합니다. 나는 간단한perl에서 mongo db의 fsynclock 상태 가져 오기

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

사용에 대한 생각

) 예를 들어 잠금을 해제하지만 아직 currentOp를 지원하지 않습니다() run_command처럼 보인다되지 않습니다. (거기에 보이는 바와 같이 : https://github.com/MLstate/opalang/blob/master/lib/stdlib/apis/mongo/commands.opa)

누구도 몽구스가 펄 스크립트로 잠겨 있는지 확인하는 방법에 대한 조언을 갖고 있습니까? 그렇지 않다면 나는 배쉬를 구할 것입니다. db.eval ('db.currentOp()'사용에 대해 생각하고 있었지만 약간 손실되었습니다.

감사합니다.

답변

2

run_commandcurrentOp을 직접 수행 할 수 없습니다.

> 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); 
} 

그래서 우리가 같은 inprog 배열을 얻기 위해 펄 측의 특별 징수 $cmd.sys.inprog를 조회 할 수 있습니다 : 우리는 mongodb.currentOp의 구현을 보면 그것이 후드 아래에 어떻게 작동하는지 그러나, 우리는 볼 수 있습니다 그 껍질에 반환됩니다. 서버가 가 잠겨 있지 경우

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 구조를 반환합니다 fsyncLock() 동안

{ 
     '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' 
        } 
       ] 
    }; 

을, 당신은 빈 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' => [] 
    }; 
모두 함께 넣어 그래서

, 우리가 얻을 : 나는 실제로 bash는 해결책을 전환하기로 결정

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"; 
} 
+1

을했다. 고마워요! –

1

(쉽게에 대한 나중에 데이터에 대해 수행 할 작업) :

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

그런 다음 펄 통찰력 grep -Po '"fsyncLock" : \d'

감사의 일종하지만, 그것은 그 매력처럼 작동 놀라 울 정도로 정확한 대답 완벽하게 잘