设为首页 收藏本站
查看: 1011|回复: 0

[经验分享] MongoDB中的读写锁

[复制链接]

尚未签到

发表于 2017-12-15 08:37:55 | 显示全部楼层 |阅读模式
  原文地址
  1. MongoDB 使用的锁
  MongoDB 使用的是“readers-writer”锁, 可以支持并发但有很大的局限性
  当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个写锁的存在,一个单一的写操作会”exclusively“持有该锁,同一时间其它写操作不能使用共享这个锁;
  举个例子,假设一个集合里有10个文档,多个update操作不能并发在这个集合上,即使是更新不同的文档。
  2. 锁的粒度
  在 2.2 版本以前,mongod 只有全局锁(锁定一个server);
  从2.2 版本开始,大部分读写操作只锁一个库(database),相对之前版本,这个粒度已经下降,例如如果一个 mongod 实例上有 5 个库,如果只对一个库中的一个集合执行写操作,那么在写操作过程中,这个库被锁;而其它 5 个库不影响。相比 RDBMS 来说,这个粒度已经算很大了!
  更新:MongoDB 3.4版本,写操作的锁定粒度在表中数据记录(document)级别,即使操作对象可能是多条数据,每条数据在被写入时都会被锁定,防止其他进程写入;但是写操作是非事务性的,即写入多条数据,即使当前写入操作还没有完成,前面已经写入的数据也可以被其他进程修改。除非指定了$isolated,一次写入操作影响的数据无法在本次操作结束之前被其他进程修改。
  $isolated也是非事务性的,即如果写入过程出错,已经完成的写入操作不会被rollback;另外,$isolated需要额外的锁,无法用于sharded方式部署的集群。
  官网文档链接
  3. 如何查看锁的状态
  db.serverStatus()
  db.currentOp()
  mongotop  # 类似top命令,每秒刷新
  mongostat
  the MongoDB Monitoring Service (MMS)
  4. 哪些操作会对数据库产生锁?
  下表列出了常见数据库操作产生的锁。
操作锁定类型查询读锁通过cursor读取数据读锁插入数据写锁删除数据写锁修改数据写锁Map-reduce读写锁均有,除非指定为non-atomic,部分mapreduce任务可以同时执行(猜测是生成的中间表不冲突的情况下)添加index通过前台API添加index,锁定数据库一段时间db.eval()写锁,同时阻塞其他运行在MongoDB上的JavaScript进程eval写锁,如果设定锁定选项是nolock,则不会有些锁,而且eval无法向数据库写入数据aggregate()读锁  附上原文:
  Operation   Lock Type
  Issue a query   Read lock
  Get more data from a cursor Read lock
  Insert data Write lock
  Remove data Write lock
  Update data Write lock
  Map-reduce  Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently.
  Create an index Building an index in the foreground, which is the default, locks the database for extended periods of time.
  db.eval()   Write lock. db.eval() blocks all other JavaScript processes.
  eval    Write lock. If used with the nolock lock option, the eval option does not take a write lock and cannot write data to the database.
  aggregate() Read lock
  5. 哪些数据库管理操作会锁数据库?
  某些数据库管理操作会 exclusively 锁住数据库,以下命令需要申请 exclusively 锁,并锁定一段时间
  db.collection.ensureIndex(),
  reIndex,
  compact,
  db.repairDatabase(),
  db.createCollection(), when creating a very large (i.e. many gigabytes) capped collection,
  db.collection.validate(),
  db.copyDatabase() # 可能会锁定所有数据库(database)
  
  以下命令需要申请 exclusively 锁,但锁定很短时间。
  db.collection.dropIndex(),
  db.collection.getLastError(),
  db.isMaster(),
  rs.status() (i.e. replSetGetStatus,)
  db.serverStatus(),
  db.auth(), and
  db.addUser().
  备注:可见,一些查看命令也会锁库,在比较繁忙的生产库中,也会有影响的。
  6. MongoDB内部可能锁住多个库的操作
  以下数据库内部操作会锁定多个库。
  日志管理  MongoDB的内部操作,每个一段时间就锁定所有数据库,所有的数据库共享一份日志
  用户认证 锁定admin数据库和用户正在申请访问的数据库
  所有写入备份数据库(replica)的操作都会锁定写入目标数据库和本地数据库,本地数据库的写入锁允许写入主节点的oplog
  原文:
  Journeying, which is an internal operation, locks all databases for short intervals. All databases share a single journal.
  User authentication locks the admin database as well as the database the user is accessing.
  All writes to a replica set’s primary lock both the database receiving the writes and the local database. The lock for the local database allows the mongod to write to the primary’s oplog.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424256-1-1.html 上篇帖子: PHP7源码安装MongoDB和MongoDB拓展 下篇帖子: CentOS7上Mongodb安装、卸载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表