MongoDB可靠性和持久性

490 阅读4分钟

MongoDB可靠性和持久性

首先,MongoDB并不总是尊重原子性,并且在并发操作期间不定义事务完整性或隔离级别。因此,进程在更新集合时可能会相互踩到脚趾。只有特定类的操作(称为修饰符操作)提供原子一致性。

MongoDB为原子更新定义了一些修饰符操作:

  • $inc-增加给定字段的值

  • $set-设置字段的值Sunset删除字段

  • $push-将值追加到字段

  • $pushall-将数组中的每个值追加到字段

  • $addToSet-如果数组不存在,则将值添加到数组中Spop删除数组中的最后一个元素

  • $pull-从字段中删除所有值

  • $pullall-从字段中删除数组中每个值的所有出现

  • $rename-重命名字段

缺少隔离级别有时也会导致幻像读取。如果修改基础数据,游标不会自动刷新。

默认情况下,MongoDB 每分钟刷新到磁盘一次。那时,数据插入和更新将记录在磁盘上。两个同步之间的任何失败都可能导致不一致。您可以增加同步频率或强制刷新到磁盘,但所有这些都是以牺牲某些性能为代价的。

为避免在系统故障期间完全丢失,建议设置复制。可以按照主从排列设置两个MongoDB实例,以复制并保持数据同步。复制是一个异步过程,因此更改不会在发生后立即传播。但是,复制数据总比没有任何替代方案要好。在当前版本的MongoDB中,主从副本对已被副本集取代,其中三个副本在一个集中。三人中的一个扮演主人的角色,另外两个充当奴隶。副本集允许自动恢复和自动故障转移。

虽然复制更多地被视为故障转移和灾难恢复计划,但分片可用于水平扩展。

分布式

使用MongoDB的一个常见原因是它的无模式集合,另一个原因是它固有的性能和扩展能力。在较新的版本中,MongoDB支持自动分布式,以便轻松水平扩展。

分布式的基本概念与列数据库的主工作线程模式的思想非常相似,其中数据分布在多个范围服务器上。MongoDB允许在多台机器上保存有序的集合。然后,保存部分集合的每台计算机都是一个分片。复制分片以允许故障转移。因此,一个大型集合可以拆分为四个分片,每个分片可以依次复制三次。这将创建12个MongoDB服务器单元。每个分片的两个附加副本用作故障转移单元。

分片位于集合级别,而不是数据库级别。因此,数据库中的一个集合可能驻留在单个节点上,而同一数据库中的另一个集合可能分片到多个节点。每个分片存储有序文档的连续集。这样的捆绑包在MongoDB术语中被称为块。每个区块由三个属性标识,即第一个文档键(最小键)、最后一个文档键(最大键)和集合。

集合可以根据任何有效的分片键模式进行分片。

集合或集合中两个或多个文档字段的组合可用作分片键的基础。除了用于定义分片键的字段外,分片键还包含顺序方向属性。顺序方向可以是 1,表示升序,也可以为 -1,表示降序。

请务必谨慎选择分片键,并确保这些键能够以均衡的方式对数据进行分区。

有关分片及其维护的块的所有定义都保存在配置服务器的元数据目录中。与分片本身一样,配置服务器也会被复制以支持故障转移。客户端进程通过mongos进程访问MongoDB集群。mongos 进程没有持久状态,并从配置服务器中提取状态。

MongoDB集群可以有一个或多个mongos进程。Mongos 进程负责适当地路由查询并在需要时组合结果。对MongoDB集群的查询可以是目标的,也可以是全局的。所有可以利用数据排序的分片键的查询通常是目标查询,而不能利用索引的查询都是全局查询。目标查询比全局查询更有效。将全局查询视为涉及完整集合扫描的查询。

下图 描述了 MongoDB 的分布式架构。

238b0718-12d7-4620-a16c-b65758189901.jpg


本文正在参加「金石计划 . 瓜分6万现金大奖」