MongoDB的写入安全级别
一、MongoDB写入安全级别
为提高数据写入的安全性,在客户端可以设置相应的安全级别来进行控制,MongoDB提供四种写入级别,分别是:
1、非确认式写入(Unacknowledged)
非确认式写入不会返回任何结果,对于写操作,在没有得到服务器写入确认的情况下就立即返回结果。好处是写入效率高,不会阻塞客户端,缺点是无法确定数据是否真正的写入成功
2、确认式写入(Acknowledged)
写操作必须得到服务器的写入确认,如果写入失败会返回“DuplicateKey Error”。此时如果有数据没有写入journal日志,更没有落盘,若服务器突然断电,此时会丢失100ms的数据。
3、日志写入(Journaled)
写操作不仅要得到服务器的写入确定,还要求数据写入journal才会返回数据写入成功,保证数据库数据安全
4、副本集确定式写入(Replica Acknowledged)
不仅要得到主节点的写入确定,还需要得到备份节点的写入确定才会返回客户端数据写入成功。
二、如何控制写级别
MongoDB的写入界别是通过客户端的getLastError来实现的。
1、getLastError参数解释
字段 | 类型 | 含义 |
j | Boolean | 如果为 true,就不需要等待写操作写入 journal 才返回。 |
w | integer or string | 如果为 1,表明只需等待 Primary 写入确认即可返回。 如果为 2,表明必须等待 Primary 和 Secondary 都写入确认才可返回。 |
fsync | Boolean | 如果为 true,表明数据必须落地磁盘才可返回。 其实只要写操作写入 journal ,数据就不会丢啦。 |
wtimeout | integer | 等待的毫秒数,指定毫秒数内未返回,抛出错误。 |
如需实现以上的隔离级别,只需要在执行完操作后,立马执行getLastError命令即可。
2、各写入级别以及对应getLastError参数
写入级别 | getLastError参数 |
Unacknowledged | 不调用getLastError |
Acknowledged | {w: 1} |
Journaled | {w: 1, j: true} |
Replica Acknowledged | {w: 2} |
//测试数据 var doc1 = { name:"xiaoli", age:20, address: { province:"GuangDong", city:"ShenZhen" } } - 非确认式写入 var result = db.aa.insert(doc1,{writeConcern:{w:0}}) printjson(result) - 确认式写入 var result = db.aa.insert(doc1,{writeConcern:{w:1}}) printjson(result) - 日志写入 + wtimeout var result = db.aa.insert(doc1,{writeConcern:{w:1,j:true,wtimeout:5}})