2013-06-04 3 views
8

У нас есть относительно простая осколочная установка 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 
+1

Что в бревнах? что находится в базе данных конфигурации? ваш балансир в настоящее время работает? Возможно ли, что первая миграция этой коллекции завершилась неудачей и оставила что-то, что предотвращает дальнейшие миграции? вы пытались вручную перенести один из кусков на другой осколок? (Sh.moveChunk ("дб.collection ", {job_id: }, toShardName), где второй аргумент указывает документ, чей фрагмент должен быть перемещен. –

+0

Ahhhh ... спасибо, вы помогли мне разобраться. Запуск moveChunk забросил ошибку, что кусок был слишком большой, чтобы Когда я посмотрел на мои куски, я увидел, что все они были отмечены jumbo. Я полагаю, что мне придется переосмыслить ключи осколков. – Mason

+1

ах, да, это произойдет, если ваш ключ job_id недостаточно гранулирован - вам нужен более высокий ключ осколка мощности, похоже ... Если сборка будет более тяжелой при чтении, чем в записи, вы можете использовать существующий job_id, индекс customer_code для sharding - да, увеличение ключа осколка приведет к тому, что новые вставки войдут в один и тот же но если вставки не являются большинством операций, это может дать вам хорошую изоляцию запросов и их распределение, а также адекватное распределение записи. –

ответ

11

В MongoDB, когда вы идете в sharded систему, и вы не см. любые балансировки, это может быть одна из нескольких вещей.

  1. Возможно, у вас недостаточно данных для балансировки. Это определенно не ваша ситуация, но некоторые люди могут не понимать, что с размером блока размером 64 МБ может потребоваться некоторое время для вставки данных, прежде чем их достаточно, чтобы разделить и сбалансировать некоторые из них на другие куски.

  2. Балансир, возможно, не был запущен - так как ваши другие коллекции были сбалансированы, что было маловероятно в вашем случае, если эта коллекция не была отложена в последний раз после того, как балансир был остановлен по какой-то причине.

  3. Куски в вашей коллекции не могут быть перемещены. Это может произойти, если ключ осколка не достаточно гранулирован, чтобы разбить данные на достаточно маленькие куски. Как оказалось, это был ваш случай, потому что ваш ключ осколка оказался не достаточно гранулированным для этой большой коллекции - у вас есть 105 кусков (что, вероятно, соответствует числу уникальных значений job_id) и более 30 ГБ данных. Когда куски слишком велики, и балансир не может их перемещать, он отмечает их как «jumbo» (поэтому он не будет вращать колеса, пытаясь их перенести).

Как оправиться от плохого выбора ключа осколка? Обычно очень сложно изменить ключ осколка - поскольку ключ осколка неизменен, вам нужно сделать эквивалент полной миграции данных, чтобы получить его в коллекцию с другим ключом осколка. Тем не менее, в вашем случае коллекция все еще находится на одном осколке, поэтому было бы относительно легко «разукрасить» коллекцию и переписать ее с помощью нового ключа осколка. Поскольку количество job_ids относительно невелико, я бы рекомендовал использовать обычный индекс для shard на job_id, customer_code, поскольку вы, вероятно, запрашиваете его, и я предполагаю, что он всегда задается во время создания документа.