程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> MongoDB基礎(九)分片

MongoDB基礎(九)分片

編輯:DB2教程

MongoDB基礎(九)分片


分片(sharding)是通過多台服務器存儲數據的方法。Mongodb使用分片可支持部署非常大的數據集和高的吞吐量操作。單台服務器的能力在各方面都有限,如CPU、IO、RAM、存儲空間等。解決擴展的問題,數據庫提供了兩種方法:垂直擴展和分片。

垂直擴展:增加CPU、RAM,存儲資源等,這也受限於硬件設備。而有些基於雲的供應商也規定用戶使用小的系統。

分片(水平擴展):劃分數據集,將數據分布到多台服務器中,每個碎片(chard)是一個獨立的數據庫,這些碎片共同組成了一個邏輯的數據庫。(這類似於Windows動態磁盤條帶化一樣)

Mongodb 中的分片集群結構如下:

\

 

分片集群有三個組件:shards,query routers 和 configservers。

Shards:碎片,存儲數據,提供高可用性和數據的一致性。分片集群中,每個碎片都是一個復制集。

query routers:查詢路由,或稱mongos實例,客戶端應用程序直接操作碎片的接口。查詢路由處理和定位操作到碎片中並返回相關數據到客戶端。一個分片集群包含多個查詢路由來劃分客戶端的請求壓力。

configservers:配置服務器,存儲集群中的元數據。這些數據包含集群數據到碎片的映射。查詢路由使用這些元數據定位操作到明確的碎片中。共享集群需要有3台配置服務器。

注:用於測試,可以值配置1個config servers

Mongodb 分布數據或碎片,是在collection 級別上。分片是通過shardkey 劃分一個集合的數據。shard key 可以是一個索引鍵列,或者是存在每個文檔中的復合鍵列。Mongodb 劃分shard key 值到 chunk 中,並將chunk平均分配到碎片中。Mongodb 使用劃分的方法為范圍分區或者哈希分區。(更多參考:shardkey)

分片集群部署:

Mongodb服務器:(Red HatEnterprise Linux 6 64-bit + Mongodb 3.0.2)

192.168.1.11 mongodb11.kk.net 21017

192.168.1.12 mongodb12.kk.net 21018

192.168.1.13 mongodb13.kk.net 21019

192.168.1.14 mongodb14.kk.net 21020

用於測試結構如下:

\

注:配置前確保要加入集群中的成員都能相互連接。

【1. 配置 config servers】(在 192.168.1.14服務器上)

配置服務器(config servers)存儲集群元數據,因此首先配置該服務器。配置服務器需使用參數—configsvr 來啟動mongod服務。若有多個配置服務器,每個配置服務器都完整保存集群的元素就。

1. 1 創建數據庫目錄 configdb :
[root@mongodb14 ~]# mkdir /var/lib/mongo/configdb
[root@mongodb14 ~]# chown mongod:mongod /var/lib/mongo/configdb/
1.2. 配置啟動參數文件:
[root@mongodb14 ~]# vi /etc/mongod.conf

192.168.1.14

logpath=/var/log/mongodb/mongod.log

pidfilepath=/var/run/mongodb/mongod.pid

logappend=true

fork=true

port=27020

bind_ip=192.168.1.14

dbpath=/var/lib/mongo/configdb

configsvr=true

1.3. 重啟 mongod 服務:

[root@mongodb14 ~]# service mongod restart

【2. 配置 router】(在 192.168.1.11服務器上)

