http://eshilin.blog.163.com/blog/static/13288033020106215227346/
MongoDB分布式部署之分區配置
2010-07-21 17:22:07| 分類: mongodb |字型大小 訂閱
這裡介紹的是Mongodb的分區配置,如果想配置主主或主從對,以實現資料備份,可見mongodb分布式之資料複製。
1、啟動相關進程
在shard server上啟動mongod,使用--shardsvr 命令列參數。對於主從對,使用--pairwith命令列選項。建議一個shard server只運行一個mongod進程。
在config server上啟動mongod,使用--configsvr命令列參數。如果config server不是一台獨立的伺服器,為其分配一個獨立的dbpath,--dbpath命令列參數。
啟動mongos,使用--configdb參數指明配置的資料庫地址。
2、shell配置分區
在啟動好的mongos伺服器上運行這些命令,然後通過它運行所有的配置命令。註:應該使用特定的admin資料庫來儲存這些命令,儘管通過mongos運行時,資料會儲存在config server上,所以在叢集的生命週期內這些命令只需運行一次即可。
./mongo <mongos-hostname>:<mongos-port>/admin
> db
admin
>
3、增加一個分區,每個分區包括兩台伺服器(一對主從)或單機(Alpha 2隻支援單機)。
> db.runCommand( { addshard : "<serverhostname>[:<port>]" } );
{"ok" : 1 , "added" : ...}
多台配置用逗號分隔(alpha3及以上版本)。
選擇性參數maxSize可使用者佈建該分區可使用的磁碟空間,預設為整個磁碟。該參數目前1.4及1.4以前的版本是無效的,1.5版本及以後才會有效。
> db.runCommand( { listshards : 1 } );
查看已存在的分區。
4、enable一個資料庫,必須為分區enable一個資料庫,否則資料將全被存在分區上。
> db.runCommand( { enablesharding : "<dbname>" } );
一旦enable了個資料庫,mongos將會把資料庫裡的不同資料集放在不同的分區上。除非資料集被分區,否則一個資料集的所有資料將放在一個分區上。
5、資料集分區,使用shardcollection 命令分隔資料集,key自動產生。
> db.runCommand( { shardcollection : "<namespace>",
key : <shardkeypatternobject>
} )
比如,分區測試資料庫中的GridFS塊集。
> db.runCommand( { shardcollection : "test.fs.chunks", key : { _id : 1 } } )
{"ok" : 1}
配置shard key唯一:
db.runCommand( { shardcollection : "test.users" , key : { email : 1 } , unique : true } );
6、案例:
兩組分區(一組兩台,一組一台)、三個config db、一個mongos,一台測試伺服器。
首先建立資料庫存放位置,這裡只為測試,所以就在目前的目錄了,mkdir data
分別到mongodb的安裝目錄的bin/目錄下啟動mongodb
$ ./mongod --pairwith 10.13.127.212:18020 --dbpath data --port 18020 //啟動第一組分區(10.13.127.211:18020)
$ ./mongod --pairwith 10.13.127.211:18020 --dbpath data --port 18020 //啟動第一組分區(10.13.127.212:18020)
$ ./mongod --dbpath data --port 18020 //啟動第二組分區(10.13.127.210:18020)
$ ./mongod --configsvr --dbpath /var/mongodb/sky/18022 --port 18022 //啟動config server(10.13.127.210:18022,10.13.127.211:18022,10.13.127.212:18022)
$ ./mongos --configdb 10.13.127.210:18022,10.13.127.211:18022,10.13.127.212:18022 //啟動mongos,指定config server
ps:config server可以配置多台,mongos啟動時指定config server,多個config server之間用英文逗號隔開,中間注意不要有空格,而且你會發現config server的台數只能為單數不能是雙數。在這裡需要提的是,v1.4有個bug,如果一開始就mongos配置多台config,是有問題的。這時你執行./mongo命令,在執行show dbs時就會報錯:
JS Error: uncaught exception: error { "$err" : "mongos: SyncClusterConnection::call can't handle $cmd" }.
解決方案有兩個:
1)啟動mongos時先只連一台config,貌似是可以初始化一下config,然後kill掉mongos再啟動連多台config,就OK了。
2)這個bug已經在nightly修正了,下載版本時下載v1.4的nightly版本就行了。
言歸正傳,服務啟動好了之後,可使用 ps -ef|grep mongo查看運行情況,開始使用mongodb了。
$ ./mongo --host 10.13.127.211 // 串連到mongos上,可使用--port指定連接埠
> show dbs
admin
config
Local
> use admin
> db.runCommand( { addshard : "10.13.127.211:18020,10.13.127.212:18020", allowLocal : true } ) //增加第一組分區
> db.runCommand( { addshard : "10.13.127.210:18020", allowLocal : true } ) //增加第二個分區
> db.runCommand({listshards:1}) //查看分區情況,會看到分區的資訊,共兩塊
{
"_id" : ObjectId("4bd27bb39e2b00a5f7d5f0dd"),
"host" : "10.13.127.210:18020"
},
{
"_id" : ObjectId("4bd27bd39e2b00a5f7d5f0de"),
"host" : "10.13.127.211:18020,10.13.127.212:18020"
}
> config = connect("10.13.127.210:18022") //串連config server,需要在mongos伺服器上操作
> config = config.getSisterDB("config") //擷取配置資訊
> test = db.getSisterDB("test") //新增資料庫test
> db.runCommand( { enablesharding : "test" } )
> db.runCommand( { shardcollection : "test.people", key : {name : 1} } ) //建立分區資料集people
> db.printShardingStatus(); //查看分區狀態資訊,會看到shards和databases的詳細資料,包括剛建立的test的主分區資訊和test.people的分區資訊。
my chunks
{ "name" : "test", "partitioned" : true, "primary" : "10.13.127.211:18020,10.13.127.212:18020", "sharded" : { "test.people" : { "key" : { "name" : 1 }, "unique" : false } }, "_id" : ObjectId("4bd2813fbaaa646853a4b33a") }
my chunks
test.people { "name" : { $minKey : 1 } } -->> { "name" : { $maxKey : 1 } } on : 10.13.127.211:18020,10.13.127.212:18020 { "t" : 1272086852000, "i" : 1 }10.13.126.173:18020 { "t" : 1272086192000, "i" : 1 }
> use test //進入test資料庫
switched to db test
> db.createCollection("user_001") //建立資料集user_001,該資料集與people資料集不一樣,它不分區
{ "ok" : 1 }
> show collections //查看資料集情況
people
system.indexes
user_001
> db.people.insert({name:"sky_people",sex:"male",age:25}); //插入一條記錄了
> db.people.find()
{ "_id" : ObjectId("4bbc38a39e8b5e76dcf4c5a3"), "name" : "sky_people", "sex" : "male", "age" : 25 }
> db.user_001.insert({name:"Falcon.C",sex:"male",age:25});
> db.user_001.find(); //查看記錄
{ "_id" : ObjectId("4bbc371c9e8b5e76dcf4c5a2"), "name" : "sky", "sex" : "female", "age" : 25 }
>db.people.stats() //查看people資料集資訊 ,剛才插入的資料放在 10.13.127.210:18020分區上
{
"sharded" : true,
"ns" : "test.people",
"count" : 1,
"size" : 72,
"storageSize" : 8192,
"nindexes" : 2,
"nchunks" : 1,
"shards" : {
"10.13.127.211:18020,10.13.127.212:18020" : {
"ns" : "test.people",
"count" : 1,
……
> db.user_001.stats() //查看user_001資料集資訊
{
"sharded" : false,
"ns" : "test.user_001",
"count" : 1,
"size" : 68,
……
}
當資料量增大到一定程度的時候(貌似是64M,即一個資料區塊的大小),資料區塊chunks開始分塊,由一開始的一塊變成多塊時,資料區塊chunks就會開始遷移到其他分區了。
> db.printShardingStatus(); //查看分區狀態資訊
{ "name" : "test", "partitioned" : true, "primary" : "10.13.127.211:18020,10.13.127.212:18020", "sharded" : { "test.people" : { "key" : { "name" : 1 }, "unique" : false } }, "_id" : ObjectId("4bbc3524314b8edcaebd990f") }
my chunks
test.people { "name" : { $minKey : 1 } } -->> { "name" : 1103 } on : 10.13.127.211:18020,10.13.127.212:18020 { "t" : 1270627397000, "i" : 1 }
test.people { "name" : 1103 } -->> { "name" : 1259408 } on : 10.13.127.211:18020,10.13.127.212:18020 { "t" : 1270627921000, "i" : 2 }
test.people { "name" : "sky_people" } -->> { "name" : { $maxKey : 1 } } on : 10.13.127.210:18020 { "t" : 1270627404000, "i" : 3 }
test.people { "name" : 20130082 } -->> { "name" : 21392803 } on : 10.13.127.210:18020 { "t" : 1270627924000, "i" : 2 }
....
>db.people.stats()
{
"sharded" : true,
"ns" : "test.people",
"count" : 3384868,
"size" : 5293932968,
"storageSize" : 5942890496,
"nindexes" : 2,
"nchunks" : 33,
"shards" : {
"10.13.127.211:18020,10.13.127.212:18020" : {
"ns" : "test.people",
"count" : 3265179,
"size" : 5106739036,
"storageSize" : 5722345728,
"numExtents" : 32,
"nindexes" : 2,
"lastExtentSize" : 960247296,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 312467456,
"indexSizes" : {
"_id_" : 177045504,
"name_1" : 135421952
},
"ok" : 1
},
"10.13.127.210:18020" : {
"ns" : "test.people",
"count" : 119689,
"size" : 187193932,
"storageSize" : 220544768,
"numExtents" : 15,
"nindexes" : 2,
"lastExtentSize" : 43281920,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 12025856,
"indexSizes" : {
"_id_" : 7159808,
"name_1" : 4866048
},
"ok" : 1
}
},
"ok" : 1
}