MongoDB分布式部署之分區配置

來源:互聯網
上載者:User

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
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.