2013-12-02 3 views
1

Я пытаюсь понять следующее поведение, отображаемое моей настройкой sharding. Кажется, что данные только увеличиваются на одном осколке, поскольку я постоянно добавляю данные. Как MongoDB очерчивает или распространяет данные на разных серверах? Правильно ли я делаю это? Версия MongoDB 2.4.1, используемая здесь для OS X 10.5.MongoDB Sharding Policy

enter image description here

В соответствии с просьбой, sh.status() следующим образом:

mongos> sh.status() 
sharding version: { 
    "_id" : 1, 
    "version" : 3, 
    "minCompatibleVersion" : 3, 
    "currentVersion" : 4, 
    "clusterId" : ObjectId("52787cc2c10fcbb58607b07f") } 
shards: 
    { "_id" : "shard0000", "host" : "xx.xx.xx.xxx:xxxxx" } 
    { "_id" : "shard0001", "host" : "xx.xx.xx.xxx:xxxxx" } 
    { "_id" : "shard0002", "host" : "xx.xx.xx.xxx:xxxxx" } 
databases: 
    { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
    { "_id" : "newdb", "partitioned" : true, "primary" : "shard0001" } 
      newdb.prov 
        shard key: { "_id" : 1, "jobID" : 1, "user" : 1 } 
        chunks: 
          shard0000  43 
          shard0001  50 
          shard0002  43 
+0

Вы можете показать нам sh.status()? – Sammaye

+0

Отредактировано в соответствии с запросом. –

ответ

3

Похоже, вы выбрали очень плохой ключ осколка. Вы разбиты по значениям { "_id" : 1, "jobID" : 1, "user" : 1 } - это не будет хорошим распределением для вставок, поскольку значения _id монотонно увеличиваются, так как вы используете значения ObjectId() для _id.

Вы хотите выбрать ключ осколка, который представляет, как вы получаете доступ к данным - не имеет смысла, что после _id у вас есть еще два поля - поскольку _id уникален, два других поля никогда не будут использоваться для разделения данные.

Возможно, вы намерены очертить на jobID, пользователь? Трудно понять, какой лучший ключ осколка будет в вашем случае, но ясно, что все вставки входят в самый высокий фрагмент (верхнее значение через maxKey), поскольку каждый новый _id является более высоким значением, чем предыдущий.

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

+0

Балансир работает по умолчанию? Я помню, что я оштрафовал использование jobID и пользователя без _id, но, похоже, не так ... –

+1

sh.status() показывает вам, что такое ключ осколка. Может быть, вы намеревались обмануть это, но ... и да, балансир включен по умолчанию. –