1. 程式人生 > >MongoDB 基礎(九)分片

MongoDB 基礎(九)分片

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

垂直擴充套件:增加CPU、RAM,儲存資源等,這也受限於硬體裝置。而有些基於雲的供應商也規定使用者使用小的系統。

分片(水平擴充套件):劃分資料集,將資料分佈到多臺伺服器中,每個碎片(chard)是一個獨立的資料庫,這些碎片共同組成了一個邏輯的資料庫。(這類似於Windows動態磁碟條帶化一樣)


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


分片叢集有三個元件:shards,query routers 和 configservers。

碎片,儲存資料,提供高可用性和資料的一致性。分片叢集中,每個碎片都是一個複製集。

query routers查詢路由,或稱mongos例項,客戶端應用程式直接操作碎片的介面。查詢路由處理和定位操作到碎片中並返回相關資料到客戶端。一個分片叢集包含多個查詢路由來劃分客戶端的請求壓力。

配置伺服器,儲存叢集中的元資料。這些資料包含叢集資料到碎片的對映。查詢路由使用這些元資料定位操作到明確的碎片中。共享叢集需要有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 :
[[email protected] ~]# mkdir /var/lib/mongo/configdb
[[email protected] ~]# chown mongod:mongod /var/lib/mongo/configdb/

1.2.  配置啟動引數檔案:
[[email protected] ~]# 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 服務:

[[email protected] ~]# 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 <hostname of machine running mongos> --port <port mongos listens on>
[[email protected] ~]# 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. 配置啟動引數檔案:

[[email protected] ~]# 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 服務:

[[email protected] ~]# service mongod restart

3.3各shard 成員連線到mongos 例項中新增(新增前把已存在的使用者資料移走或者刪除):

[[email protected] ~]# 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 對資料庫啟用分片功能:
[[email protected] ~]# mongo 192.168.1.11:27016
mongos> sh.enableSharding("test")

#或者

[[email protected] ~]# 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. 對集合啟用分片】

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

2. 如果集合中已經存在資料,在選定作為shard key 的鍵列必須建立索引;如果集合為空,mongodb 將在啟用集合分片(sh.shardCollection)時建立索引。

sh.shardCollection("<database>.<collection>", 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小時!~)

參考: Sharding Introduction

(官方文件的步驟不是很清楚,倒騰了好久。網上也有些部落格介紹,也只是博主的總結,對於一個新人來講,在哪操作,操作什麼不詳細)

相關推薦

MongoDB 基礎分片

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

redis使用基礎 ——Redis虛擬內存

兩個 數據 規則 導致 文件中 寫入 ron 開始 路徑 redis使用基礎(九) ——Redis虛擬內存 (轉載請附上本文鏈接——linhxx) 一、概述 Redis的數據是保存在內存中,當物理內存不足,其會保存在虛擬內存(VM)中。Redis的

並發基礎 java線程的終止與中斷

建議 暫停 boolean read 便是 -m java sin 修飾符 1、簡單了解一下:為何不贊成使用 Thread.stop、Thread.suspend 和 Thread.resume? ??suspend 、resume、stop方法分別完成了線程的暫停、恢復、

Java基礎面試題

