В любом случае, чтобы сделать MongoDB Sharding в PHP?

Я начал использовать MongoDB для одного из моих проектов PHP. В этой базе данных я пытаюсь использовать концепцию сегментирования MongoDB. Я получил ссылку ниже и попробовал,

Пример разделения MongoDB

Это работает хорошо. Но проблема в том, что в приведенном выше примере все делается в командной строке. Но я пытаюсь сделать все на PHP. Я не могу получить какой-либо пример в PHP.

До сих пор я начал с этих кодов,

    $connection =   new Mongo();
    $db     =   $connection->selectDB('TestDB');
    $db     =   $connection->TestDB;

    $connection->selectDB('admin')->command(array('addshard'=>'host:port'));
    $connection->selectDB('admin')->command(array('enablesharding'=>'TestDB'));
    $connection->selectDB('admin')->command(array('shardcollection'=>'TestDB.large', 'key' => '_id'));

Это не работает. Кроме того, я не знаю, как настроить серверы осколков и базу данных конфигурации в PHP.

Есть ли другой способ сделать сегментацию MongoDB в PHP?


person Edwin Alex    schedule 16.06.2013    source источник
comment
Вы можете сделать это в PHP, отправляя команды базы данных в mongodb, но зачем вам это делать в PHP? Шардинг — это сложная процедура, которая требует большой работы со стороны администратора как в оболочке mongodb, так и физически на самих серверах, я думаю, что вы смотрите не на то, задавая это   -  person Sammaye    schedule 16.06.2013
comment
@Sammaye Спасибо за ответ. Проблема в том, что у нас очень много серверов, таких как тестовые, демонстрационные и рабочие. Если у меня есть php-скрипт, я могу запустить его в любое время, когда мне нужно сегментирование. Я могу выполнить на всех серверах, просто выполнив конфигурацию сервера. Вот почему я ищу это   -  person Edwin Alex    schedule 16.06.2013


Ответы (1)


Команды базы данных MongoDB чувствительны к регистру. Вы передавали имена команд в нижнем регистре, в то время как настоящие команды имеют верблюжий регистр (см.: sharding команды). Кроме того, параметр key для shardCollection должен быть объектом.

Исправленная версия приведенного выше кода будет выглядеть так:

$connection->selectDB('admin')->command(array('addShard'=>'host:port'));
$connection->selectDB('admin')->command(array('enableSharding'=>'TestDB'));
$connection->selectDB('admin')->command(array('shardCollection'=>'TestDB.large', 'key' => array('_id' => 1)));

Кроме того, вы должны были иметь возможность изучить результат команды, чтобы определить, почему это не работает. Поле ok будет равно нулю, а поле errmsg объяснит ошибку (например, «нет такой команды: addhard»).

Наконец, если вы пытаетесь имитировать функциональность оболочки для настройки сегментирования в PHP, вы можете заметить, что некоторые из методы оболочки — это больше, чем просто команды базы данных. Для любого из этих методов вы можете получить исходный код JS, опустив круглые скобки. Например:

> sh.addTagRange
function ( ns, min, max, tag ) {
    var config = db.getSisterDB( "config" );
    config.tags.update( {_id: { ns : ns , min : min } } ,
            {_id: { ns : ns , min : min }, ns : ns , min : min , max : max , tag : tag } ,
            true );
    sh._checkLastError( config );
}

Это был бы полезный намек на то, что должна делать функция addTagRange() в PHP.

person jmikola    schedule 24.06.2013