乐趣区

关于人工智能:性能最佳实践事务处理和读写策略原来这么关键

MongoDB 针对高级,中级及纯熟的技术开发人员推出系列技术文章与行业案例。深入浅出地分析 MongoDB 产品根底原理,应用技巧,典型行业场景及利用,还有 Code Demo 及线上线下流动举荐!欢送浏览无关 MongoDB 性能最佳实际的系列博文。

MongoDB 的文档模型能够将相干数据会集到一起,简化了传统关系型数据库中须要通过父子表关系建模的复杂性。其单文档操作具备原子性,可能满足大多数应用程序对数据完整性的要求。在 MongoDB 中,单个操作能够同时更新多个字段,包含对多个子文档和数组元素的批改。MongoDB 首先会确保文档在更新过程中的齐全隔离;同时,任何操作谬误都会触发回滚机制,保障客户端获取的文档总是统一的。

MongoDB 中的事务为开发者提供了一种相熟的体验,如同关系型数据库中的事务一样,具备多语句反对和类似的语法结构,便于集成到任何应用程序中。事务通过提供快照隔离来确保数据的一致性,并且遵循“全有或全无”的准则,同时对那些不依赖于事务个性的工作负载的性能没有负面影响。您能够通过查阅咱们在 VLDB 会议上公布的论文中的 TPC- C 基准测试后果来理解事务的性能体现。此外,咱们提供了一些策略,帮忙您在应用程序中最大限度地利用 MongoDB 事务的劣势。

创立长时间运行的事务,或在单个 ACID 事务中执行过多操作,都可能对 WiredTiger 存储引擎的缓存造成显著压力。这是因为缓存须要从最早的快照创立开始,就为后续所有的写入操作放弃状态。因为事务在运行过程中始终应用同一快照,因而缓存中会一直积攒新的写入,直到长时间运行的事务提交或停止,开释其所持锁定时,这些写入能力从缓存中被革除。为了放弃数据库性能的可预测性,开发人员应思考以下倡议。1 事务运行时限度默认状况下,MongoDB 会主动终止运行工夫超过 60 秒的多文档事务。不过,如果服务器的写入负载绝对较低,您能够调整事务设置,缩短其执行工夫。为了避免事务超时,倡议将大型事务拆分成多个较小的操作,确保它们可能在设定的工夫限度内实现。同时,该当优化查问模式,并确保领有适合的索引,这样能够在事务过程中快速访问数据。
2 事务中的操作数量尽管在事务中读取的文档数量并没有严格的限度,但从最佳实际来看,倡议在一个事务中批改的文档数量不要超过 1,000 个。对于须要批改超过 1,000 个文档的操作,开发人员应思考将这些操作合成为多个局部,每个局部解决一批文档,以此来组织事务。
3 分布式、多分片事务跨多个分片执行的事务会带来较高的性能开销,因为这须要在多个节点间通过网络进行协调。在多分片环境中,只有应用快照读关注点(snapshot read concern)能力保障提供统一的数据快照。然而,如果对提早的敏感度超过了对跨分片读取一致性的需要,能够抉择默认的本地读关注点,该选项在每个分片的本地快照上进行操作。
4 异样解决当事务被停止时,相干的异样会被返回给客户端驱动程序,并且事务的更改会被齐全撤销。开发人员须要在应用程序中实现逻辑来捕捉这些异样,并对因暂时性问题(例如多版本并发管制(MVCC)的写入抵触、短暂的网络谬误或主节点选举)而停止的事务进行重试。当启用可重试写入性能时,MongoDB 的驱动程序会主动重试提交事务的操作。
5 写入提早的劣势只管刚开始可能不那么直观,但应用多文档事务实际上能够通过缩小提交所需的提早来晋升写入性能。当采纳“w:majority”这一写关注点时,如果执行 10 次独立的更新操作,每次更新都必须期待复制到少数节点的工夫。而如果把这 10 个更新操作放入一个事务中执行,这些操作会在事务提交时一次性复制。这种做法能够将提早升高到原来的十分之一。

MongoDB 容许您在执行写操作时抉择所需的持久性级别,这被称为写关注点(write  concern)。值得注意的是,写关注点实用于数据库中的所有操作,无论是对单个文档的简略操作还是多文档事务的一部分。您能够依据须要在每个连贯、数据库、汇合,甚至是单个操作的根底上配置以下选项:
●  已确认写入:这是默认设置。mongod 确认执行了写操作,这样客户端就能捕捉到网络问题、键抵触、模式验证谬误等异样。
● 已写入日志:mongod 仅在操作被记录到主节点的操作日志后才确认写操作。这确保了即便 mongod 解体,写操作也能失去保留,保障了写入的持久性。
● 已复制:您还能够抉择期待操作被正本集中的其余成员确认。MongoDB 反对将写入确认到指定数量的正本。这也确保了写操作被记录在包含主节点在内的辅助节点的日志中。
● 大多数:这种写关注点期待写操作被大多数正本集成员利用,并且在主节点选举事件中不会被回滚。这也确保了写操作被记录在这些成员的日志中,包含主节点。以上是 MongoDB 中对于写关注点的选项,它们帮忙您依据利用需要调整数据的持久性和复制保障。

与写关注点相似,读关注点也实用于数据库中的任何查问操作,无论是对单个文档或一组文档的惯例读取,还是作为多文档事务的一部分。为了保证数据的隔离性和一致性,能够将读关注点设置为 majority。这意味着只有当数据曾经被复制到正本集大多数成员之后,这些数据才会返回给应用程序,从而保障在主节点选举过程中数据不会产生回滚。MongoDB 还提供了“可线性化”(linearizable)的读关注点级别。启用可线性化读关注点能够确保在读取数据时,该节点仍是正本集的主节点,并且在产生主节点切换后,所返回的数据不会被回滚。然而,配置此级别的读关注点可能会显著减少提早,因而倡议设置 maxTimeMS 值来为长时间运行的操作设定超时限度。

因果一致性确保在客户端会话中,无论申请被哪个正本节点服务,每次读操作都能看到前一次写操作的后果。您能够依据须要启用因果一致性,仅在须要保障读操作的程序性时应用它,从而缩小潜在的提早影响。

设置阿里云 MongoDB 的默认写关注。阿里云 MongoDB 已最新反对 7.0 版本,您能够在阿里云 MongoDB  实例详情页的「参数设置」局部,依据须要,对于阿里云 MongoDB 的默认写关注进行设置。

退出移动版