У нас есть относительно простая осколочная установка MongoDB: 4 осколка с каждым осколком - это набор реплик, в котором есть как минимум 3 члена. Каждая коллекция состоит из данных, загружаемых из большого количества файлов; каждому файлу присваивается монотонно возрастающий идентификатор, а очертание выполняется на основе хэша идентификатора.MongoDB sharded collection not rebalancing
Большинство наших коллекций работают должным образом. Тем не менее, у меня есть одна коллекция, которая, похоже, не позволяет правильно распределять куски по черепам. В коллекции было загружено ~ 30 ГБ данных, прежде чем индекс был создан, и он был отложен, однако это не имеет значения, насколько мне известно. Вот статистика по коллекции:
mongos> db.mycollection.stats()
{
"sharded" : true,
"ns" : "prod.mycollection",
"count" : 53304954,
"numExtents" : 37,
"size" : 35871987376,
"storageSize" : 38563958544,
"totalIndexSize" : 8955712416,
"indexSizes" : {
"_id_" : 1581720784,
"customer_code_1" : 1293148864,
"job_id_1_customer_code_1" : 1800853936,
"job_id_hashed" : 3365576816,
"network_code_1" : 914412016
},
"avgObjSize" : 672.9578525853339,
"nindexes" : 5,
"nchunks" : 105,
"shards" : {
"rs0" : {
"ns" : "prod.mycollection",
"count" : 53304954,
"size" : 35871987376,
"avgObjSize" : 672.9578525853339,
"storageSize" : 38563958544,
"numExtents" : 37,
"nindexes" : 5,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1.0000000000050822,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 8955712416,
"indexSizes" : {
"_id_" : 1581720784,
"job_id_1_customer_code_1" : 1800853936,
"customer_code_1" : 1293148864,
"network_code_1" : 914412016,
"job_id_hashed" : 3365576816
},
"ok" : 1
}
},
"ok" : 1
}
И в sh.status() для этой коллекции:
prod.mycollection
shard key: { "job_id" : "hashed" }
chunks:
rs0 105
too many chunks to print, use verbose if you want to force print
Есть ли что-то я пропускаю, почему эта коллекция будет распространять только rs0 ? Есть ли способ заставить перебалансировку? Я выполнил те же шаги, чтобы очертить другие коллекции, и они правильно распределены. Вот статистика для коллекции, которая успешно sharded:
mongos> db.myshardedcollection.stats()
{
"sharded" : true,
"ns" : "prod.myshardedcollection",
"count" : 5112395,
"numExtents" : 71,
"size" : 4004895600,
"storageSize" : 8009994240,
"totalIndexSize" : 881577200,
"indexSizes" : {
"_id_" : 250700688,
"customer_code_1" : 126278320,
"job_id_1_customer_code_1" : 257445888,
"job_id_hashed" : 247152304
},
"avgObjSize" : 783.3697513591966,
"nindexes" : 4,
"nchunks" : 102,
"shards" : {
"rs0" : {
"ns" : "prod.myshardedcollection",
"count" : 1284540,
"size" : 969459424,
"avgObjSize" : 754.7133012595949,
"storageSize" : 4707762176,
"numExtents" : 21,
"nindexes" : 4,
"lastExtentSize" : 1229475840,
"paddingFactor" : 1.0000000000000746,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 190549856,
"indexSizes" : {
"_id_" : 37928464,
"job_id_1_customer_code_1" : 39825296,
"customer_code_1" : 33734176,
"job_id_hashed" : 79061920
},
"ok" : 1
},
"rs1" : {
"ns" : "prod.myshardedcollection",
"count" : 1287243,
"size" : 1035438960,
"avgObjSize" : 804.384999568846,
"storageSize" : 1178923008,
"numExtents" : 17,
"nindexes" : 4,
"lastExtentSize" : 313208832,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 222681536,
"indexSizes" : {
"_id_" : 67787216,
"job_id_1_customer_code_1" : 67345712,
"customer_code_1" : 30169440,
"job_id_hashed" : 57379168
},
"ok" : 1
},
"rs2" : {
"ns" : "prod.myshardedcollection",
"count" : 1131411,
"size" : 912549232,
"avgObjSize" : 806.5585644827565,
"storageSize" : 944386048,
"numExtents" : 16,
"nindexes" : 4,
"lastExtentSize" : 253087744,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 213009328,
"indexSizes" : {
"_id_" : 64999200,
"job_id_1_customer_code_1" : 67836272,
"customer_code_1" : 26522944,
"job_id_hashed" : 53650912
},
"ok" : 1
},
"rs3" : {
"ns" : "prod.myshardedcollection",
"count" : 1409201,
"size" : 1087447984,
"avgObjSize" : 771.6769885914075,
"storageSize" : 1178923008,
"numExtents" : 17,
"nindexes" : 4,
"lastExtentSize" : 313208832,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 255336480,
"indexSizes" : {
"_id_" : 79985808,
"job_id_1_customer_code_1" : 82438608,
"customer_code_1" : 35851760,
"job_id_hashed" : 57060304
},
"ok" : 1
}
},
"ok" : 1
}
sh.status() для правильной sharded коллекции:
prod.myshardedcollection
shard key: { "job_id" : "hashed" }
chunks:
rs2 25
rs1 26
rs3 25
rs0 26
too many chunks to print, use verbose if you want to force print
Что в бревнах? что находится в базе данных конфигурации? ваш балансир в настоящее время работает? Возможно ли, что первая миграция этой коллекции завершилась неудачей и оставила что-то, что предотвращает дальнейшие миграции? вы пытались вручную перенести один из кусков на другой осколок? (Sh.moveChunk ("дб.collection ", {job_id:}, toShardName), где второй аргумент указывает документ, чей фрагмент должен быть перемещен. –
Ahhhh ... спасибо, вы помогли мне разобраться. Запуск moveChunk забросил ошибку, что кусок был слишком большой, чтобы Когда я посмотрел на мои куски, я увидел, что все они были отмечены jumbo. Я полагаю, что мне придется переосмыслить ключи осколков. – Mason
ах, да, это произойдет, если ваш ключ job_id недостаточно гранулирован - вам нужен более высокий ключ осколка мощности, похоже ... Если сборка будет более тяжелой при чтении, чем в записи, вы можете использовать существующий job_id, индекс customer_code для sharding - да, увеличение ключа осколка приведет к тому, что новые вставки войдут в один и тот же но если вставки не являются большинством операций, это может дать вам хорошую изоляцию запросов и их распределение, а также адекватное распределение записи. –