MongoDB基礎教程系列--第九篇 MongoDB 分片

返回目錄html

一、分片介紹

分片(sharding)是將數據拆分,將其分散存到不一樣機器上的過程。MongoDB 支持自動分片,可使數據庫架構對應用程序不可見。對於應用程序來講,好像始終在使用一個單機的 MongoDB 服務器同樣,另外一方面,MongoDB 自動處理數據在分片上的分佈,也更容易添加和刪除分片。sql

請記住:複製是讓多臺服務器擁有一樣的數據副本,每一臺服務器都是其餘服務器的鏡像,而每個分片都與其餘分片擁有不一樣的數據子集。數據庫

一般,分片能夠用來:服務器

  • 增長可用的內存
  • 增長可用的磁盤空間
  • 減輕單臺服務器的負載
  • 處理單個 mongod 服務器沒法承受的吞吐量

二、MongoDB 分片集羣組成

MongoDB 的分片集羣由如下部分組成:架構

shard:每一個分片包含分片數據的一個子集,每一個分片能夠部署爲一個副本集測試

mongos:做爲一個查詢路由器,提供客戶端應用程序和分片集羣之間的接口。ui

config servers:配置服務器存儲羣集的元數據和配置信息。MongoDB 3.4 版本開始,配置服務器必須部署一個副本集。3d

分片集羣的配置分爲 Production Configuration 和 Development Configuration,一個用於生產環境下的配置,另個用於開發或者測試環境的配置。router

2.一、Production Configuration(生產環境配置)

在生產集羣(production cluster)中,若是集合數據是冗餘的,而且系統配置夠用,生產分片集羣部署,需知足一下幾點:server

  • 部署配置服務器包含三個成員的副本集(Deploy Config Servers as a 3 member replica set)
  • 部署每個分片能夠是三個成員的副本集(Deploy each Shard as a 3 member replica set)
  • 部署能夠有一個或多個路由(Deploy one or more mongos routers)

結構圖以下:

2.二、Development Configuration(開發環境配置)

測試或者開發環境,可使用最少的組件部署一個分片集羣,這些非生產集羣包含如下組件:

  • 具備一個成員的副本集配置服務器(A replica set config server with one member)
  • 至少一個分片做爲一個成員的副本集(At least one shard as a single-member replica set)
  • 一個 mongos 實例(One mongos instance)

結構圖以下:

注意:使用測試集羣結構,僅僅用於測試或者開發。

下面用較簡單的 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 建立配置服務器副本集(Create the Config Server Replica Set)

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 建立 Shard 副本集(Create the Shard Replica Sets)

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" }
      ]
   }
)

3.3 啓動 mongos 實例

mongos --configdb configRep/218.24.5.4.11:27017 --port 27017

MongoDB 3.4 版本中,參數 --configdb 的值必須包含副本集的名稱,這也是 MongoDB 3.4 版本爲何配置服務器要部署爲副本集的緣由。

3.4 給集羣添加分片

添加分片的操做,必須在 mongos 下操做,也就是要先連上 mongos。能夠用 sh.addShard() 方法添加分片

sh.addShard("shardRep/218.245.4.12:27017")

若是分片不用副本集,能夠這樣添加分片

sh.addShard("218.245.4.12:27017")

3.5 設置分片存儲的數據庫

MongoDB 中用 sh.enableSharding() 方法設置須要分片存儲的數據庫,連上 mongos。

sh.enableSharding("liruihuan")

3.6 設置須要分片的集合

在設置分片集合以前,咱們有必要了解一下片鍵(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() 時會建立索引。

3.7 給 user 集合添加20萬條數據

給 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 副本集的分片上了,咱們這裏只用了一個分片,你們能夠啓動多個分片,看看數據是怎麼分割的。

 

業精於勤,荒於嬉;行成於思,毀於隨。

若是你以爲這篇文章不錯或者對你有所幫助,能夠經過右側【打賞】功能,給予博主一點點鼓勵和支持

相關文章
相關標籤/搜索