MongoDB Write Concern整理

本文介绍了MongoDB中用于衡量性能和写安全性的writeconcern配置参数。详细解析了ErrorsIgnored、Unacknowledged、Acknowledged、Journaled及ReplicaAcknowledged等不同级别的特点,帮助用户根据实际场景选择合适的设置。

 MongoDB提供了一个配置参数:write concern 来让用户自己衡量性能和写安全。分布式数据库中这样的参数比较常见,记得Cassandra中也有一个类似参数,不过那个好像是要写入几个节点返回成功。其实道理都一样分布式的集群环境考虑到性能因素不能确保每个成员都写入后在返回成功,所以只能交给用户根据实际场景去衡。

    Mongodb提供了以下几个可选设置:Errors Ignored(不推荐),Unacknowledged,Acknowledged,Journaled。列出的级别分别是安全性一次增强的。解释一下每一个选项的特点。

    Errors Ignored [-1]

一个比较不靠谱级别,发出谢写令后就不再理会,即使现在有网络问题也不会发出异常。其实这个官方已经明确给出了警告,闲着没事别用这个。

    Unacknowledged [0]

这个级别也属于比较低的级别,以前这个级别是驱动配置的默认级别,不过后来调整成Acknowledged级别。在这个级别下,这个驱动会根据当前系统的网络配置进行网络问题的检测,不等待Mongd的返回。代码测试:本地网络问题是否有异常?本地网络无问题是远程server问题是否异常?

    Acknowledged [1]

这个级别算是中等级别的配置,这个级别能够拿到mongod的返回信息:dupkey Error,以及一些其他的问题。现在这个级别是驱动的默认级别,估计是10gen公司发现好多人评价Mongodb不靠谱后改的。一般系统这个级别也就够用了。由于默认级别是Acknowledged,内部用getLastError方法检查是否写入成功的时候是也不用设置任何参数,对与Replset来说可以在配置中进行getLastErrorDefaults的配置,如果没有的话默认则是Master收到就ok。

    Journaled [1, journal=true ]

等到操作记录到Journal Log中才返回操作结果,也就是下一次JournaledLog提交。这种情况可以容忍服务器突然宕机,断电等意外的恢复。出去上边的配置还要在启动mongod的时候加上journaling 参数确保可以使用。commitlog提交间隔时间是可以配置的,单磁盘设备(physical volume, RAID device, or LVM volume)每100ms提交一次,和数据文件刷出相同频率,日志和数据分开磁盘设备的30ms提交一次。在插入数据是如果使用{j:true}则会缩短到已配置的默认设置1/3的时间。

    Replica Acknowledged [>1 or majority]

在副本集中如果w设置为2的话则至少已经吸入到一个secondary中,我猜测写入secondary这个级别是Acknowledged级别,majority是多个secondary已经写入。如果手贱设置w参数大于replset中需要复制的secondarys的话,操作就一直等待直到达到已写入数据的服务器数量符合要求,也可以设置timeout值来指明最长等待时间。{ getLastError: 1, w: 2, wtimeout:5000 }    

MongoDB的写关注(Write Concern)定义了写操作需要在多少个副本集成员上成功确认后,才向客户端返回确认信息。写关注可以通过指定不同的级别来平衡数据的持久性和写操作的性能。例如,`w: 1` 表示写操作只需要在主节点上确认即可返回;`w: "majority"` 表示写操作需要在大多数节点上确认后才返回,这能确保数据在多数节点上持久化,提高数据的安全性。 MongoDB的读偏好(Read Preference)决定了客户端从哪些副本集成员读取数据。读偏好有多种模式,如 `primary` 模式,客户端只从主节点读取数据,保证读取到的是最新写入的数据;`secondary` 模式,客户端从从节点读取数据,可以减轻主节点的读压力;`nearest` 模式,客户端会从网络延迟最小的节点读取数据,提高读取性能。 在分布式环境中配置实现强一致性读取的方法如下: 1. **设置读偏好为 `primary`**:将客户端的读偏好设置为 `primary` 模式,这样客户端始终从主节点读取数据,因为主节点保存了最新写入的数据,从而保证读取的强一致性。 ```python from pymongo import MongoClient, ReadPreference client = MongoClient('mongodb://localhost:27017/', read_preference=ReadPreference.PRIMARY) db = client['your_database'] collection = db['your_collection'] ``` 2. **结合写关注 `w: "majority"`**:在进行写操作时,设置写关注为 `w: "majority"`,确保写入的数据在大多数节点上持久化。这样在从主节点读取数据时,能保证读取到的数据是最新且一致的。 ```python collection.insert_one({"key": "value"}, write_concern={"w": "majority"}) ``` 3. **使用因果一致性会话(Causal Consistency Sessions)**:MongoDB 支持因果一致性会话,通过开启因果一致性会话,能保证客户端在后续的读操作中看到之前写操作的结果,维护因果关系。 ```python session = client.start_session(causal_consistency=True) with session: result = collection.find_one({"key": "value"}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值