我成立了一個MongoDB的碎片羣在Windows首次作爲解釋在這裏:http://docs.mongodb.org/manual/tutorial/deploy-shard-cluster/的MongoDB會將所有數據發送到一個服務器在分片集羣
我用下面的腳本起牀配置服務器,mongos實例和mongo數據服務器。
function get-cnfgServerObj($port, $path) {
$firstCnfgSrv = New-Object PSObject
$firstCnfgSrv | Add-Member Noteproperty -Name Port -value $port
$firstCnfgSrv | Add-Member Noteproperty -Name Path -value $path
return $firstCnfgSrv;
}
$mongodPath = "..\mongod.exe"
$mongosPath = "..\mongos.exe"
$cnfgServers = @(
(get-cnfgServerObj -port 20001 -path "..\data\configdb20001"),
(get-cnfgServerObj -port 20002 -path "..\data\configdb20002"),
(get-cnfgServerObj -port 20003 -path "..\data\configdb20003")
)
$dataServers = @(
(get-cnfgServerObj -port 27001 -path "..\data\shdb1"),
(get-cnfgServerObj -port 27002 -path "..\data\shdb2")
)
# Create the mongo config servers first
$cnfgServers | foreach {
if((Test-Path $_.Path) -eq $false)
{
New-Item -Path $_.Path -ItemType Directory
}
$args = "--configsvr --dbpath $($_.Path) --port $($_.Port)"
start-process $mongodPath $args -windowstyle Normal
}
# Create the mongo servers
$dataServers | foreach {
if((Test-Path $_.Path) -eq $false)
{
New-Item -Path $_.Path -ItemType Directory
}
$args = "--dbpath $($_.Path) --port $($_.Port)"
start-process $mongodPath $args -windowstyle Normal
}
# Create the mongos instances
$mongosArgs = "--configdb localhost:20001,localhost:20002,localhost:20003"
start-process $mongosPath $mongosArgs -windowstyle Normal
我運行上面的腳本後,我連接mongos實例:
mongo --host localhost --port 27017
後來,我加入碎片並啓用了分片對數據庫和集合:
// add servers as shards
sh.addShard("localhost:27001")
sh.addShard("localhost:27002")
// Enable sharding on 'foo' db
sh.enableSharding("foo")
// Enable sharding on 'testData' collection of 'foo' database
sh.shardCollection("foo.testData", { "x": 1, "_id": 1 })
最後,我在mongo shell(它連接到mongos實例)中運行以下注釋:
use foo
// init data
for (var i = 1; i <= 2500; i++) db.testData.insert({ x : i })
後來,我連接到我的數據服務器中的一個:
mongo --host localhost --port 27001
當我嘗試看看TESTDATA集合內的文件的數量,我看到這個號碼是2500,其代表所有的計數文檔:
use foo
db.testData.count()
簡單地說,數據在所有分片中都沒有負載平衡。我在這裏做錯了什麼?
編輯:
這裏是sh.status()命令的結果:
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 3,
"minCompatibleVersion" : 3,
"currentVersion" : 4,
"clusterId" : ObjectId("535673272850501ad810ff51")
}
shards:
{ "_id" : "shard0000", "host" : "localhost:27001" }
{ "_id" : "shard0001", "host" : "localhost:27002" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0000" }
{ "_id" : "foo", "partitioned" : true, "primary" : "shard0000" }
foo.testData
shard key: { "x" : 1, "_id" : 1 }
chunks:
shard0001 1
shard0000 1
{ "x" : { "$minKey" : 1 }, "_id" : { "$minKey" : 1 } } -
->> { "x" : 1, "_id" : ObjectId("53567411cb144434eb53f08d") } on : shard0001 Tim
estamp(2, 0)
{ "x" : 1, "_id" : ObjectId("53567411cb144434eb53f08d")
} -->> { "x" : { "$maxKey" : 1 }, "_id" : { "$maxKey" : 1 } } on : shard0000 Tim
estamp(2, 1)
謝謝。所以,當它達到某個點(某些定義的大小等)時,mongo將開始在分片之間平衡數據,對嗎?我連接到一個mongod實例以查看文檔的數量。我通過mongos進行了寫作。 – tugberk
@tugberk確實應該,嘗試插入200萬記錄 – Sammaye
會做。那裏的「大塊」是極限嗎? – tugberk