`

MongoDB分片实战(三):性能和优化

 
阅读更多
插入、查询和更新

插入:MongoDB会根据片键和conifg中的信息写入到指定的分片上。

读取:以下内容摘抄自《深入学习MongoDB》



关于读取:上一节故障恢复中已经有所验证。

更新:如果要更新单个文档一定要在片键中使用片键(update的第一个参数)。我们现在OSSP10.bizuser(已经在_id上进行哈希分片)中插入一条记录:

mongos> use OSSP10
2.    switched to db OSSP10
3.    mongos> db.bizuser.insert({"Uid":10001,"Name":"zhanjindong","Age":23})
4.    db.bizuser.find({"Name":"zhanjindong"})
5.    { "_id" : ObjectId("5160dd378bc15cdb61a131fc"), "Uid" : 10001, "Name" : "zhanjindong", "Age" : 23 }


尝试根据Name来更新这个文档会得到一个错误:

1.    mongos> db.bizuser.update({"Name":"zhanjindong"},{"$set":{"Sex":0}})
2.    For non-multi updates, must have _id or full shard key ({ _id: "hashed" }) in query


根据片键来更新则不会有任何问题:

  mongos> db.bizuser.update({"_id":ObjectId("5160dd378bc15cdb61a131fc")},{"$set":{"Sex":0}})
2.    mongos> db.bizuser.find({"Name":"zhanjindong"})
3.    { "Age" : 23, "Name" : "zhanjindong", "Sex" : 0, "Uid" : 10001, "_id" : ObjectId("5160dd378bc15cdb61a131fc") }


但是批量更新中可以用任何条件:

 mongos> db.bizuser.insert({"Uid":10002,"Name":"dsfan","Age":23})
2.    mongos> db.bizuser.insert({"Uid":10003,"Name":"junling","Age":25})
3.    mongos> db.bizuser.update({"Age":23},{"$set":{"Sex":1}},false,true)
4.    mongos> db.bizuser.find({"Age":23})
5.    { "Age" : 23, "Name" : "zhanjindong", "Sex" : 1, "Uid" : 10001, "_id" : ObjectId("5160dd378bc15cdb61a131fc") }
6.    { "Age" : 23, "Name" : "dsfan", "Sex" : 1, "Uid" : 10002, "_id" : ObjectId("5160e2af8bc15cdb61a131fd") }


之所以更新单个文档会有这个强制限制是因为如果不指定片键,MongoDB会将更新操作路由到所有分片上,则无法保证更新操作在整个集群中只操作了一次(不同的分片上可能存在相同Uid的数据),指定片键后,更新操作只会路由到某一个分片上,MongoDB能保证只会更新在这个分片找到的第一个符合条件的文档。下面提到的唯一索引问题和这个问题本质是一样的。批量更新没有这个限制很好理解。

排序:在需要调用sort()来查询排序后的结果的时候,以分片Key的最左边的字段为依据,Mongos可以按照预先排序的结果来查询最少的分片,并且将结果信息返回给调用者。这样会花最少的时间和资源代价。 相反,如果在利用sort()来排序的时候,排序所依据的字段不是最左侧(起始)的分片Key,那么Mongos将不得不并行的将查询请求传递给每一个分片,然后将各个分片返回的结果合并之后再返回请求方。这个会增加Mongos的额外的负担。

片键和索引



所有分片的集合在片键上都必须建索引,这是MongoDB自动执行的,所以如果选择某个字段作为片键但是基本不在这个字段做查询那么等于浪费了一个索引,而增加一个索引总是会使得插入操作变慢。

唯一索引问题 如果集群在_id上进行了分片,则无法再在其他字段上建立唯一索引:

mongos> db.bizuser.ensureIndex( { "Uid": 1 }, { unique: true } )
2.    {
3.            "err" : "can't use unique indexes with sharding  ns:OSSP10.bizuser key: { Uid: 1.0 }",
4.            "code" : 10205,
5.            "n" : 0,
6.            "ok" : 1
7.    }


之所以出现这个错误是因为MongoDB无法保证集群中除了片键以外其他字段的唯一性(验证了CAP理论),能保证片键的唯一性是因为文档根据片键进行切分,一个特定的文档只属于一个分片,MongoDB只要保证它在那个分片上唯一就在整个集群中唯一。

如果实现分片集群上的文档唯一性一种方法是在创建片键的时候指定它的唯一性:

mongos> use admin
2.    switched to db admin
3.    mongos> db.runCommand({"enablesharding":"test"})
4.    mongos> db.runCommand({"shardcollection":"test.users","key":{"Uid":1},unique:true})
5.    mongos> use test
6.    switched to db test
7.    mongos> db.users.insert({"Uid":1001})
8.    mongos> db.users.insert({"Uid":1001})
9.    E11000 duplicate key error index: test.users.$Uid_1  dup key: { : 1001.0 }


事实上就是建立了一个唯一索引:



Note:更多关于分片集群上唯一索引问题参见《MongoDB Manual》page468。

哈希索引







哈希索引支持使用任何单个字段包括内嵌文档,但是不能使用复合的字段,因此创建哈希索引的时候也只能指定一个字段:

mongos> db.runCommand({"shardcollection":"mydb.mycollection","key":{"Uid":"hashed","Name":"hashed"}})
2.    {
3.            "ok" : 0,
4.            "errmsg" : "hashed shard keys currently only support single field keys"
5.    }


转自:http://www.cnblogs.com/magialmoon/archive/2013/04/12/3017387.html
分享到:
评论

相关推荐

    MongoDB进阶与实战:微服务整合、性能优化、架构管理.docx

    3. MongoDB 的性能优化:包括索引优化、查询优化、数据分片等。 4. MongoDB 的架构管理:包括集群配置、地址池配置、复制和分片等。 MongoDB 的应用场景包括: 1. 微服务整合:MongoDB 可以与微服务架构相结合,...

    mongodb开发精要 书籍 两本PDF

    分片可以根据范围或哈希进行,以平衡负载并优化读写性能。 七、安全与认证 MongoDB提供了用户身份验证、访问控制、SSL加密等安全特性。在生产环境中,必须启用身份验证并设置合适的权限,以保护数据安全。 八、...

    MongoDB复制集与分片实战应用详解

    内容概要:本文详细介绍了MongoDB复制集和分片的搭建、配置与优化方法,以及故障恢复的具体步骤。复制集部分涉及环境准备、节点配置、网络配置等,确保系统的高可用性。分片部分涵盖分片键选择原则、分片策略优化、...

    深入云计算:MongoDB管理与开发实战详解 源代码

    3. 自动分片:MongoDB的分片功能允许数据自动分散到多个节点上,有助于处理海量数据并提高读写性能。 4. 弹性伸缩:在云计算环境中,MongoDB可以轻松地添加或移除硬件资源,适应业务量的变化。 5. 强大的查询语言...

    mongodb数据库第一阶段:基础

    其分布式文件存储设计使得MongoDB能够轻松地进行水平扩展,通过分片(sharding)技术处理大数据量。然而,对于高度事务性和严格一致性要求的场景,传统的SQL数据库可能仍然是更好的选择。 总之,MongoDB的基础涵盖了...

    MongoDB原理与实战-阿里云-张友东

    **1.10 MongoDB分片集群架构** - **架构概述**: 分片集群通过将数据分布在多个物理服务器上来扩展MongoDB的能力。 - **组件**: - **Shard**: 存储实际数据的服务器。 - **Config Server**: 存储集群元数据的服务器...

    C#\MongoDB应用开发实战\MongoDB

    最后,我们将探讨性能优化技巧,如索引创建、批量操作和命令监控。理解如何正确设计和使用索引可以显著提升查询性能,而批量操作可以减少网络开销。通过监控MongoDB的命令执行,我们可以识别性能瓶颈并进行调优。 ...

    Mongodb视频-燕十八 mongodb视频教程全集21讲+mongodb高级实战开发视频教程

    - 性能优化策略中的索引使用技巧。 **第5讲:聚合框架** - 聚合管道的概念及工作流程。 - `$match`、`$group`、`$sort`等常用聚合阶段的操作。 - 实现复杂统计分析的案例演示。 **第6讲:复制集** - 复制集的配置...

    深入浅出MongoDB应用实战集群及系统架构

    其中,副本集和分片集群是构建高可用和高性能MongoDB系统的关键。 ##### 副本集 副本集是MongoDB的一个关键特性,它通过维护多个相同数据的副本,实现数据冗余和故障恢复。在副本集中,有一个主节点(Primary)和...

    mongodb group aggregate项目实战笔记

    2. **更好的性能**:MongoDB 内部对 `aggregate` 管道进行了优化,尤其是在大数据量的情况下,能够更快地完成数据处理任务。 3. **易于理解和维护**:使用管道方法编写查询更加直观,便于后续的代码维护和扩展。 综...

    阿里巴巴:玩转MongoDB从入门到实战.pdf

    3. **分片集群的使用与原理**:分片集群用于处理大规模数据,通过片键将数据分散在多个分片上,Mongos路由节点负责数据分发和查询聚合,Config Server存储分片集群的元数据,确保数据的均衡分布。 4. **...

    mongodb项目实战(初战)源代码

    最后,MongoDB还支持复制集(Replica Sets)和分片(Sharding)以实现高可用性和水平扩展。复制集确保数据的冗余和故障恢复,而分片则通过在多台服务器上分配数据来处理大量数据。 总的来说,"mongodb项目实战...

    玩转MongoDB4.0从入门到实践、MongoDB基本操作之CRUD、进阶之聚合、中索引的重要性、数据分片

    3. **聚合性能优化**:合理设计索引,避免大范围扫描;减少中间结果集的大小。 #### 四、论MongoDB中索引的重要性 索引是提高查询效率的关键技术之一,在MongoDB中尤为重要: 1. **索引类型**:包括单一字段索引...

    第四阶段模块三-mongodb 复制集 & 分片

    通过实际的代码操作和案例分析,学员将深入了解如何设置复制集来保证数据的一致性和系统的高可用,学习如何设计和优化分片策略以应对不同的业务需求和性能挑战。此外,本模块还涵盖了与SpringBoot等现代Java框架的...

    《MongoDB实战》第2版-目录1

    7. 伸缩性:MongoDB具有良好的水平扩展性,通过分片(sharding)技术可以将数据分散到多台机器上,以应对大数据量和高并发场景。 8. 核心服务和工具:MongoDB的核心服务器提供了数据库引擎、网络通信和存储管理等...

    掌握MongoDB:NoSQL数据库基础与高级特性教程.rar

    索引与性能优化 创建索引 索引类型 索引优化 聚合操作 聚合框架 常用聚合操作 数据库管理 备份与恢复 用户管理与权限控制 分片与复制 复制集 分片 实战案例 使用 MongoDB 实现简单的博客系统 目录 什么是 MongoDB ...

    58同城高级系统架构师带你实战MongoDB集群分布式存储

    1. **分片(Sharding)**:用于解决单一MongoDB实例无法满足大规模数据存储和访问需求的问题。分片将数据水平切分到多个MongoDB实例上,每个实例称为一个**分片服务器**。通过分片可以极大地提高系统的处理能力和...

    深入探索MongoDB集群模式:从高可用复制集到动态扩容实战

    本文深入探讨了MongoDB的集群模式,特别是复制集和分片机制,旨在帮助用户理解如何构建高可用性和可扩展性的MongoDB环境。 复制集是MongoDB实现高可用性的重要手段。其核心功能包括数据复制、读写分离以及异地容灾...

    mongoDB入门实战手册(中文版)

    4. **水平可扩展性**:支持分片(sharding),能够横向扩展到多个服务器。 5. **地理空间索引**:内置地理空间索引功能,适用于地图应用等场景。 6. **复制集**:提供高可用性解决方案,通过复制集实现数据冗余和...

Global site tag (gtag.js) - Google Analytics