【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的初衷。

时间: 2024-08-04 06:28:59

【Mongodb】 对 shard 进行大量数据拆分测试的相关文章

有人能指导下-大数据压力测试去测试软件响应速度

问题描述 大数据压力测试去测试软件响应速度 怎么样去开发一个数据生成器,并在大数据背景下测试软件的响应速度...这个该怎么做? 解决方案 国内有AutoRunner和TestCenter,这两个是免费的. 解决方案二: 开发一个数据生成器? 不是很理解, 而且你场景描述太不清楚了,你是要通过专业的测试软件进行测试还是只是生成数据调用程序接口? 生成数据可以程序代码生成 或者 数据库的可以用存储过程创建, excel也可以啊 解决方案三: 根据你的程序来判断,产生一些尽可能和真实数据类似的随机伪数

用java来操作mongoDB,备份mongDB中的数据

问题描述 用java来操作mongoDB,备份mongDB中的数据 come on 大神 如题 现在想每个月把数据库中的数据导出来做备份 , 怎么用java语言来实现呢 ? 谢啦!!! 解决方案 omg 我在顶顶吧 解决方案二: 写一个quartz的定时任务管理, 然后创建一个机遇每月月初几点几分执行的任务... 然后就是执行你需要的业务逻辑,如果比较复杂的话,就使用异步来实现. 最后记得生成一份日志或者报表用于查看数据备份后的一些结果输出信息... 大致的思路是这样的

《软件功能测试自动化实战教程》—第6章6.7节文件数据源的数据驱测试

6.7 文件数据源的数据驱测试 软件功能测试自动化实战教程 执行数据驱测试前要先定义测试所需的数据源,数据驱动测试的数据源除了UFT自带的DataTable之外,可以是文本文件.Excel文件.数据库表格等.本小节主要列举了以文本文件或者以Excel文件为代表的文件数据源的数据驱动测试实例. 6.7.1 文本文件作为数据源 在本实例中以UFT自带订票系统为例讲解如何使用文本文件存储数据源实现数据驱动测试. 首先,录制订票系统的业务流程,如图6-44所示: 其次,用记事本编辑一个文本文件作为测试的

c# 百思不得其解:word一页得到的图片与原始大小不一致,有源码有数据,请测试

问题描述 c# 百思不得其解:word一页得到的图片与原始大小不一致,有源码有数据,请测试 根据网上的一些大神的代码及帮助文档,做了一个word转图片的程序.简要测试一下,发现转换出来的图片跟原始文档的页内容不一致.请教一下各位,有没有什么思路之类的,十分感谢. 解决方案 Check 解决方案二: 代码如下: ``` class Program { static void Main(string[] args) { //运行13版本word,请改一下引用的两个dll到dll的15版本,图片是透明

排序算法大数据量测试代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Diagnostics; using System.IO; namespace Sort { class Program { static string ErrMsg = string.Empty; static void Main(string[]

SharePoint 2013 列表关于大数据的测试<二>

1.给测试列表添加查阅项字段,100个,代码如下: 2.插入测试数据的方法,注意查阅项字段的格式,代码如下: 3.插入10w条数据,时间花费如下(不建议List[LISTNAME].Items.Add,会比较慢): 4.查看列表设置,数据有10w条,阙值设置500w,如下图: 5.进入AllItems页面,发现查阅项字段数大于限制(8个),如下图: 6.修改查阅项限制数目(修改为500),如下图: 7.数据量10w,查阅项字段100个时的测试数据,如下表格: 表一:分页30,LookUp字段50

项目总结:数据迁移测试

第一次在项目中遇到数据迁移测试,从一头雾水开始做起,绕了不少弯路,趁着项目还没有结束,赶紧总结一下,适时调整思路. 一.没有需求文档=没有测试需求? 这次项目的数据迁移,SA是缺失的,但是测试需求还是可以跟开发人员沟通确认: ● 迁移的是哪几张表? ● 迁移表之间是否存在关联关系,如何关联? ● 迁移表中,那些字段的数据需要迁移,那些字段不需要迁移,不做迁移是否会隐藏风险? ● 迁移表的表结构在新老库中是否相同,包括: 是否存在新表的必填字段而旧表没有,应该用什么数据填写? 是否存在旧表数据在新

mongodb服务器集群shard,所有数据都往一个片服务器上的一个chunk写,超过限制的chunksize,也不会分块。

问题描述 用3台pc搭建mongodb的分布式系统,在三台pc上都运行以下命令:$MONGODB_PATH是我设置好的一个变量mongod--configsvr--dbpath${MONGODB_PATH}/config/data--port21000--logpath${MONGODB_PATH}/config/log/config.log--forkmongod--shardsvr--replSetshard1--port22001--dbpath${MONGODB_PATH}/shard1

MongoDB 哈希分片为什么数据大小不均匀?

今天接到一个用户反馈的问题,sharding集群,使用wiredtiger引擎,某个DB下集合全部用的hash分片,show dbs 发现其中一个shard里该DB的大小,跟其他的集合差别很大,其他基本在60G左右,而这个shard在200G左右? 由于这个DB下有大量的集合及索引,一眼也看不出问题,写了个脚本分析了一下,得到如下结论 somedb 下所有集合都是hash分片,并且chunk的分布是比较均匀的 show dbs 反应的是集合及索引对应的物理文件大小 集合的数据在各个shard上逻