Шардинг в MongoDB

Пытаюсь протестировать шардинг в MongoDB. Например, я использую host1.com и host2.com вместо реальных имен серверов.

Итак, я создал сервер конфигурации на host1.com:

mongod --dbpath /path/to/configdb/ --configsvr

На этой же машине запущено mongos:

mongos --configdb host1.com --port 27020

И запустил mongod на двух машинах (host1.com и host2.com):

mongod --dbpath /path/to/test_shard_db/ --shardsvr

Я добавил сегменты, включил сегментирование для базы данных test и коллекцию test с ключом сегмента {'name': 1} (в коллекции есть только это поле и _id для тестирования), как описано в руководстве. Но после всех этих операций все мои данные записываются только в один шард, который является основным для базы данных.

Вот конфиг:

Статус шардинга:

mongos> db.printShardingStatus()
--- Sharding Status --- 
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
    {  "_id" : "shard0000",  "host" : "host1.com:27018",  "maxSize" : NumberLong(1) }
    {  "_id" : "shard0001",  "host" : "host2.com:27018",  "maxSize" : NumberLong(10) }
  databases:
        ...
    {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
        test.test chunks:
                shard0001   1
            { "name" : { $minKey : 1 } } -->> { "name" : { $maxKey : 1 } } on : shard0001 Timestamp(1000, 0)

Статистика коллекции:

mongos> db.printCollectionStats()
test
{
    "sharded" : false,
    "primary" : "shard0000",
    "size" : 203535788,
    ...
}

Статус балансировщика:

mongos> sh.isBalancerRunning()
true

Так почему же все данные в коллекции находятся только в одном сегменте, хотя я добавил более 1 мегабайта данных? И почему db.printCollectionStats() покажите мне эту test базу данных "sharded" : false. Что я сделал не так?


person Denis Nikanorov    schedule 04.04.2013    source источник
comment
Размер блока по умолчанию составляет 64 МБ, поэтому у вас есть место для роста до того, как произойдет разделение. Вы можете заранее разделить диапазон ключей осколков, что может позволить записи сразу в несколько осколков. Для получения дополнительной информации см. Следующее: docs. mongodb.org/manual/tutorial/   -  person James Wahlin    schedule 04.04.2013
comment
@James Wahlin, значит, maxSize и chunkSize не коррелируют друг с другом?   -  person Denis Nikanorov    schedule 04.04.2013
comment
maxSize ограничит объем данных в данном сегменте. При достижении балансировщик будет пытаться переместить фрагменты в сегмент, где maxSize не был достигнут. Чанк - это набор документов, которые попадают в часть диапазона ключей шарда. Балансировщик MongoDB будет перемещать данные между шардами на уровне блоков для балансировки. Когда чанк приближается к значению maxSize, он будет разделен на 2, что может привести к перемещению.   -  person James Wahlin    schedule 04.04.2013
comment
Тот факт, что у вас есть "primary" : "shard0000" и test.test chunks: shard0001 1 для вывода состояния, подтверждает, что первичный находится на 0000, а единственный осколок - на 0001. Другой метод двойной проверки - убедиться, что есть индекс над полем name: если ваша коллекция пуста, это создается автоматически. Если, однако, он не пуст, сегментирование не произойдет.   -  person Ori Dar    schedule 04.04.2013
comment
@ Джеймс Валин, спасибо !! Вы можете опубликовать ответ, и я его приму.   -  person Denis Nikanorov    schedule 04.04.2013


Ответы (1)


Размер блока по умолчанию составляет 64 МБ, поэтому у вас есть место для роста до того, как произойдет разделение. Вы можете заранее разделить диапазон ключей осколков, что может позволить записи сразу в несколько осколков. См. документацию по разделению блоков MongoDB для получения дополнительной информации.

О разнице между размером блока и maxSize:

maxSize ограничит объем данных в данном сегменте. При достижении балансировщик будет пытаться переместить фрагменты в сегмент, где maxSize не был достигнут. Чанк - это набор документов, которые попадают в часть диапазона ключей шарда. Балансировщик MongoDB будет перемещать данные между шардами на уровне блоков для балансировки. Когда чанк приближается к значению maxSize, он будет разделен на 2, что может привести к перемещению.

person James Wahlin    schedule 04.04.2013