1、总的原则:选键的时候多考虑以下问题。
  1. 写操作是怎么样的,有多大?
  2. 系统每小时会写多少数据,每天呢,高峰期呢
  3. 那些字段是随机的,那些是增长的
  4. 读操作是怎么样的,用户在访问那些数据
  5. 数据索引做了吗?应不应该索引呢?
  6. 数据总量有多少
总的来说,在进行分片前,你需要清楚的了解你的数据。
 
2、注意事项:
分片后,片健不可改变;一个集合只能有一个片健;片健必须有索引。
 
3、工作案例讲解:
在工作的时候由于没有和研发沟通,按id分片了,后来研发发现没法update
先按id分片
激活数据库及集合的分片
mongos> use admin
mongos> db.runCommand({ enablesharding:"mobstat " })
mongos> db.runCommand({ shardcollection: "mobstat.datelocos", key: { _id:1 }})
mongos> use mobstat
mongos> db.datelocos.update({ "date" : 20170816 , "loc" : 0 , "event" : 5 , "os" : 1 , "strvalue" : "123.abc.com"}, { "$inc" : { "count" : 1}})
报错如下:For non-multi updates, must have _id or full shard key ({ _id: 1.0 }) in query
更改date做片健
mongos> db.runCommand({ shardcollection: "mobstat.datelocos", key: { date:1 }})
{ "ok" : 0, "errmsg" : "already sharded" }
 
那么问题来了,怎么更改片健呢?
先备份当前的集合,删除当前集合,再导入集合
mongodump  -d mobstat -c datelocos  --port 30000 -o /tmp
mongorestore  -d mobstat -c datelocos   --port 30000   /tmp/mobstat/datelocos.bson
 
