本文是研究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 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...