MongooDB从 3.0开始引入可插拔存储引起的概览,目前主要有 MMAPV1、WiredTiger 存储引起可供选择。在3.2版本之前MMAPV1是默认的存储引起,其采用liunx操作系统的内存映射技术,但一直饱受逅病;3.4以上版本默认的存储引起是 wiredTiger,相对于 MMAPV1 其有如下优势
- 读写操作性能更好,WiredTiger 能更好的发挥多核系统的处理能力
- MMAPV1 引擎使用表级锁,当某个单表上有并发的操作,吞吐将受到限制。WiredTiger 使用文档级锁,由此带来并发和吞吐行的提高
- 相比MMAPV1 存储索引时 WiredTiger 使用前缀压缩,更节省对内存空间的消耗
- 提供压缩算法,可以大大的降低对硬盘资源的消耗,节省约60%以上的硬盘资源
WT写入的原理:
Journaling类似于关系数据库中的事务日志。Journaling能够使MongoDB数据库由于意外故障后快速恢复。MongoDB2.4版本后默认开启了Journaling日志功能,mongod实例每次启动时都会检查journal日志文件看是否需要恢复。由于提交journal日志会产生写入阻塞,所以它对写入的操作有性能影响,但对于读没有影响。在生产环境中开启Journaling是很有必要的。
写策略解析:
写策略配置:{ w: <value>, j: <boolean>, wtimeout: <number> }
- w:数据写入到 number 个节点才向用客户端确认
- {w:0} 对客户端的写入不需要发送任何确认,使用于性能要求高,但不关注正确性的场景
- {w:1} 默认的 writeConcern ,数据写入到 Primary 就向客户端发送确认
- {w:"majority"} 数据写入到副本及大多数成员后想客户端发送确认,适用于对数据安全性要求比较高的场景,改选项会降低写入性能
- j:写入操作的 journal 持久化后猜想客户端确认,默认为{j:false},如果要求写入持久化了才向客户端确认,则指定该选项为 true
- wtimeout:写入超时时间,仅w的值大于 1 时有效
- 当指定{w: }时,数据需要成功希尔number个节点才算成功没如果写入过程中有节点故障,可能导致这个条件一致不能满足,从而一致不能向客户端你发送确认结果,针对这种情况,客户端可设置wtimeout选项来指定超时时间,当写入过程持续超过该时间认为结束,则认为写入失败
实例脚本:
//需要等待返回结果
db.users.updateMany({"username":"test"},{"$unset":{"country":"","age":""}},{writeConcern: {w:1, j: true, wtimeout: 5000 }})
//不需要等待返回结果
db.users.updateMany({"username":"test"},{"$unset":{"country":"","age":""}},{writeConcern: {w:0, j: true, wtimeout: 5000 }})
最后修改于 2019-12-05 16:51:23
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