mongos> use mobstat
mongos> db.datelocos.ensureIndex({date:1})
mongos> use admin
mongos> db.runCommand({ shardcollection: "mobstat.datelocos", key: {date:1 }})
再次update
mongos> db.datelocos.update({ "date" : 20170816 , "loc" : 0 , "event" : 5 , "os" : 1 , "strvalue" : "123.abc.com "}, { "$inc" : { "count" : 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
看到已经成功更新了
 
再看下集合分片状态
mongos> db.datelocos.stats()
{
        "sharded" : true,
        "systemFlags" : 0,
        "userFlags" : 1,
        "ns" : "mobstat.datelocos",
        "count" : 164791,
        "numExtents" : 24,
        "size" : 58698512,
        "storageSize" : 131325952,
        "totalIndexSize" : 10980368,
        "indexSizes" : {
                "_id_" : 5543328,
                "date_1" : 5437040
        },
        "avgObjSize" : 356.1997439180538,
        "nindexes" : 2,
        "nchunks" : 112,
        "shards" : {
                "shard1" : {
                        "ns" : "mobstat.datelocos",
                        "count" : 53002,
                        "size" : 20424032,
                        "avgObjSize" : 385,
                        "storageSize" : 22507520,
                        "numExtents" : 7,
                        "nindexes" : 2,
                        "lastExtentSize" : 11325440,
                        "paddingFactor" : 1,
                        "systemFlags" : 0,
                        "userFlags" : 1,
                        "totalIndexSize" : 3744608,
                        "indexSizes" : {
                                "_id_" : 1806896,
                                "date_1" : 1937712
                        },
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "mobstat.datelocos",
                        "count" : 55952,
                        "size" : 21596800,
                        "avgObjSize" : 385,
                        "storageSize" : 22507520,
                        "numExtents" : 7,
                        "nindexes" : 2,
                        "lastExtentSize" : 11325440,
                        "paddingFactor" : 1,
                        "systemFlags" : 0,
                        "userFlags" : 1,
                        "totalIndexSize" : 3989888,
                        "indexSizes" : {
                                "_id_" : 1913184,
                                "date_1" : 2076704
                        },
                        "ok" : 1
                },
                "shard3" : {
                        "ns" : "mobstat.datelocos",
                        "count" : 55837,
                        "size" : 16677680,
                        "avgObjSize" : 298,
                        "storageSize" : 86310912,
                        "numExtents" : 10,
                        "nindexes" : 2,
                        "lastExtentSize" : 27869184,
                        "paddingFactor" : 1,
                        "systemFlags" : 1,
                        "userFlags" : 1,
                        "totalIndexSize" : 3245872,
                        "indexSizes" : {
                                "_id_" : 1823248,
                                "date_1" : 1422624
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}
看到集合已经均衡的分配到了3个shard上
 
 
 
 

mongodb片健的选取及更改的更多相关文章

  1. Mongodb百亿级数据添加,修改,删除,查询等性能测试【四】

    集群的结构,大家可以查看我的另一遍文章,Mongodb的三种集群  在最后一种集群中,介绍到. 目前使用的数据就是最后一个测试集群,留下的数据. 简单介绍一下,四个分片的配置 192.168.99.6 ...

  2. Mongodb 笔记08 了解应用的动态、数据管理、持久性

    了解应用的动态 1. 了解正在进行的操作:db.currentOp() , 可以加过滤条件,从而只显示符合条件的结果. 1). 寻找有问题的操作:db.currentOp() 最常见的操作就是用来寻找 ...

  3. [原创]Windows下更改特定后缀名以及特定URL前缀的默认打开方式

    Windows下,特定后缀名的文件会由特定的应用程序来运行,比如双击readme.txt,通常情况下会由Windows自带的notepad.exe(记事本)打开文件.如果现在安装了记事本以外的其他文本 ...

  4. mongodb分片集群

    第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...

  5. MongoDB数据库初探 --- 认识与安装 && Mongoose安装

    注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 第一部分: MySQL数据库是关系型数据库,但是使用node开发时多用MongoDB数据库,两者各有优势,所 ...

  6. Linux上安装MongoDB

    使用本教程使用.rpm 软件包在红帽企业Linux或CentOS Linux版本6和7上安装MongoDB Community Edition . 平台支持 本安装指南仅支持64位系统.详细信息请参见 ...

  7. MongoDB学习笔记(七、MongoDB总结)

    1.为什么要NoSQL:nosql能解决sql中那些解决不了的问题 NoSQL是什么:Not Only SQL,本质上还是数据库,但它不会遵循传统数据库的规则(如:SQL标准.ACID属性[事务].表 ...

  8. springboot 和 mongdb连接问题 Exception in thread "main" com.mongodb.MongoSecurityException:

    1 Exception in thread "main" com.mongodb.MongoSecurityException: Exception authenticating ...

  9. Mongodb安全防护

    1.Mongodb未授权访问 描述 MongoDB 是一个基于分布式文件存储的数据库.默认情况下启动服务存在未授权访问风险,用户可以远程访问数据库,无需认证连接数据库并对数据库进行任意操作,存在严重的 ...

随机推荐

  1. 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation

    题目传送门 /* 构造:首先先选好k个不同的值,从1到k,按要求把数字放好,其余的随便放.因为是绝对差值,从n开始一下一上, 这样保证不会超出边界并且以防其余的数相邻绝对值差>k */ /*** ...

  2. JAVA使用Ldap操作AD域

    项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员 ...

  3. Android RxJava2 浅析

    原文地址:http://blog.csdn.net/maplejaw_/article/details/52442065 Observable 在RxJava1.x中,最熟悉的莫过于Observabl ...

  4. SQL 语句在存储过程执行和在SSMS中执行的差异

    SQL 语句在存储过程执行和在SSMS中执行的差异 SSMS是SQlSerever management studio.本文所述情形在SQLServer2008中测试. 有时发现同样几条语句,在SSM ...

  5. Farseer.net轻量级开源框架 入门篇:Where条件的终极使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 ...

  6. Discuz!伪静态原理分析

    伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为 ...

  7. Flask框架 之abort、自定义错误、视图函数返回值与jsonify

    一.abort函数 使用abort函数可以立即终止视图函数的执行,并可以返回给前端特定的值. abort函数的作用: 1.传递状态码,必须是标准的http状态码 2.传递响应体信息 @app.rout ...

  8. 用Docker实现nginx多端口

    一.安装docker 需要阿里的epel源,需要联网 [root@bogon ~]#yum -y install docker [root@bogon ~]#systemctl start docke ...

  9. vue-router + axios token登录状态认证

    vue项目中登录状态判断往往基于jwt认证,我们可以采用判断本地是否存在token,及token是否过期或token值错误 1.利用vue-router 钩子函数判断本地是否存在token impor ...

  10. 出现For input string: "" 错误

    然后是因为后台生成的是一个数组,前台取的是一个对象,所以会产生这个错误 前后台交互时 mv.addObject("vo1",fhList.get(0));}将数组改成fhList. ...