MongoDB的写入安全级别

太阳2年前技术文章1150

一、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}})

相关文章

CDH实操--配置Kerberos服务高可用(一)

CDH实操--配置Kerberos服务高可用(一)

前置条件1.主Kerberos已安装并与CDH集成2.备节点安装Kerberos服务yum -y install krb5-server krb5-libs krb5-auth-dialog krb5...

ip_foward未开启导致slb健康检查异常

ip_foward未开启导致slb健康检查异常

现象:在slb上配置一条7层http监听,并开启健康检查,发现健康检查一直异常。处理步骤:针对slb健康检查异常的问题,可从以下四个方面入手,排查原因。1、确认服务器上业务程序正常启动,且在后端服务器...

MySQL 8.0 不可见索引使用

一、具体信息1、在提供 SQL 优化意见的时候包括了两个冗余索引的内容,具体内容如下:查看慢 SQL 的时候发现 database 库 table 表中存在冗余索引,具体冗余索引情况如下:KEY `k...

PromQL查询解析

一. 概述Prometheus除了存储数据外,还提供了一种强大的功能表达式语言 PromQL,允许用户实时选择和汇聚时间序列数据。表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部...

Python 序列化与反序列化

1、为什么要序列化内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?如果是自己定义的类的实例,如何保存到一个文件中?如何从文件中读取数据,并让它们在内存中再次恢复成自己对应的类的实例?要设计...

MySQL运维实战之ProxySQL(9.4)proxysql和后端MySQL自动切换

MySQL运维实战之ProxySQL(9.4)proxysql和后端MySQL自动切换

如上图架构,当后端MySQL主库出现问题,发生主备切换后,如何自动将ProxySQL的读写切换到新的主库上?可以通过mysql_replication_hostgroups表配置实现:insert&n...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。