面試題 io流 多線程 面試題:字節緩沖輸出流它的構造方法為什麽不能直接傳遞路徑/文件? 緩沖輸入流/緩沖輸出流,它只是在底層內部提供一個緩沖區的數組, 底層實現文件的復制/讀取/寫入這些操作都依賴於基本流對象來操作(InputStream/OutputStream/FileInputStrea

mongodb基礎1

ext mongod 51cto image god shadow RoCE bbb bbf 1、2、mongodb基礎(1)

mongodb基礎3導入導出

http mongod ges ces 圖片 type mongo vpd roc 1、2、輸入mongo3、mongodb基礎(3)導入導出

mongodb基礎4備份與恢復

pro oss col mon 圖片 備份 cto ffffff 技術 1、備份2、恢復mongodb基礎(4)備份與恢復

mongodb基礎2增刪改查

pro vpd 圖片 size type ext fda img god 1、mongodb基礎(2)增刪改查

java基礎繼承

關鍵字: extends 為什麼存在: 多個類存在相同屬性和行為,將其放在一個父類中,其餘的類只需要繼承就行。提高程式碼複用性 格式: class 子類名 extends 父類名{} eg: Person類: public class Person

Go語言基礎—— Go語言結構體、Go語言切片Slice、range遍歷、Go語言Map集合

Go語言結構體 Go 語言中陣列可以儲存同一型別的資料,但在結構體中我們可以為不同項定義不同的資料型別。 結構體是由一系列具有相同型別或不同型別的資料構成的資料集合。  結構體表示一項記錄,比如儲存圖書館的書籍記錄,每本書有以下屬性: Title :標題&nbs

微信小遊戲-CocosCreator 基礎

Label : Line Heght :每行高度 Node的H :整體高度 OverFlow:None 一行 CLAMP :改變Node的w 改變寬度 ,只有一行 SHRINK :根據Node的w和h

python之Linux基礎

軟體安裝與解除安裝更新Ubuntu軟體下載地址 尋找國內映象源所謂的映象源:可以理解為提供下載軟體的地⽅,⽐如Android⼿機上可以下載軟體的91 ⼿機助⼿;iOS⼿機上可以下載軟體的AppStore 備份Ubuntu預設的源地址sudo cp /etc/apt/sources.list /etc

http協議基礎響應首部欄位

響應首部欄位: 伺服器向客戶端返回響應報文中所使用的欄位,用於補充的附加資訊、伺服器資訊、以及對客戶端的附加要求等 1、Accept-Ranges 告知客戶端伺服器能否處理範圍請求,以指定獲取伺服器的某部分資源 可指定的欄位值分2種: 1.1   bytes:可處理範圍請求 1.2 &n

Java基礎:logback實現日誌按天和大小切分

【前言】        專案中每天會列印很多日誌,有時候進行排錯開啟一個大的日誌檔案(我們有一個系統的線上日誌檔案大小已經超過20G)是一件很可怕的事情;對日誌進行按天的切分是一件非常有必要的事情。 【日誌按天切分】          一、在application.pr

Swift基礎id相容性與nil物件

// id相容性    // Swift語言將Objective-C中的id物件匯入為AnyObject型別,表示任意型別的物件。AnyObject協議允許編寫安全型別的程式碼,同事位置無型別物件的靈活性。因為AnyObject協議保證了這種安全。    // 跟id一樣,

Python3基礎 錯誤和異常

本文主要介紹Python中的錯誤和異常,涉及到簡單的異常處理、丟擲異常以及清理動作。至於自定義異常類,將在介紹類與繼承的時候講到。 一、定義 常見的兩種錯誤:語法錯誤 和 異常。 1、語法錯誤(Syntax Errors) 語法錯誤,也就是解析時錯誤。當我們寫出不符合pyt

JSP基礎——Java Web的兩種開發模式

SUN公司推出JSP技術後,同時也推薦了兩種web應用程式的開發模式:一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。 一. JSP+JavaBean開發模式 1.1 JSP+JavaBean的開發模式架構         在jsp+

深度學習基礎—— 稀疏編碼sparse coding

稀疏編碼演算法是一種無監督學習方法,它用來尋找一組“超完備”基向量來更高效地表示樣本資料。稀疏編碼演算法的目的就是找到一組基向量 (自然影象的小波基?)ϕi ,使得我們能將輸入向量 x 表示為這些基向量的線性組合: x=∑i=1kaiϕi 所謂“超完備”基向

MongoDB 基礎Windows XP 32位安裝mongodb及其目錄結構和配置

MongoDB是一個提供高效能、高可用性、和自動伸縮的開源的文件資料庫。 MongoDB 是由 c++語言編寫。 文件資料庫(DocumentDatabase): 記錄在MongoDB中稱之為文件,它是列值成對的資料結構元件。MongoDB文件類似於JSON物件。列