2015-05-23 2 views
4

Я использую mongodb v3.0 и пытаюсь сделать осколки с мечеными осколками. Документация mongodb v3.0 documentation показывает, как ее настроить.MongoDB хранит данные только для первичного осколка в случае выбора пометки осколка ключа

У меня 2 осколка:

mongos> sh.addShardTag("shard0000", "USA") 
mongos> sh.addShardTag("shard0001", "EU") 

и коллекция для сегментирование является test_collection:

mongos> db.printShardingStatus() 
--- Sharding Status --- 
    sharding version: { 
"_id" : 1, 
"version" : 3, 
"minCompatibleVersion" : 3, 
"currentVersion" : 4, 
"clusterId" : ObjectId("555df7f4f6506e6ba07e1f20") 
} 
    shards: 
{ "_id" : "shard0000", "host" : "127.0.0.1:27017", "tags" : [ "USA" ] } 
{ "_id" : "shard0001", "host" : "127.0.0.1:27018", "tags" : [ "EU" ] } 
    databases: 
{ "_id" : "admin", "partitioned" : false, "primary" : "config" } 
{ "_id" : "test_collection", "partitioned" : true, "primary" : "shard0000" } 

Как вы можете видеть, в этом случае он выбирает shard0000 как первичный. Когда я меченый сбор и включен сбором за шардинг:

mongos> sh.addTagRange("test_collection.items", {country: "USA"}, {country: "USA"}, "USA") 
mongos> sh.addTagRange("test_collection.items", {country: "EU"}, {country: "EU"}, "EU") 
mongos> db.runCommand({shardCollection: "test_collection.items", key: {"_id": "hashed"}}) 

и вставленные данные (около 20K элементов), я проверил Статус