2.1.啟用 mongos (MongoDB Shard)實例,連接到 config servers:(更多參考:mongos

#使用mongos連接到config servers,指定本地端口,否則默認27017
#當前服務器mongod 端口為27017,所以配置mongos 端口為27016
#mongo --host  --port 
[root@redhat11 ~]# mongos --configdb mongodb14.kk.net:27020 --port 27016 --chunkSize 200 --logpath /var/log/mongodb/mongos.log --fork

實際環境中,若配置了多個config servers ,mongos 可同時指定多個。

mongos--configdb mongodb14.kk.net:27020, mongodb15.kk.net:27020,mongodb16.kk.net:27020……

【3. 添加 shard 成員到集群中】(添加IP為 11、12、13 分片集中 ,以192.168.1.11為例)

3.1. 配置啟動參數文件:

[root@redhat11 ~]# vi /etc/mongod.conf

192.168.1.11

192.168.1.12

192.168.1.13

logpath=/var/log/mongodb/mongod.log

pidfilepath=/var/run/mongodb/mongod.pid

logappend=true

fork=true

port=27017

bind_ip=192.168.1.11

dbpath=/var/lib/mongo

shardsvr=true

 

logpath=/var/log/mongodb/mongod.log

pidfilepath=/var/run/mongodb/mongod.pid

logappend=true

fork=true

port=27018

bind_ip=192.168.1.12

dbpath=/var/lib/mongo

shardsvr=true

 

logpath=/var/log/mongodb/mongod.log

pidfilepath=/var/run/mongodb/mongod.pid

logappend=true

fork=true

port=27019

bind_ip=192.168.1.13

dbpath=/var/lib/mongo

shardsvr=true

 


3.2.重啟 mongod 服務:

[root@mongodb11 ~]# service mongod restart

3.3各shard 成員連接到mongos 實例中添加(添加前把已存在的用戶數據移走或者刪除):

[root@mongodb11 ~]# mongo 192.168.1.11:27016
mongos> sh.addShard("mongodb11.kk.net:27017")
mongos> sh.addShard("mongodb12.kk.net:27018")
mongos> sh.addShard("mongodb13.kk.net:27019")

3.4添加完成!~連接到mongos可查看系統相關信息:

configsvr> show dbs
configsvr> use config
configsvr> show collections
configsvr> 
configsvr> db.mongos.find()
{ "_id" : "mongodb11.kk.net:27016", "ping" : ISODate("2015-05-23T11:16:47.624Z"), "up" : 1221, "waiting" : true, "mongoVersion" : "3.0.2" }
configsvr> 
configsvr> db.shards.find()
{ "_id" : "shard0000", "host" : "mongodb11.kk.net:27017" }
{ "_id" : "shard0001", "host" : "mongodb12.kk.net:27018" }
{ "_id" : "shard0002", "host" : "mongodb13.kk.net:27019" }
configsvr> 
configsvr> db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "mydb", "partitioned" : false, "primary" : "shard0000" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0000" }

【4. 對數據庫啟用分片】

4.1 當前可連接到 mongos 查看數據庫或者集合的分片情況(沒有分片):

mongos> db.stats()
mongos> db.tab.stats()
4.2 對數據庫激活分片功能:
[root@mongodb11 ~]# mongo 192.168.1.11:27016
mongos> sh.enableSharding("test")

#或者

[root@mongodb11 ~]# mongo 192.168.1.11:27016
mongos> use admin
mongos> db.runCommand( { enableSharding: "test"} )

4.3 此時查看數據庫分區情況,partitioned 變為 “true”。
configsvr> use config
switched to db config
configsvr> db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "mydb", "partitioned" : true, "primary" : "shard0000" }
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }
啟用數據庫分片並沒有將數據進行分開,還需要對 collection 進行分片。

【5. 對集合啟用分片】

啟用前,有幾個問題需要考慮的:

1. 選擇哪個鍵列作為 shard key 。(更多參考: Considerations for Selecting Shard Keys)

2. 如果集合中已經存在數據,在選定作為shard key 的鍵列必須創建索引;如果集合為空,mongodb 將在激活集合分片(sh.shardCollection)時創建索引。

3. 集合分片函數 sh.shardCollection

sh.shardCollection(".", shard-key-pattern)

mongos> sh.shardCollection("test.tab", { "_id": "hashed" })

測試:

for (var i=1; i<100000; i++) {
db.kk.insert({"id": i, "myName" : "kk"+i, "myDate" : new Date()});
}

mongos> show collections
mongos> db.kk.find()
mongos> db.kk.createIndex({ "id": "hashed" })
mongos> db.kk.getIndexes()
mongos> sh.shardCollection("test.kk", { "id": "hashed" })
mongos> db.stats()
mongos> db.kk.stats()

由於數據分區需要時間,過會再查看數據分布情況:

總行數:99999

mongos> db.kk.count()
99999
mongos> db.printShardingStatus();
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("556023c02c2ebfdfbc8d39eb")
}
  shards:
	{  "_id" : "shard0000",  "host" : "mongodb11.kk.net:27017" }
	{  "_id" : "shard0001",  "host" : "mongodb12.kk.net:27018" }
	{  "_id" : "shard0002",  "host" : "mongodb13.kk.net:27019" }
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		1334 : Success
		2 : Failed with error 'could not acquire collection lock for test.kk to migrate chunk [{ : MinKey },{ : MaxKey }) :: caused by :: Lock for migrating chunk [{ : MinKey }, { : MaxKey }) in test.kk is taken.', from shard0000 to shard0001
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "mydb",  "partitioned" : true,  "primary" : "shard0000" }
	{  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
		test.kk
			shard key: { "id" : "hashed" }
			chunks:
				shard0000	667
				shard0001	667
				shard0002	667
			too many chunks to print, use verbose if you want to force print
	{  "_id" : "events",  "partitioned" : false,  "primary" : "shard0002" }

mongos> 

看這裡 chunks :
shard0000 667
shard0001 667
shard0002 667

原本 shard0000 最大,shard0001 與 shard0002 為 0 。最終平均,數據將穩定不再變化。

mongos> db.kk.stats()
{
	"sharded" : true,
	"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
	"userFlags" : 1,
	"capped" : false,
	"ns" : "test.kk",
	"count" : 99999,
	"numExtents" : 19,
	"size" : 11199888,
	"storageSize" : 44871680,
	"totalIndexSize" : 10416224,
	"indexSizes" : {
		"_id_" : 4750256,
		"id_hashed" : 5665968
	},
	"avgObjSize" : 112,
	"nindexes" : 2,
	"nchunks" : 2001,
	"shards" : {
		"shard0000" : {
			"ns" : "test.kk",
			"count" : 33500,
			"size" : 3752000,
			"avgObjSize" : 112,
			"numExtents" : 7,
			"storageSize" : 22507520,
			"lastExtentSize" : 11325440,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 3605616,
			"indexSizes" : {
				"_id_" : 1913184,
				"id_hashed" : 1692432
			},
			"ok" : 1
		},
		"shard0001" : {
			"ns" : "test.kk",
			"count" : 32852,
			"size" : 3679424,
			"avgObjSize" : 112,
			"numExtents" : 6,
			"storageSize" : 11182080,
			"lastExtentSize" : 8388608,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 3343984,
			"indexSizes" : {
				"_id_" : 1389920,
				"id_hashed" : 1954064
			},
			"ok" : 1
		},
		"shard0002" : {
			"ns" : "test.kk",
			"count" : 33647,
			"size" : 3768464,
			"avgObjSize" : 112,
			"numExtents" : 6,
			"storageSize" : 11182080,
			"lastExtentSize" : 8388608,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 3466624,
			"indexSizes" : {
				"_id_" : 1447152,
				"id_hashed" : 2019472
			},
			"ok" : 1
		}
	},
	"ok" : 1
}
mongos> 

上面中,個分片數據分布情況:

"shard0000" "count" : 33500

"shard0001" "count" : 32852

"shard0002" "count" : 33647

總計99999 行,完全准確,數據分布也很平均了。

(測試數據盡量多些,否則看不得效果。一開始本人測試數據較少,不到1000行,沒有效果,還以為哪裡出現問題,又多折騰了2小時!~)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved