shared Server 分片

小亮520cl發表於2015-09-15

                   這是一種將海量的資料水平擴充套件的資料庫叢集系統,資料分表儲存在 sharding 的各個節點
上,使用者透過簡單的配置就可以很方便地構建一個分散式 MongoDB 叢集。

MongoDB 的資料分塊稱為 chunk。每個 chunk 都是 Collection 中一段連續的資料記錄,通
常最大尺寸是 200MB,超出則生成新的資料塊。

要構建一個 MongoDB Sharding Cluster,需要三種角色:
Shard Server
即儲存實際資料的分片,每個 Shard 可以是一個 mongod 例項,也可以是一組 mongod 例項
構成的 Replica Set。為了實現每個 Shard 內部的 auto-failover, MongoDB 官方建議每個 Shard
為一組 Replica Set。

Config Server
為了將一個特定的 collection 儲存在多個 shard 中,需要為該 collection 指定一個 shard key,
例如{age: 1} , shard key 可以決定該條記錄屬於哪個 chunk。 Config Servers 就是用來儲存:
所有 shard 節點的配置資訊、每個 chunk 的 shard key 範圍、 chunk 在各 shard 的分佈情況、
該叢集中所有 DB 和 collection 的 sharding 配置資訊。

Route Process
這是一個前端路由,客戶端由此接入,然後詢問 Config Servers 需要到哪個 Shard 上查詢或
儲存記錄,再連線相應的 Shard 進行操作,最後將結果返回給客戶端。客戶端只需要將原本
發給 mongod 的查詢或更新請求原封不動地發給 Routing Process,而不必關心所操作的記錄
儲存在哪個 Shard 上。
下面我們在同一臺物理機器上構建一個簡單的 Sharding Cluster:
Shard Server 1: 20000
Shard Server 2: 20001
Config Server : 30000
Route Process: 40000



1 建立shared Server

  1. mkdir - p /data/shard/s0 - - 建立資料目錄

  2. mkdir - p /data/shard/s1

  3. mkdir - p /data/shard/log - - 建立日誌目錄

  4. /Apps/mongo/bin/mongod - - shardsvr - - port 20000 - - dbpath /data/shard/s0 - - fork - - logpath

  5. /data/shard/log/s0 . log - - directoryperdb - - 啟動 Shard Server 例項 1 ---一個分片

  6. /Apps/mongo/bin/mongod - - shardsvr - - port 20001 - - dbpath /data/shard/s1 - - fork - - logpath

  7. /data/shard/log/s1 . log - - directoryperdb - - 啟動 Shard Server 例項 2   --一個分片


2 啟動 Config Server

  1. mkdir - p /data/shard/config - - 建立資料目錄

  2. /Apps/mongo/bin/mongod - - configsvr - - port 30000 - - dbpath /data/shard/config - - fork - - logpath

  3. /data/shard/log/config . log - - directoryperdb - - 啟動 Config Server 例項


3 啟動 Route Process

點選( 此處 )摺疊或開啟

  1. /Apps/mongo/bin/mongos - - port 40000 - - configdb localhost : 30000 - - fork - - logpath

  2. /data/shard/log/route . log - - chunkSize 1 - - 啟動 Route Server 例項,和下面一樣 最好寫i p




4配置 Sharding

  1. 接下來,我們使用 MongoDB Shell 登入到 mongos,新增 Shard 節點

  2. [ root@localhost ~ ] # /Apps/mongo/bin/mongo admin - - port 40000 - - 此操作需要連線 admin 庫

  3. MongoDB shell version : 1 . 8 . 1

  4. connecting to : 127 . . . 1 : 40000/admin

  5. > db . runCommand ( { addshard : "localhost:20000" } ) - - 新增 Shard Server,最好寫ip

  6. { "shardAdded" : "shard0000" , "ok" : 1 }


  7. > db . runCommand ( { addshard : "localhost:20001" } )

  8. { "shardAdded" : "shard0001" , "ok" : 1 }


  9. > db . runCommand ( { enablesharding : "test" } )

  10. [這裡只是標識這個資料庫可以啟用分片,但實際上新建的文件並沒有進行分片]

  11. { "ok" : 1 }


  12. > db . runCommand ( { shardcollection : "test.users" , key : { _id : 1 }} ) - - 設定分片的集合名稱,且必

  13. 須指定 Shard Key,系統會自動建立索引

  14. { "collectionsharded" : "test.users" , "ok" : 1 }

  15. 或者命令:

  16. sh.shardCollection("welike_mongo.userRelationMongo",{_id:1})



