基於MongoDB進行分布式資料儲存的步驟

2021-09-21 09:36:09 字數 4569 閱讀 1956

本文是研究mongodb分布式資料儲存的副產品,通過本文的相關步驟可以將乙個大表中的資料分布到幾個mongo伺服器上。

mongodb的1.6版本中auto-sharding功能基本穩定並可以嘗試放到生產環境下使用。因為其是auto-sharding,即mongodb通過mongos(乙個自動分片模組,用於構建乙個大規模的可擴充套件的資料庫集群,這個集群可以併入動態增加的機器)自動建立乙個水平擴充套件的資料庫集群系統,將資料庫分表儲存在sharding的各個節點上。

乙個mongodb集群包括一些shards(包括一些mongod程序),mongos路由程序,乙個或多個config伺服器

(注:本文的測試用例需求64位的mongo程式,因為我在32位的mongo沒成功過)。

下面是一些相關詞彙說明:

shards : 每乙個shard包括乙個或多個服務和儲存資料的mongod程序(mongod是mongodb資料的核心程序)典型的每個shard開啟多個服務來提高服務的可用性。這些服務/mongod程序在shard中組成乙個複製集

chunks: chunk是乙個來自特殊集合中的乙個資料範圍,(collection,minkey,maxkey)描敘乙個chunk,它介於minkey和maxkey範圍之間。例如chunks 的maxsize大小是100m,如果乙個檔案達到或超過這個範圍時,會被切分到2個新的chunks中。當乙個shard的資料過量時,chunks將會被遷移到其他的shards上。同樣,chunks也可以遷移到其他的shards上

config servers : config伺服器儲存著集群的metadata資訊,包括每個伺服器,每個shard的基本資訊和chunk資訊config伺服器主要儲存的是chunk資訊。每乙個config伺服器都複製了完整的chunk資訊。

接著看一下要配置的測試環境資訊:

模擬2個shard服務和乙個config服務, 均執行在10.0.4.85機器上,只是埠不同:

shard1:27020

shard2:27021

config:27022

mongos啟動時預設使用的27017埠

在c,d,e磁碟下分別建立如下資料夾:

mongodb\bin

mongodb\db

然後用cmd命令列依次開啟相應資料夾下的mongd檔案:

c:\mongodb\bin\mongod --dbpath c:\mongodb\db\ --port 27020

d:\mongodb\bin\mongod --dbpath d:\mongodb\db\ --port 27021

e:\mongodb\bin\mongod --configsvr --dbpath e:\mongodb\db\ --port 27022

(注:config配置伺服器)

啟動mongos時,預設開啟了27017埠:

e:\mongodb\bin\mongos --configdb 10.0.4.85:27022

然後開啟mongo:

e:\mongodb\bin>mongo 回車 (有時加埠會造成下面的addshard命令出問題)

> use admin

switched to db admin

> db.runcommand( )

--新增sharding,maxsize單位是m,此處設定比較小的數值只為演示sharding效果

> db.runcommand( )

注:如果要移除sharding,可用下面寫法

db.runcommand( );

> db.runcommand(); 檢視shard節點列表

code highlighting produced by actipro codehighlighter (freeware)>      ,

],"ok" : 1

}接下來建立相應資料庫並設定其"可以sharding",新建自動切片的庫user001:

> config = connect("10.0.4.85:27022")

> config = config.getsisterdb("config")

> dnt_mongodb=db.getsisterdb("dnt_mongodb");

dnt_mongodb

> db.runcommand()

注:一旦enable了個資料庫,mongos將會把資料庫裡的不同資料集放在不同的分片上。除非資料集被分片(下面會設定),否則乙個資料集的所有資料將放在乙個分片上。

> db.printshardingstatus();

code highlighting produced by actipro codehighlighter (freeware)>   --- sharding status ---

sharding version:

shards:

databases:

> db.runcommand( , unique: true } )

--使用shardcollection 命令分隔資料集,key自動生成 [必須為唯一索引unique index]。

如果要進行gridfs sharding,則需進行如下設定:

db.runcommand( } )

> db.printshardingstatus()

--- sharding status ---

sharding version:

shards:

databases:

dnt_mongodb.posts1e chunks:

} -->> } on : shard0000 max: on: (splitthreshold 47185920)

tue sep 07 12:13:15 [conn14] config change: , max: }, left: , max: }, right: , max: } } }

tue sep 07 12:13:16 [conn14] moving chunk (auto): ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 1|1 min: max: to: shard0001:10.0.4.85:27021 #objects: 0

tue sep 07 12:13:16 [conn14] moving chunk ns: dnt_mongodb.posts1 moving ( ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 1|1 min: max: ) shard0000:10.0.4.85:27020 -> shard0001:10.0.4.85:27021

tue sep 07 12:13:23 [writebacklistener] ~scopeddbconnection: _conn != null

tue sep 07 12:13:23 [writebacklistener] error: splitifshould failed: ns: dnt_mongodb.posts1 findone has stale config

tue sep 07 12:13:28 [writebacklistener] autosplitting dnt_mongodb.posts1 size: 54106804 shard: ns:dnt_mongodb.posts1 at: shard0000:10.0.4.85:27020 lastmod: 2|1min: max: on: (splitthreshold 47185920)

tue sep 07 12:13:28 [writebacklistener] config change: , max: }, left: , max: }, right: , max: } } }

在完成自動sharding之後,可以使用mongo看一下結果:

> use dnt_mongodb

switched to db dnt_mongodb

> show collections

posts1

system.indexes

> db.posts1.stats()

,"ok" : 1

},"shard0001" : ,

"ok" : 1}},

"ok" : 1

}通過上面的結果,可以出現16萬條記錄均分在了兩個sharding上,其中shard0000中有62434條,shard0001中有99097條。下面看一下這兩個sharding-chunk的分布情況(圖中的錯誤提示『輸入字串格式不正確』主要因為執行環境與編譯程式使用的環境不同,乙個是64,乙個是32位系統):

可以看到資料被按區間自動分割開了,有點像sqlserver的資料分割槽表,只不過這是自動完成的(目前我沒找到可以手工指定區間上下限的方式,如有知道的tx可以跟我說一下)。當然在本文中的測試中,共有5個chunk,其中4個位於shard0001,這種情況可以在每次測試過程中會發生變化,包括兩個sharding被分配的記錄數。另外就是在mongodb移動過程前後會在shard0000上生成乙個資料夾,裡面包括一些bson檔案,名字形如(**+日期等資訊):

post-cleanup.2010-09-07t04-13-31.1.bson

該檔案主要包括一些資料庫,表結構及相關記錄等資訊,我想應該是用於資料恢復備份的。

mongoDB簡介 分布式DB

一 簡介 mongodb是乙個開源的,基於分布式的,面向文件儲存的非關係型資料庫。是非關係型資料庫當中功能最豐富 最像關聯式資料庫的。mongodb由c 編寫,其名字 於 humongous 這個單詞,其宗旨在於處理大量資料。mongodb可以執行在windows unix osx solaris系...

MongoDB 基於分布式檔案儲存的資料庫

ref mongodb是乙個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似json的bjson格式,因此可以儲存比較複雜的資料型別。mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於物件導向的查詢語言,幾...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...