mongos> db.printShardingStatus() 
--- Sharding Status --- 
    sharding version: { 
"_id" : 1, 
"version" : 3, 
"minCompatibleVersion" : 3, 
"currentVersion" : 4, 
"clusterId" : ObjectId("555df7f4f6506e6ba07e1f20") 
} 
    shards: 
{ "_id" : "shard0000", "host" : "127.0.0.1:27017", "tags" : [ "USA" ] } 
{ "_id" : "shard0001", "host" : "127.0.0.1:27018", "tags" : [ "EU" ] } 
    databases: 
{ "_id" : "admin", "partitioned" : false, "primary" : "config" } 
{ "_id" : "test_collection", "partitioned" : true, "primary" : "shard0000" } 
    test_collection.items 
    shard key: { "_id" : "hashed" } 
    chunks: 
    shard0000 1 
    { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 
    tag: EU { "country" : "EU" } -->> { "country" : "EU" } 
    tag: USA { "country" : "USA" } -->> { "country" : "USA" } 

Таким образом, было применен шард теги, но данные были написаны только для первичного осколка.

Каждый шаг, который я сделал в соответствии с руководством, так может кто-нибудь скажет мне, что я пропустил в конфигурации? Такое же поведение проявляется только в случае выбора меток осколков. Без меток, например. только с помощью ключа осколка он работает правильно и данные хранятся в обоих осколках.

ответ

1

Проблема заключается в том, что ваш ключ осколка - это хешированный столбец «_id», но вы помечены в столбце «страна».

Согласно документации, это не представляется возможным:

MongoDB поддерживает мечения диапазон шарда ключевых значений столбца

http://docs.mongodb.org/manual/core/tag-aware-sharding/

Вы должны сделать "страна" часть вашего ключа осколка.

0

Спасибо, Борут!

Я пробовал на самом деле «страну» как ключ осколка, но он также не работал. Возможно, я сделал еще одну ошибку в настройке. Но после вышеупомянутого комментария я повторил все шаги и правильно выполнил настройку конфигурации.

Итак, я пост ниже всего потока шаг за шагом, чтобы получить копию конфигурации:

  • После маркировки черепки с тэгами (уже были добавлены осколками) проверить состояние
shardingversion: { 
    "_id": 1, 
    "version": 3, 
    "minCompatibleVersion": 3, 
    "currentVersion": 4, 
    "clusterId": ObjectId("555df7f4f6506e6ba07e1f20") 
}shards: { 
    "_id": "shard0000", 
    "host": "127.0.0.1:27000", 
    "tags": [ 
    "USA" 
    ] 
}{ 
    "_id": "shard0001", 
    "host": "127.0.0.1:270001", 
    "tags": [ 
    "EU" 
    ] 
}databases: { 
    "_id": "admin", 
    "partitioned": false, 
    "primary": "config" 
}{ 
    "_id": "test_db", 
    "partitioned": true, 
    "primary": "shard0000" 
} 
  • Затем добавьте ключ осколка к коллекции мы будем использовать

db.runCommand({shardCollection: "test_db.items", key: {"country": 1}})

Примечание: в этом случае я выбрал ключ как можно более простым, но в реальных системах вы должны выбрать его более тщательно.

Добавить тег диапазоны для наших осколков: sh.addTagRange("test_db.items", {country: "MX"}, {country: "USA"}, "USA") sh.addTagRange("test_db.items", {country: "ES"}, {country: "GER"}, "EU")

sharding version: { 
     "_id" : 1, 
     "minCompatibleVersion" : 4, 
     "currentVersion" : 5, 
     "clusterId" : ObjectId("556376557b13cb3ac8b90b49") 
} 
    shards: 
     { "_id" : "shard0000", "host" : "127.0.0.1:27000", "tags" : [ "USA" ] 
} 
     { "_id" : "shard0001", "host" : "127.0.0.1:27001", "tags" : [ "EU" ] } 

    databases: 
     { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
     { "_id" : "test_db", "partitioned" : true, "primary" : "shard0000" } 
       test_db.items 
         shard key: { "country" : 1 } 
         chunks: 
           shard0000  2 
           shard0001  1 
         { "country" : { "$minKey" : 1 } } -->> { "country" : "ES 
" } on : shard0000 Timestamp(2, 1) 
         { "country" : "ES" } -->> { "country" : "MX" } on : shar 
d0001 Timestamp(2, 0) 
         { "country" : "MX" } -->> { "country" : { "$maxKey" : 1 
} } on : shard0000 Timestamp(1, 2) 
         tag: EU { "country" : "ES" } -->> { "country" : "GER" 
} 
         tag: USA { "country" : "MX" } -->> { "country" : "USA" 
} 
  • Хорошо, давайте добавим элементов в коллекцию
for(var i=0; i<1000; i++) 
{ 
    db.items.insert({"model": "One", "country":"EU"}); 
    db.items.insert({"model": "iPhone", "country": "US"}); 
} 

for(var i=0; i<10;++i) 
{ 
    db.items.insert({"model":"X", "country":"EU"}); 
} 

Наших expectati on - получить 1K элементов на одном осколке и 1K + 10 на втором осколке.

Смотрите результат:

db.items.stats() 
{ 
     "sharded" : true, 
     "userFlags" : 1, 
     "ns" : "test_db.items", 
     "count" : 2010, 
     "numExtents" : 6, 
     "size" : 225120, 
     "storageSize" : 344064, 
     "totalIndexSize" : 155344, 
     "indexSizes" : { 
       "_id_" : 81760, 
       "country_1" : 73584 
     }, 
     "avgObjSize" : 112, 
     "nindexes" : 2, 
     "nchunks" : 3, 
     "shards" : { 
       "shard0000" : { 
         "ns" : "test_db.items", 
         "count" : 1000, 
         "size" : 112000, 
         "avgObjSize" : 112, 
         "numExtents" : 3, 
         "storageSize" : 172032, 
         "nindexes" : 2, 
         "lastExtentSize" : 131072, 
         "paddingFactor" : 1, 
         "userFlags" : 1, 
         "totalIndexSize" : 81760, 
         "indexSizes" : { 
           "_id_" : 40880, 
           "country_1" : 40880 
         }, 
         "ok" : 1 
       }, 
       "shard0001" : { 
         "ns" : "test_db.items", 
         "count" : 1010, 
         "size" : 113120, 
         "avgObjSize" : 112, 
         "numExtents" : 3, 
         "storageSize" : 172032, 
         "nindexes" : 2, 
         "lastExtentSize" : 131072, 
         "paddingFactor" : 1, 
         "userFlags" : 1, 
         "totalIndexSize" : 73584, 
         "indexSizes" : { 
           "_id_" : 40880, 
           "country_1" : 32704 
         }, 
         "ok" : 1 
       } 
     }, 
     "ok" : 1 
} 

Проверить "подсчета" полей на каждой статистике шарда.

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