5驗證 Sharding 正常工作

  1. 我們已經對 test . users 表進行了分片的設定,下面我們們插入一些資料看一下結果

  2. > use test

  3. switched to db test

  4. > for ( var i = 1 ; i < = 500000 ; i + + ) db . users . insert ( { age : i , name : "wangwenlong" , addr : "Beijing" ,

  5. country : "China" } )

  6. > db . users . stats ( )

  7. {

  8. "sharded" : true , - - 說明此表已被 shard

  9. "ns" : "test.users" ,

  10. "count" : 500000 ,

  11. "size" : 48000000 ,

  12. "avgObjSize" : 96 ,

  13. "storageSize" : 66655232 ,

  14. "nindexes" : 1 ,

  15. "nchunks" : 43 ,

  16. "shards" : {

  17. "shard0000" : { - - 在此分片例項上約有 24 . 5M 資料

  18. "ns" : "test.users" ,

  19. "count" : 254889 ,

  20. "size" : 24469344 ,

  21. "avgObjSize" : 96 ,

  22. 79 / 91

  23. "storageSize" : 33327616 ,

  24. "numExtents" : 8 ,

  25. "nindexes" : 1 ,

  26. "lastExtentSize" : 12079360 ,

  27. "paddingFactor" : 1 ,

  28. "flags" : 1 ,

  29. "totalIndexSize" : 11468800 ,

  30. "indexSizes" : {

  31. "_id_" : 11468800

  32. } ,

  33. "ok" : 1

  34. } ,

  35. "shard0001" : { - - 在此分片例項上約有 23 . 5M 資料

  36. "ns" : "test.users" ,

  37. "count" : 245111 ,

  38. "size" : 23530656 ,

  39. "avgObjSize" : 96 ,

  40. "storageSize" : 33327616 ,

  41. "numExtents" : 8 ,

  42. "nindexes" : 1 ,

  43. "lastExtentSize" : 12079360 ,

  44. "paddingFactor" : 1 ,

  45. "flags" : 1 ,

  46. "totalIndexSize" : 10649600 ,

  47. "indexSizes" : {

  48. "_id_" : 10649600

  49. } ,

  50. "ok" : 1

  51. }

  52. } ,

  53. "ok" : 1

  54. }

  55. >



7列出所有的 Shard Server

  1. > db . runCommand ( { listshards : 1 } ) - - 列出所有的 Shard Server

  2. {

  3. "shards" : [

  4. {

  5. "_id" : "shard0000" ,

  6. "host" : "localhost:20000"

  7. } ,

  8. {

  9. "_id" : "shard0001" ,

  10. "host" : "localhost:20001"

  11. }

  12. ] ,

  13. "ok" : 1

  14. }




8 檢視 Sharding 資訊

  1. > printShardingStatus ( )  等價  sh.status()      - - 檢視 所有表的Sharding 資訊

  2. - - - Sharding Status - - -

  3. sharding version : { "_id" : 1 , "version" : 3 }

  4. shards :

  5. { "_id" : "shard0000" , "host" : "localhost:20000" }

  6. { "_id" : "shard0001" , "host" : "localhost:20001" }

  7. databases :

  8. { "_id" : "admin" , "partitioned" : false , "primary" : "config" }

  9. { "_id" : "test" , "partitioned" : true , "primary" : "shard0000" }

  10. test . users chunks :

  11. shard0000 1     ----test.users在shard0000 上有一個chunks塊

  12. { "_id" : { $minKey : 1 } } - - > > { "_id" : { $maxKey : 1 } } on :

  13. shard0000 { "t" : 1000 , "i" : 0 }

  14. >


判斷是否是 Sharding

點選( 此處 )摺疊或開啟

  1. > db . runCommand ( { isdbgrid : 1 } )

  2. { "isdbgrid" : 1 , "hostname" : "localhost" , "ok" : 1 }





 對現有的表進行 Sharding
剛才我們是對錶 test.users 進行分片了,下面我們將對庫中現有的未分片的表 test.users_2 進
行分片處理
表最初狀態如下,可以看出他沒有被分片過:
> db.users_2.stats()  或者 db.hotFeedMongo.stats().sharded
{
"ns" : "test.users_2",
"sharded" : false,
"primary" : "shard0000",
"ns" : "test.users_2",
"count" : 500000,
"size" : 48000016,
"avgObjSize" : 96.000032,
"storageSize" : 61875968,
"numExtents" : 11,
"nindexes" : 1,
"lastExtentSize" : 15001856,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 20807680,
"indexSizes" : {
"_id_" : 20807680
},
"ok" : 1
}
對其進行分片處理:
> use admin
switched to db admin
> db.runCommand({ shardcollection: "test.users_2", key: { _id:1 }})
{ "collectionsharded" : "test.users_2", "ok" : 1 }
再次檢視分片後的表的狀態,可以看到它已經被我們分片了
> use test
switched to db test
> db.users_2.stats()
{
"sharded" : true,
"ns" : "test.users_2",
"count" : 505462,
……
"shards" : {
"shard0000" : {
"ns" : "test.users_2",
……
"ok" : 1
},
"shard0001" : {
"ns" : "test.users_2",
……
"ok" : 1
}
},
"ok" : 1
}
>




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1800199/,如需轉載,請註明出處,否則將追究法律責任。

相關文章