事务背景介绍(2):MongoDB中的逻辑会话

摘要

通过创建逻辑会话,现在可以跟踪单操作事务或者包含多个操作的事务在整个系统中资源消耗情况。这样就可以简单地,精确地取消事务中的操作以及采取分布式的模式进行垃圾回收。

背景

从历史情况来看,MongoDB中有许多操作可以从此跟踪中受益,例如从客户端发起的读写操作,会通过mongos查询路由器,到达分片集群以及组成集群的副本集。但当前还没有这样的一个标识符来跟踪这些操作,因此系统需依赖于一系列启发式算法。

逻辑会话

MongoDB的解决方案是创建逻辑会话和逻辑会话标识符。这是一个小的唯一标识符,称为lsid,可以由客户端将其附加到与MongoDB集群通信的会话中,相反,MongoDB集群又会将此lsid附加到该客户端使用的任何资源上。

MongoDB驱动程序会在客户端自动生成该lsid,无需调用集中的生成ID服务。lsid由一个id组成,它是客户端生成的GUID(全局唯一ID),以及一个uid,它是用户名的SHA256摘要。

从MongoDB 3.6开始,任何客户端操作都与逻辑会话相关联。然后,逻辑会话标识符lsid将与跨群集的命令操作相关联。

逻辑会话与取消操作

任何操作都会消耗资源。例如,一个find操作将在集群中的所有相关分片上创建游标。每个游标将开始获取第一批返回的结果。在逻辑会话退出之前,为了取消这样的操作,意味着需要遍历所有具有管理权限的分片,确定哪些活动与您的操作相关联,然后将其停止。

这个过程也带来了额外的复杂性。如果与发出相关命令的mongos进程失败了,取消过程会更加困难,你必须等待游标构建他们的第一批返回结果,然后超时地等待结果返回。

使用逻辑会话,整个过程将变得简单。可以向群集里运行的特定逻辑会话发出kill命令。由于所有资源(包括游标)都标记有逻辑会话标识符,因此停止和释放这些与特定lsid相关联的资源变成相对简单的操作。由于用户标识也是lsid的一部分,因此也可以向集群发出删除特定用户下所有会话资源的命令。

逻辑会话和分布式垃圾收集

之前,MongoDB中的资源超时都是本地所在节点要处理的事情; 资源所在的节点将决定资源是否已超时以及是否需要进行垃圾收集。未来版本的MongoDB功能,要求超时处理和垃圾收集能够做到群集可感知。为了实现这一目标,未来可以使用lsids作为基础进行功能升级更造。

在MongoDB3.6版本中,mongod和mongos进程开启后会做两件事情。首先,会运行一个控制器进程来管理所有会话,其次,会维护一个会话列表并连接到控制器中的进程上。每隔5分钟,控制器会同步刷新会话的相关信息,如更新会话最近被使用的时间。这个最后使用时间将成为一个基线时间点,30分钟后会触发一次TTL索引(有TTL索引的字段服务器会进行计算,当前服务器时间-字段时间>=expreAfterSeconds的秒数的时候,就会执行删除该数据)。该触发表明这个会话已经没被任何控制器使用超过30分钟了。该会话所使用的资源可以被清除了。

逻辑会话和事务

通过使用逻辑会话ID标记所有操作和使用的资源,现在可以更轻松地管理MongoDB中的长期活跃和广泛分布的数据库操作了。逻辑会话ID在取消操作和垃圾收集方面具有直接的作用,且逻辑会话是其它MongoDB 4.0+特性的基础。确保一个事务在一个会话中运行,那么无论事务是成功提交还是被中止,使用逻辑会话可以保证存储和清理该事务所占用的资源。

译者:郭远威
资深大数据架构师,MongoDB中文社区联席主席
著有《大数据存储MongoDB实战指南》一书;通信行业业务架构与数据迁移专家,先后在华为,中兴工作十余年。

原文链接:https://www.mongodb.com/blog/post/transactions-background-part-2-logical-sessions-in-mongodb

发表评论