4

db.currentOp()現在実行中のクエリを確認するために、mongodb ReplicaSet のさまざまなメンバーに対してコマンドを実行しようとしています。

私がデータを取得するのはマスターだけで、すべてのセカンダリは次のように応答します。

array(3) {
  'errmsg' =>
  string(10) "not master"
  'note' =>
  string(16) "from execCommand"
  'ok' =>
  double(0)
}

テストコード:

<?php

$servers = array();
$servers['primary'] = new MongoClient('mongodb://primary:27017');
$servers['secondary1'] = new MongoClient('mongodb://secondary1:27017');
$servers['secondary2'] = new MongoClient('mongodb://secondary2:27017');

foreach ($servers as $name => $client) {
    echo $name . ':' . PHP_EOL. PHP_EOL;
    /* @var $client \MongoClient */
    $admin = $client->selectDB('admin');
    var_dump($admin->execute('db.currentOp()'));
    echo PHP_EOL;
}

Mongo シェルを使用してセカンダリに接続するとdb.currentOP()、問題なくシェルで実行できます。

RoboMongo ( http://robomongo.org/ ) を使用してセカンダリに接続するとdb.currentOP()、問題なくシェルで実行できます。

MongoVue ( http://www.mongovue.com/ ) を使用してセカンダリに接続すると、サーバー ページで実行中のクエリを確認できます。

それで、私は何か間違ったことをしていますか、それともphpでセカンダリに対してこのコマンドを実行することはサポートされていませんか?

他の言語のように見えるため、セカンダリからデータを取得することが可能です。

これを何らかの形でphpから実行するためのヒントをいただければ幸いです。

テスト環境

MongoDB サーバー: 2.2.2 (プライマリ 1 つ、セカンダリ 2 つの ReplicaSet)

PHP: 5.4.9 / 5.3.5

MongoDB PHP ドライバー: 1.4.4 / 1.3.0 on ubuntu 13.04 / debian

解決:

<?php

$servers = array();
$servers['primary'] = new MongoClient('mongodb://primary:27017');
$servers['secondary1'] = new MongoClient('mongodb://secondary1:27017');
$servers['secondary2'] = new MongoClient('mongodb://secondary2:27017');

foreach ($servers as $name => $client) {
    echo $name . ':' . PHP_EOL. PHP_EOL;
    /* @var $client \MongoClient */
    $admin = $client->selectDB('admin');
    var_dump($admin->selectCollection('$cmd.sys.inprog')->findOne());
    echo PHP_EOL;
}
4

0 に答える 0