2013-09-02 39 views
5


Tôi có db ("mydb") trên mongo chứa 2 bộ sưu tập (c1 và c2). c1 đã bị băm. Tôi muốn phân tích một bộ sưu tập thứ hai theo cùng một cách. Tôi nhận được lỗi sau:không thể phân phát bộ sưu tập trên mongodb

use mydb 
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"}) 
    { 
"proposedKey" : { 
    "LOG_DATE" : "hashed" 
}, 
"curIndexes" : [ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "ns" : "mydb.c1", 
     "name" : "_id_" 
    } 
], 
"ok" : 0, 
    "errmsg" : "please create an index that starts with the shard key before sharding." 

Vì vậy, tôi đã làm

db.c2.ensureIndex({LOG_DATE: 1}) 
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"}) 

Cùng một lỗi nhưng nó cho thấy các chỉ số mới.

"proposedKey" : { 
    "LOG_DATE" : "hashed" 
}, 
"curIndexes" : [ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "ns" : "mydb.c2", 
     "name" : "_id_" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "LOG_DATE" : 1 
     }, 
     "ns" : "mydb.c2", 
     "name" : "LOG_DATE_1" 
    } 
], 
"ok" : 0, 
"errmsg" : "please create an index that starts with the shard key before sharding." 

Chỉ để chắc chắn, tôi chạy:

db.system.indexes.find() 
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydb.c1", "name" : "_id_" } 
{ "v" : 1, "key" : { "timestamp" : "hashed" }, "ns" : "mydb.c1", "name" : "timestamp_hashed" } 
{ "v" : 1, "key" : { "_id" : 1 }, "ns": "mydb.c2", "name" : "_id_" } 
{ "v" : 1, "key" : { "LOG_DATE" : 1 }, "ns" : "mydb.c2", "name" : "LOG_DATE_1" } 

tôi cố gắng một lần nữa các lệnh tương tự trên admin và nó không thành công với các lỗi tương tự.

Sau đó, tôi đã thử trên quản trị mà không bị "băm" và hoạt động.

db.runCommand({shardCollection: "mydb.c2", key: {"LOG_DATE": 1}}) 

Vấn đề: bây giờ bộ sưu tập của tôi là sharded vào cái gì mà không được băm và tôi không thể thay đổi nó (lỗi: "đã sharded")

  1. gì đó không ổn với những gì tôi đã làm?
  2. Làm cách nào để khắc phục sự cố này?

Cảm ơn trước

Thomas

+4

'EnsureIndex ({LOG_DATE:" hashed "})' http://docs.mongodb.org/manual/tutorial/create-a-hashed-index/, bạn không thể thay đổi khóa phân đoạn của mình, bạn sẽ cần phải làm lại bộ sưu tập – Sammaye

+0

Tôi đã xóa bộ sưu tập và xóa bộ sưu tập của mình nhưng tôi không thể phân phát lại. Làm thế nào để loại bỏ thông tin sharding trước khi thực hiện collection.remove()? – Thomas

+0

removeShard sẽ có thể loại bỏ siêu dữ liệu: http://docs.mongodb.org/manual/reference/command/removeShard/#dbcmd.removeShard – Sammaye

Trả lời

6

Vấn đề ban đầu là bạn không có một chỉ số băm những gì bạn đề xuất để sử dụng cho sharding đây là thông báo lỗi là về. Sau thông báo lỗi đầu tiên, khi bạn tạo chỉ mục là

{ 
    "v" : 1, 
    "key" : { 
     "LOG_DATE" : 1 
    }, 
    "ns" : "mydb.c2", 
    "name" : "LOG_DATE_1" 
} 

Bạn vẫn chỉ có một chỉ mục thông thường không phải là chỉ số băm. Nếu bạn muốn làm điều này:

db.c2.ensureIndex({LOG_DATE: "hashed"}) 

Thay vì điều này:

db.c2.ensureIndex({LOG_DATE: 1}) 

Thần sẽ là một chỉ số băm. Như bạn có thể thấy trong đầu ra của db.system.indexes.find() trên bộ sưu tập khác, bạn có một chỉ mục băm cho dấu thời gian tôi giả định đây là khóa phân đoạn cho bộ sưu tập đó.

Vì vậy, nếu bạn không có dữ liệu trong bộ sưu tập c2:

db.c2.drop() 
db.createCollection('c2') 
db.c2.ensureIndex({LOG_DATE: "hashed"}) 
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"}) 

này sẽ làm việc đúng cách.

+0

Tóm lại, nếu chúng ta có một chỉ số băm, chúng ta có thể băm mảnh vỡ trên khóa cơ bản, và nếu nó không được băm, chúng ta không thể băm mảnh vỡ trên nó. Nhưng tại sao vậy? Im cố gắng để có một hình ảnh tinh thần của các chỉ số làm việc/được thực hiện trong mongodb và tôi không thể tìm ra lý do tại sao điều này được thực thi theo cách này – Thomas

+0

Nó giống như nó được. Bạn phải có một chỉ mục trên bộ sưu tập và chỉ mục này sẽ là cơ sở của việc sharding (dữ liệu sẽ được phân đoạn thông qua các phạm vi chính của chỉ mục này). Đọc các tài liệu về, mà Sammaye đề xuất trong các ý kiến ​​cho câu hỏi của bạn. – attish

Các vấn đề liên quan