返回目錄html
分片(sharding)是將數據拆分,將其分散存到不一樣機器上的過程。MongoDB 支持自動分片,可使數據庫架構對應用程序不可見。對於應用程序來講,好像始終在使用一個單機的 MongoDB 服務器同樣,另外一方面,MongoDB 自動處理數據在分片上的分佈,也更容易添加和刪除分片。sql
請記住:複製是讓多臺服務器擁有一樣的數據副本,每一臺服務器都是其餘服務器的鏡像,而每個分片都與其餘分片擁有不一樣的數據子集。數據庫
一般,分片能夠用來:服務器
MongoDB 的分片集羣由如下部分組成:架構
shard:每一個分片包含分片數據的一個子集,每一個分片能夠部署爲一個副本集測試
mongos:做爲一個查詢路由器,提供客戶端應用程序和分片集羣之間的接口。ui
config servers:配置服務器存儲羣集的元數據和配置信息。MongoDB 3.4 版本開始,配置服務器必須部署一個副本集。3d
分片集羣的配置分爲 Production Configuration 和 Development Configuration,一個用於生產環境下的配置,另個用於開發或者測試環境的配置。router
在生產集羣(production cluster)中,若是集合數據是冗餘的,而且系統配置夠用,生產分片集羣部署,需知足一下幾點:server
結構圖以下:
測試或者開發環境,可使用最少的組件部署一個分片集羣,這些非生產集羣包含如下組件:
結構圖以下:
注意:使用測試集羣結構,僅僅用於測試或者開發。
下面用較簡單的 Development Configuration 舉例說明一下。
接下來咱們就用範例具體說明一下分片的過程,這裏準備三臺服務器,分別爲 218.245.4.十一、218.245.4.十二、218.245.4.13。
218.245.4.11 做爲配置服務器(config server),在該服務器上建立一個成員的副本集。實際項目中,須要三個成員的副本集。
218.245.4.12 做爲分片(shard)服務器,在該服務器上也建立一個成員的副本集。實際項目中,能夠建立多個分片,每一個分片也能夠是副本集。
218.245.4.13 做爲 mongos 服務器。實際項目中,能夠建立多個 mongos。
3.1.1 啓動配置服務器副本集中的成員(Start a member of the config server replica set),這裏定義副本集名字爲「configRep」,須要指定 --configsvr 參數,實際項目中用 --bind_ip 指定具體的IP地址
mongod --port 27017 --bind_ip 218.245.4.11 --configsvr --replSet configRep --dbpath c:\data\db
3.1.2 鏈接到其中一個配置服務器,用 rs.initiate() 初始化副本集
rs.initiate( { _id: "configRep", configsvr: true, members: [ { _id: 0, host : "218.245.4.11:27017" } ] } )
3.2.1 啓動 Shard 服務器副本集中的成員(Start a member of the shard replica set),這裏定義副本集名字爲「shardRep」,須要指定 --shardsvr 參數。這裏能夠不用是一個副本集,能夠是單臺 mongod 服務器。
mongod --port 27017 --bind_ip 218.245.4.12 --shardsvr --replSet shardRep --dbpath c:\data\shard
3.2.2 鏈接到 Shard 服務器,用 rs.initiate() 初始化副本集
rs.initiate( { _id: "shardRep" members: [ { _id: 0, host : "218.245.4.12:27017" } ] } )
mongos --configdb configRep/218.24.5.4.11:27017 --port 27017
MongoDB 3.4 版本中,參數 --configdb 的值必須包含副本集的名稱,這也是 MongoDB 3.4 版本爲何配置服務器要部署爲副本集的緣由。
添加分片的操做,必須在 mongos 下操做,也就是要先連上 mongos。能夠用 sh.addShard() 方法添加分片
sh.addShard("shardRep/218.245.4.12:27017")
若是分片不用副本集,能夠這樣添加分片
sh.addShard("218.245.4.12:27017")
MongoDB 中用 sh.enableSharding() 方法設置須要分片存儲的數據庫,連上 mongos。
sh.enableSharding("liruihuan")
在設置分片集合以前,咱們有必要了解一下片鍵(shard key)的概念。MongoDB是怎麼對集合分片的呢?這時候就用到了片鍵。片鍵是集合的一個鍵,MongoDB 根據這個鍵拆分數據。例如,若是選擇基於「name」進行分片,MongoDB 對根據不一樣名字進行分片:「name1」到「name100」位於第一片,「name101」到「name200」位於第二片,以此類推。
給集合分片,須要用 sh.shardCollection() 方法指定須要分片的集合和片鍵,下面例子是給 user 集合分片,片鍵爲 name,連上 mongos。
sh.shardCollection("liruihuan.user", { name : 1 } )
注意,若是這個集合包含有數據,在用 shardCollection() 以前,咱們必須用 db.collection.createIndex() 方法給片鍵建立索引。若是這個集合爲空,MongoDB 在用 shardCollection() 時會建立索引。
給 user 集合添加20萬條數據,看看集合是這麼分片的
for(var i = 0; i <200000; i++) { db.user.insert({"name":"lrh"+i,"age":18}) }
用 sh.status() 查看分片狀況
--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("58fcb9e3f6420984b3570e11") } shards: { "_id" : "shardRep", "host" : "shardRep/218.245.4.12:27017", "state" : 1 } active mongoses: "3.4.3" : 1 databases: { "_id" : "liruihuan", "primary" : "shardRep", "partitioned" : true } liruihuan.user shard key: { "name" : 1 } unique: false balancing: true chunks: shardRep 3 { "name" : { "$minKey" : 1 } } -->> { "name" : "liruihuan" } on : shardRep Timestamp(1, 1) { "name" : "liruihuan" } -->> { "name" : "lrh7" } on : shardRep Timestamp(1, 2) { "name" : "lrh7" } -->> { "name" : { "$maxKey" : 1 } } on : shardRep Timestamp(1, 3)
咱們能夠看出集合的數據被分到名爲 shardRep 副本集的分片上了,咱們這裏只用了一個分片,你們能夠啓動多個分片,看看數據是怎麼分割的。
業精於勤,荒於嬉;行成於思,毀於隨。
若是你以爲這篇文章不錯或者對你有所幫助,能夠經過右側【打賞】功能,給予博主一點點鼓勵和支持