`
liuhaixiao
  • 浏览: 151060 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MongoDB 全局锁

 
阅读更多

摘抄自:http://www.linuxidc.com/Linux/2012-02/53133.htm

MongoDB有所了解的人都知道,MongoDB有一个让人头疼的全局锁读写锁,允许并发读,而写会阻塞所有的读写),要命的是这个锁不是表级的,不是库级的,而是整个Server级别的,这让人听起来是不是非常的蛋疼。

在2.0版本以前,这一问题一直没有得到解决,于是有人提出,在可预见某个update操作的记录可能在磁盘上时,为了减少写锁占用的时间,可以采用先读后写的方式,通过先读一次,将要操作的记录加载到内存中,再进行内存中的update,这样写锁就不包括将数据从磁盘加载到内存的时间了。

在可预见数据冷热的情况下,这种操作能够有一定的效果,但是很明显,这种变态的方法不应该是一个终极解决方案。

值得庆幸的是,在2.0版本中,MongoDB宣称有很大程度的并发性能提升,而这一提升的基础正是解决了这个全局锁的问题。

解决的方法并不是通过减少锁粒度来解决,虽然collection级别的锁机制也正在开发中。(SERVER-1240

解决方法是通过对一些可能造成长时间锁占用的操作进行锁抑制。比如和我们上面的方法类似,在进行update操作时,如果发现需要更新的记录在磁盘上,那么这个锁就不会一直占用,而是等到将数据从磁盘加载到内存后再添加写锁进行update。

而同理,对于其它一些可能耗时比较长的操作也可以采用类似的方法,通过将长时间占用的全局锁拆分成多个细粒度的小锁来使需要获取锁来进行的操作能够交错的执行,从而避免一夫当关万夫莫开的情况,主要包括下面一些操作:

  • 查询操作
  • 批量更新操作
  • 批量删除操作
  • 批量insert写入操作

如果你还在使用2.0以前的版本,并且在并发性能上出现问题,可以考虑在2.0.x版本上进行一些性能测试并对你的MongoDB进行升级。

2.0版本中的改进听起来是可行的,然而他的实际效果如何呢,这里有两张性能测试图片,来自blog.pythonisito.com的测试。

第一张是在不触发page faulting的情况下1.8版本和2.0版本在加了写锁后的性能对比,可以看出,在写操作能够直接在内存中完成的情况下,二者的性能几乎没有差别。

第二张图是在写操作会触发page faulting的情况,也就是在1.8中,加写锁的时间会包括将数据从磁盘讲到内存的时间,而在2.0中不包括这段时间。可以看出2.0版本中情况好了很多,因为采用了锁抑制策略,使得产生page faulting后还能有较好并发性能。

分享到:
评论

相关推荐

    云数据库MongoDB监控指标解读与关注.pdf

    - globalLock指标:包含当前活动读写锁的客户端总数、等待队列的长度以及全局锁的创建时间和持有时间等信息。了解这些指标能够帮助识别数据库的锁竞争状况和性能瓶颈。 - Locks指标:提供关于读写锁的详细信息,包括...

    mongodb性能监控

    全局锁信息中的 `totalTime` 和 `lockTime` 分别表示总运行时间和锁时间,`ratio` 是锁占用的百分比,`currentQueue` 和 `activeClients` 描述了当前的客户端连接情况。如果锁时间比例较高,可能意味着存在锁竞争,...

    springboot-mongodb-mybatis-demo.zip

    Mybatis-Plus3.1.0版本引入了一些新特性,如:乐观锁、多数据源支持、代码生成器等,使得开发者可以更加专注于业务逻辑。 3. MongoDB的集成: MongoDB是一个高性能、高可用的分布式NoSQL数据库,特别适合处理大...

    mongoDB springBoot(cloud)整合mongoDB(增删改查)

    而 Spring Cloud 提供了一套微服务解决方案,包括服务注册与发现、配置中心、熔断器、路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等。当我们将这三者结合时,可以创建出高效、可靠...

    MongoDB监控.pdf

    - **--locks**:显示锁的信息,包括全局锁和数据库锁。 #### 四、应用场景 1. **性能瓶颈分析**:通过监控数据可以定位到导致性能下降的操作类型或具体的数据库/集合。 2. **异常检测**:及时发现连接数激增、操作...

    mongodb运维_动力节点Java学院整理

    2. `serverStatus()` 函数:提供包括全局锁、索引、用户操作在内的服务器统计信息。 3. `mongostat`:实时显示数据库状态,如每秒的读写操作、内存使用等,有助于诊断性能问题。 三、安全认证 MongoDB 支持用户验证...

    MongoDB在唯品会的使用与踩过的坑.pdf

    在早期版本的MongoDB中,存在一个全局锁(Global Lock)的问题,这导致了单个操作可能会阻塞其他所有操作。这一机制限制了系统的并发性和整体性能。 - **解决方案**:升级至更高版本的MongoDB,例如3.0以上版本,这些...

    MongoDB4新功能介绍.pptx

    从存储引擎(如WiredTiger)的改进,到复制协议的增强以提供更严格的一致性和耐久性,再到分片架构的优化和全局逻辑锁的实施,以及集群源数据管理和驱动及API的改进,MongoDB的每次迭代都在为支持事务铺平道路。...

    基于springcloud + token + redis + mongodb 的微服务平台.zip

    SpringCloud是Spring生态系统中的一个子项目,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)中快速构建一些...

    使用zabbix监控mongodb的方法

    - **锁等待**:全局锁比率和等待队列长度,高锁等待可能表示系统负载过大或存在锁竞争问题。 - **系统资源**:CPU使用率、磁盘空间使用,确保系统资源充足。 综上所述,监控MongoDB是保障数据库健康运行的重要环节...

    MongoDB db.serverStatus()输出内容中文注释

    7. **globalLock**:这部分信息与全局锁有关,它影响所有数据库操作的并发性。 - **totalTime**:全局锁自启动以来保持锁定的总微秒数。 - **lockTime**:全局锁锁定的总微秒数。 - **ratio**:锁定时间占总时间...

    Mongodb疑难杂症及优化.pdf

    通过维护一个全局有序的日志,MongoDB可以确保副本集中的各个成员能够同步最新的数据变更。然而,在实际使用过程中,Oplog也可能遇到各种问题,本节将详细介绍几个常见的Oplog问题及其解决方案。 #### 二、Oplog...

    深入讲解MongoDB的慢日志查询(profile)

    9. `locks`:锁的获取情况,包括全局锁、数据库锁和集合锁。 10. `nreturned`:返回的文档数量。 11. `responseLength`:响应的总长度。 12. `millis`:操作执行的毫秒数。 13. `execStats`:执行统计信息,包含了...

    MongoDB中的一些坑(最好不要用)

    为了避免这种情况,应尽量避免长时间占用写锁的操作,并考虑将大操作分散到不同的数据库中,以减少全局阻塞的风险。 其次,创建索引是另一个可能引起数据库阻塞的问题。MongoDB 在前台创建索引时会锁定整个数据库,...

    Mongodb批量删除gridfs文件实例

    需要注意的是,`db.repairDatabase()` 会获取全局写锁,这意味着在执行期间,其他所有数据库操作都会被阻塞。此外,这个过程可能非常耗时,尤其是在大型数据库上,并且需要与数据库相同大小的可用磁盘空间。如果你的...

    在MongoDB中模拟Auto Increment的php代码

    在实际应用中,这个方法可以很好地处理大部分情况下的自增ID需求,但如果你需要处理高并发场景,可能需要考虑使用更复杂的策略,例如使用分布式锁或者基于时间戳的解决方案,以确保全局唯一性。 总的来说,MongoDB...

    MongoDB 数据库的命名、设计规范详解

    - **强制**:避免自定义`_id`字段,因为MongoDB默认会生成全局唯一的`_id`,自定义可能导致性能下降。 - **建议**:相似类型的文档应放入同一集合,利于索引利用。 - **建议**:如果大小写不敏感,建议统一存储大...

Global site tag (gtag.js) - Google Analytics