【Mongodb】 對 shard 進行大量資料拆分測試
前面介紹了如何搭建mongodb sharding 叢集,本文對shard進行大量資料拆分測試,並談了對於片鍵的選擇注意事項,(可能不全,希望指教)
1 啟用test資料庫的分片功能。
mongos> db.runCommand({"enablesharding": "test"})
{ "ok" : 1 }
2 檢視整個sharding 的架構
mongos> db.runCommand({listshards:1});
{
"shards" : [
{
"_id" : "shard0000",
"host" : "10.250.7.225:27018"
},
{
"_id" : "shard0001",
"host" : "10.250.7.249:27019"
},
{
"_id" : "shard0002",
"host" : "10.250.7.241:27020"
}
],
"ok" : 1
}
mongos> printShardingStatus();
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "10.250.7.225:27018" }
{ "_id" : "shard0001", "host" : "10.250.7.249:27019" }
{ "_id" : "shard0002", "host" : "10.250.7.241:27020" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }
Note:test 資料庫的 partitioned 為true 意味開啟了sharding 功能。
3 啟用test資料庫中的集合sharding功能,並指定片鍵為"_id",索引唯一。
mongos> db.runCommand({shardcollection:'test.yql',key:{_id:1}, unique : true});
{ "collectionsharded" : "test.yql", "ok" : 1 }
插入17條資料,並檢視yql的狀況
mongos> db.yql.stats();
{
"sharded" : true,
"flags" : 1,
"ns" : "test.yql",
"count" : 17,
"numExtents" : 1,
"size" : 1616,
"storageSize" : 8192,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"avgObjSize" : 95.05882352941177,
"nindexes" : 1,
"nchunks" : 1,
"shards" : {
"shard0000" : { --表示yql被拆分到了10.250.7.225這臺機器上了
"ns" : "test.yql",
"count" : 17,
"size" : 1616,
"avgObjSize" : 95.05882352941177,
"storageSize" : 8192,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
},
"ok" : 1
}
mongos>
4 使用 pymongodb 向test.yql插入200w的資料
[mongodb@rac4 pymongo]$ python
Python 2.4.3 (#1, Jan 21 2009, 01:11:33)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pymongo
>>>conn = pymongo.Connection(host="127.0.0.1")
>>> db=conn.test
>>> for i in xrange(2000000):
... val=dict(val="yangql"+str(i))
... db.yql.insert(val)
ObjectId('4eb2aa5940643e5bb61e847b')
ObjectId('4eb2aa5940643e5bb61e847c')
ObjectId('4eb2aa5940643e5bb61e847d')
ObjectId('4eb2aa5940643e5bb61e847e')
ObjectId('4eb2aa5940643e5bb61e847f')
....省略....
5 再次檢視,collection yql在整個sharding的分佈狀況:這次collection yql 被拆分到了三個不同的shard上面。
mongos> db.yql.stats();
{
"sharded" : true,
"flags" : 1,
"ns" : "test.yql",
"count" : 2000017,
"numExtents" : 23,
"size" : 92001336,
"storageSize" : 146833408,
"totalIndexSize" : 64917440,
"indexSizes" : {
"_id_" : 64917440
},
"avgObjSize" : 46.00027699764552,
"nindexes" : 1,
"nchunks" : 4,
"shards" : {
"shard0000" : {
"ns" : "test.yql",
"count" : 29448,
"size" : 1296204,
"avgObjSize" : 44.016707416462914,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 964768,
"indexSizes" : {
"_id_" : 964768
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.yql",
"count" : 1942524,
"size" : 89471128,
"avgObjSize" : 46.05921368281679,
"storageSize" : 141246464, --這裡shard0001上面的資料比較多,和片鍵的選擇有關。
"numExtents" : 13,
"nindexes" : 1,
"lastExtentSize" : 30072832,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 63036960,
"indexSizes" : {
"_id_" : 63036960
},
"ok" : 1
},
"shard0002" : {
"ns" : "test.yql",
"count" : 28045,
"size" : 1234004,
"avgObjSize" : 44.00085576751649,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 915712,
"indexSizes" : {
"_id_" : 915712
},
"ok" : 1
}
},
"ok" : 1
}
從下面的查詢結果可以看出,集合yql 根據片鍵的分佈:
shard0000 _id:{$minKey:1} -->>"4eb298b3adbd9673afee95e3"
shard0000 _id:4eb298b3adbd9673afee95e3"-->>"4eb2a64640643e5bb60072f7"
shard0002 _id: "4eb2a64640643e5bb60072f7-->>"4eb2a65340643e5bb600e084"
shard0001 _id:4eb2a65340643e5bb600e084"-->>{ $maxKey:1}
mongos> printShardingStatus();
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "10.250.7.225:27018" }
{ "_id" : "shard0001", "host" : "10.250.7.249:27019" }
{ "_id" : "shard0002", "host" : "10.250.7.241:27020" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }
test.yql chunks:
shard0000 2
shard0002 1
shard0001 1
{ "_id" : { $minKey : 1 } } -->> { "_id" : ObjectId("4eb298b3adbd9673afee95e3") } on : shard0000 { "t" : 2000, "i" : 1 }
{ "_id" : ObjectId("4eb298b3adbd9673afee95e3") } -->> { "_id" : ObjectId("4eb2a64640643e5bb60072f7") } on : shard0000 { "t" : 1000, "i" : 3 }
{ "_id" : ObjectId("4eb2a64640643e5bb60072f7") } -->> { "_id" : ObjectId("4eb2a65340643e5bb600e084") } on : shard0002 { "t" : 3000, "i" : 1 }
{ "_id" : ObjectId("4eb2a65340643e5bb600e084") } -->> { "_id" : { $maxKey : 1 } } on : shard0001 { "t" : 3000, "i" : 0 }
mongos>
在配置的時候,我們只是指定了片鍵,對集合的拆分則是由mongos來進行的,即叢集自動進行資料拆分,並進行負載均衡!對於片鍵的選擇會影響到集合在shard的分佈,對於本文中的例子:
選擇_id 為片鍵,分了四個區間:
[{$minKey:1},"4eb298b3adbd9673afee95e3" ]
["4eb298b3adbd9673afee95e3","4eb2a64640643e5bb60072f7"]
["4eb2a64640643e5bb60072f7","4eb2a65340643e5bb600e084"]
["4eb2a65340643e5bb600e084",{$maxKey:1}]
隨著資料的繼續插入,再進行拆分資料插入的資料依然會插入到shard0001伺服器上的,對於上面的例子再次插入200w的資料:
檢視yql的分片分佈:shard0000 和shard0002上面儲存的資料沒有變化,所有插入的資料全部落入到shard0001上面。
mongos> db.yql.stats();
{
"sharded" : true,
"flags" : 1,
"ns" : "test.yql",
"count" : 4000017,
"numExtents" : 26,
"size" : 184000936,
"storageSize" : 278208512,
"totalIndexSize" : 129802176,
"indexSizes" : {
"_id_" : 129802176
},
"avgObjSize" : 46.00003849983638,
"nindexes" : 1,
"nchunks" : 4,
"shards" : {
"shard0000" : {
"ns" : "test.yql",
"count" : 29448,
"size" : 1296204,
"avgObjSize" : 44.016707416462914,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 964768,
"indexSizes" : {
"_id_" : 964768
},
"ok" : 1
},
"shard0001" : {
"ns" : "test.yql",
"count" : 3942524,
"size" : 181470728,
"avgObjSize" : 46.02907376086994,
"storageSize" : 272621568,
"numExtents" : 16,
"nindexes" : 1,
"lastExtentSize" : 51974144,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 127921696,
"indexSizes" : {
"_id_" : 127921696
},
"ok" : 1
},
"shard0002" : {
"ns" : "test.yql",
"count" : 28045,
"size" : 1234004,
"avgObjSize" : 44.00085576751649,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 915712,
"indexSizes" : {
"_id_" : 915712
},
"ok" : 1
}
},
"ok" : 1
}
mongos>
這樣不符合sharding的初衷:負載均衡,最終也會導致shard0001 上面的磁碟空間和記憶體不足。
Note:如果寫入負載比較高,要分散負載,此時必須考慮選擇均勻分佈的片鍵。不能在只有幾個值的片鍵,比如對於status 有四個值,A,B,C,D.mongos 不會建立多於4個塊。選擇片鍵時,除了均勻分佈也要有個增長上線即最大值,否則就會出現上面的情況,違背了sharding的初衷。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-710267/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mongodb之shard分片MongoDB
- SAP系統如何進行資料拆分?
- logminer進行資料探勘分析測試
- 對圖資料庫(Nebula)進行單元測試時的坑資料庫
- 對大量ip:port進行批次telnet檢測的python指令碼Python指令碼
- 一個測試用例裡面有多套測試資料,如何用 beautifureport 分別對各組測試資料進行統計測試通過與否
- 介面測試的時候如何生成隨機資料進行測試隨機
- MongoDB中如何優雅地刪除大量資料MongoDB
- [譯]對 React 元件進行單元測試React元件
- mongodb叢集shard_replica的搭建方法MongoDB
- 如何針對服務是否有重新連線資料庫的能力進行測試資料庫
- mongodb清理collection中大量資料的2種辦法MongoDB
- 如何對Mac進行基礎檢測和速度測試Mac
- 大資料包表如何進行自動化測試大資料
- 使用jMeter構造大量併發HTTP請求進行微服務效能測試JMeterHTTP微服務
- Golang 專案中如何對 API 進行測試?GolangAPI
- 如何對 ElasticSearch 叢集進行壓力測試Elasticsearch
- 使用python對oracle進行簡單效能測試PythonOracle
- 【SWINGBENCH】使用SwingBench對Oracle進行壓力測試Oracle
- 測試前奏 之 Robotium使用Eclipse和ADT對apk進行黑盒測試EclipseAPK
- 漫談“資料拆分層次對比”
- 初試MongoDB資料庫MongoDB資料庫
- matlab 對資料進行打亂Matlab
- 【星雲測試】開發者測試-採用精準測試工具對SpringBoot應用進行測試Spring Boot
- 開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- 對node工程進行壓力測試與效能分析
- 使用springboot對各層的程式碼進行測試!Spring Boot
- 如何進行裝置的非對稱效能測試
- 使用Sysbench對滴滴雲MySQL進行基準測試MySql
- 使用 jMeter 對 SAP Spartacus 進行併發效能測試JMeter
- 【星雲測試】開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- Python對Hadoop資料進行讀寫PythonHadoop
- 如何對資料目標進行分析
- SQLServer用函式實現對字串按照特定字元進行拆分SQLServer函式字串字元
- .net core 使用ConcurrentTest元件對方法進行壓力測試元件
- 第 83 期對 Go 程式進行可靠的效能測試Go
- 如果利用 python 對 java 程式碼進行 單元測試?PythonJava
- 如何對Spring MVC中的Controller進行單元測試SpringMVCController
- 開發者測試(4)-採用精準測試工具對dubbo微服務應用進行測試微服務