跨隔离的网络堆栈的智能线程管理的制作方法

文档序号:19735692发布日期:2020-01-18 04:26阅读:184来源:国知局
跨隔离的网络堆栈的智能线程管理的制作方法



背景技术:

诸如操作系统(os)的操作系统提供了用于资源的隔离的机制。这些机制的示例包括监狱(jail)、区域和容器。这些隔离机制中的每个机制的构件是命名空间。linux操作系统提供了用于安装、过程标识符、网络堆栈、用户等的命名空间。每个命名空间可以被视为层级,该层级具有被彼此隔离的不同分支的节点。这可以防止跨命名空间的可见性。隔离的另一构件(buildingblock)是控制组。控制组利用分层结构来促进资源计量和限制。一些控制组包括处理器控制组、存储器控制组和块输入/输出控制组。命名空间和控制组一起是针对容器的构件。

虚拟局域网(vlan)允许各种远程计算系统通信,就像它们驻留在公共局域网中一样。因此,即使通信是通过原本不安全的网络进行的,网络安全措施也可以确保在不同的远程计算系统之间进行安全的通信。结合vlan,互联网小型计算机系统接口(iscsi)使存储系统上的卷能够以安全的方式访问。iscsi提供了存储系统上数据卷存储位置的抽象。为了创建连接,设备会向iscsi目标发出对特定卷的发现请求。作为对发现请求的响应,iscsi目标确定卷所在的位置,并提供该卷所在位置的互联网协议(ip)地址。这使终端用户能够访问数据卷,而不必在访问数据前知道数据的实际位置。此过程被称为iscsi重定向。

附图说明

通过参照附图可以更好地理解本公开的各方面。

图1描述了支持iscsi重定向的存储系统。

图2描述了支持具有多个vlan的iscsi重定向的存储系统。

图3描述了支持具有多个vlan的iscsi重定向的另一存储系统。

图4描绘了以安全模式支持具有多个vlan的iscsi重定向的方法的流程图。

图5描述了示例应用实例的概念图,该应用实例在网络命名空间内跨多个网络堆栈实例地管理线程。

图6是示例操作的流程图,该示例操作用于向线程分配智能地任务以针对隔离的网络堆栈实例处理接收的数据。

图7是示例操作的流程图,该示例操作用于向线程智能地分配任务以针对来自隔离的网络堆栈实例的传输处理数据。

图8描述了带有用于业务隔离保护的线程管理器的示例计算机系统。

具体实施方式

以下描述包括体现本公开的各方面的示例系统、方法、技术和程序流程。然而,应该理解本公开可以在没有这些具体细节的情况下实践。例如,本公开涉及虚拟局域网(vlan)技术,其用于业务隔离以及为了继续进行业务隔离的共享的节点的跨隔离的网络堆栈实例的线程的智能管理。本公开的各方面还可以使用其他技术来隔离跨租户/客户的业务并将该隔离保持在共享的节点中。其他技术的示例包括虚拟专用网(vpn)和隧道技术。在其他实例中,未详细示出公知的指令实例、协议、结构和技术以免混淆描述。

概述

不同客户或租户的数据业务可以在共享的节点上有效地处理,同时仍然彼此隔离。应用实例可以创建彼此隔离的多个网络堆栈实例,并跨隔离的网络堆栈实例地智能地管理线程,而不是针对应用的多个实例创建容器或者针对多个网络堆栈中的每个网络堆栈生成线程。为了跨网络堆栈实例智能地管理线程,每个线程维护数据,该数据标识该线程当前被指派给的网络命名空间。拥有这些信息,应用可以智能地使用已经驻留在网络堆栈实例的网络命名空间中的线程,该线程将处理数据业务并避免将线程指派给命名空间的系统调用的性能影响。

vlan存储系统

图1描述了支持iscsi重定向的存储系统104。存储系统104包括节点108、110和112。每个节点可以包含有关一个或多个数据卷的信息。例如,节点3112包括与卷3相关联的数据。该数据可以包括有关存储在卷上的数据位于何处的信息。该卷的数据可以跨不同的节点存储。在一种实现中,卷的数据随机地跨存储系统的所有节点存储。多个不同的客户端可以访问存储系统。这些客户端可以彼此独立。因此,其他客户端无法访问与每个客户端相关联的数据。确保客户端数据彼此分离的一种方法是针对每个客户端使用分离的虚拟网络协议(vip)地址。在该实现中,每个vip用于节点集群。由于使用了不同的vip,虽然不同的客户端集群中使用的节点可以重叠,但是数据保持分离。例如,访问使用vip106的集群的客户端将无法使用其他vip(图1中未显示)进行验证。因此,客户端将只能访问与客户端相关联的集群上的卷。

可以使用iscsi访问每个卷。终端用户可以使用计算设备102来访问与终端用户相关联的卷。例如,客户端102可以访问卷3。为此,客户端现在必须知道与存储系统104相关联的ip地址106。虚拟ip地址(vip)用于此目的。这个ip地址被认为是虚拟作为接收数据的物理设备,该数据注定有vip变化。诸如客户端102的iscsi启动器最初连接到vip地址106作为端点。为了支持iscsi功能,vip地址106负责处理来自多个客户端的所有初始iscsi请求。实际节点或其他计算系统可以改变,该计算系统是该地址的实际物理目的地。例如,可以改变托管计算设备以平衡来自处理iscsi功能的负载。重要的是,任何时候只有一个节点将托管vip。处理在vip上接收的数据的任何节点都会在vip上众所周知的端口(例如3260)上侦听传入的iscsi请求。

允许不同的节点充当vip的端点可以确保如果当前托管vip的节点崩溃,则另一节点可以成为vip。从客户的角度来看,vip始终可用,并且客户不必知道哪个节点正在充当vip。因此,vip是客户端102用来连接到iscsi存储器的地址。

vip的一项功能是将客户端定向到存储被请求的卷的节点。这允许卷驻留在与当前充当vip的节点所不同的节点上。例如,图1示出了客户端102请求访问卷3。最初,客户端102向vip发送请求(150)。在图1中,节点108充当vip,因此该请求由节点108处理。节点1决定哪个节点处理对卷3的i/o请求。例如,数据库可以存储卷名称到节点名称或ip地址的映射。在该示例中,节点112处理对卷3的i/o请求。因此,节点108向客户端102发送重定向响应,该重定向响应包括节点112的ip地址(例如192.168.133.93)以及接受对卷3的iscsi命令的端口(152)。一旦接收到命令,然后客户端102直接对节点112执行新的登录(154)。

此重定向涉及两种不同类型的过程。第一种是vip过程。第二种类型的过程是侦听在特定网络上发生的iscsi命令的过程。在图1中,每个节点都有一个充当iscsi侦听过程的过程。每个过程侦听iscsi命令以访问该节点托管的卷。如果一个特定的卷没有在当前节点上托管,该节点可以将iscsi启动器重定向到正确的节点。注意这不同于将iscsi启动器重定向到正确的节点的vip过程。相反,每个iscsi侦听过程也可以重定向iscsi启动器,以说明从一个节点移动到另一节点的卷。因此,这两种类型的过程之间的主要不同在于每个iscsi侦听过程都不旨在于成为所有客户端最初通信的重定向器过程。当尝试访问特定的卷时,vip过程是所有客户端最初连接的过程。

iscsi重定向可以与vlan结合使用。图2描述了支持具有多个vlan的iscsi重定向的存储系统104。具体地,存储系统104包括三个不同的iscsi终端,vlan1、集群和vlan2。客户端102可以使用vip106来访问客户端集群上的卷。这以如图1所示的方式完成。与图1相比,图2包括两个vlan。要求每个vlan具有一个专用vlan网络接口,该接口在每个节点上被配置有特定于该vlan的专用vlanip地址。每个vlan的不同的网络接口确保来自不同网络的数据包彼此隔离。vlan的所有传入的和传出的业务必须通过与该vlan相关联的专用接口和ip地址传入和传出。此外,vlan业务无法看到非vlan业务或不同vlan上的业务。为了确保vlan数据的这种分离,图2添加了两个额外的vip,一个用于vlan1206,一个用于vlan2208。因此,vlan1客户端202可以使用vip206访问其集群。类似地,vlan2客户端204可以使用vip208访问其集群。

除了添加vip206和208外,每个节点还都包括对每个vlan的iscsi侦听过程。vip过程也可用于每个vlan。在图2中,过程p1、p3和p4是对节点集群的iscsi侦听过程。过程p5、p8和p11是对vlan1的iscsi侦听过程,而p7、p10和p12是对vlan2的iscsi侦听过程。节点210上的p2、节点210上的p6和节点212上的p9分别是集群、vlan1和vlan2的vip过程。

图2中所示的方法使用分离的过程将来自不同vlan的业务隔离。因此,添加新的vlan会增加在每个节点上操作的过程数目。对于少量的vlan,这并不造成困难。但是,大量的受支持的vlan(例如100个或1000个)开始显着地耗尽系统资源。大量的过程可能使得争用问题以及大量的内存开销。此外,每个过程都需要额外的线程和套接字。此外,添加和删除vlan也是一个问题。具有大量节点的存储系统要求将过程添加到每个节点。这使得动态地添加vlan不可行。例如,在尝试在每个节点上自动创建过程时竞争的情况将会很普遍。此外,如何指派ip地址也会成为问题。

图3描述了根据一个实施例的支持具有多个vlan的iscsi重定向的存储系统。在图3中,每个节点上都存在一个通配符过程。该过程针对任何vlan或集群充当vip,并充当对每个集群和vlan的iscsi侦听过程。为了实现这一点,可以使用绑定到机器的每个接口的ip地址。例如,可以使用addr_anyip地址,例如0.0.0.0或::。以这种方式,一个过程在特定端口(例如3260)上跨机器的所有网络接口侦听。在不同的实现中,iscsi业务使用不同的ip地址来区分vlan,但使用相同的端口。如果使用不同的端口,每个不同的端口都需要一个过程。ipaddr_anyip地址充当过程可以侦听的通配符地址,以使过程接收发往机器上特定端口上任何接口的所有数据包。但是,物理接口和虚拟接口仍然是分离的。进入节点的传入业务仍然停留在它自己的接口上。只有在内核的最后层,所有传入的业务才被分解(collapsedown)为一个侦听绑定到ipaddr_any的端口的过程。因此,实现了将数据跨不同vlan隔离的vlan要求。

因此,使用ipaddr_any地址使单个过程可能在每个节点上运行。此过程处理所有集群和vlan业务。此外,iscsi侦听过程也可以与vip过程结合使用。因此,无论在存储系统中支持多少个vlan,每个节点只有一个过程。此过程还处理所有非vlan数据包。注意,每个vlan和集群都有它自己唯一的ip地址,外部客户端可使用该ip地址访问vlan或集群上的卷。

如上面提到的,图3中所示的方法保持vlan业务被妥善地隔离。因此,任何vlan的安全性得以维持。没有客户iscsi数据通过未过滤的泛用户名(catch-all)通配符接口和端口传递。由于通配符接口可以接收与不同vlan有关的数据,因此通配符过程必须确定如何妥善地处理iscsi请求和数据。数据库可用于存储用于妥善地路由数据包的数据。数据库可以包括有关存储系统中的每个卷和每个节点的数据。使用此信息,通配符过程的重定向器部分可以查找哪个节点正在托管该卷。然后可以确定该节点的所有ip地址。

重复图1的示例,客户端可以登录到卷3。vlan1客户端发送发现请求以访问卷3。客户端将数据包发送到vlan1的ip地址10.10.5.200。如果节点1是vlan1的vip,发现请求由在节点1上运行的一个通配符过程处理。卷3位于节点3上。但是,问题在于应该返回哪个ip地址,因为节点3可以通过三个ip地址寻址:对集群是192.168.133.93、对vlan1是10.10.5.3以及对vlan2是10.10.6.3。先前,对每个接口存在有一个过程。因此,返回地址是已知的,因为对每个vlan(例如,对三个ip地址中的每个ip地址)存在有一个过程。现在,由于正在运行单个过程,因此必须确定要返回的正确ip地址。

为了确定要返回的正确ip地址,可以确定数据包到达的本地终端。例如,可以进行getsockname()方法调用。在上面的示例中,业务在vlan1的vip上接收,因此将返回10.10.5.200。使用此信息,可以从数据库中确定vlan的名称。此外,可以确定卷3位于节点3上。然后,使用vlan的名称,可以确定与vlan1相关联的节点3上的ip地址,即10.10.5.3。这是返回到客户端的地址。然后,客户端可以直接连接到10.10.5.3来访问卷3。

当客户端访问卷3中的数据时,通配符过程处理io请求。由于这些请求不是iscsi发现请求,因此通配符过程的iscsi侦听器对等物处理该请求。这部分通配符过程确定客户端用于连接到节点3的ip地址。使用此信息,通配符过程可以证实客户端可以连接到vlan。

除了支持vlan所需的过程的减少之外,不同的实现还使vlan能够以原子方式配置。为了将vlan添加到集群,从客户端设备接收一个或多个ip地址块。例如,vlan设置过程可以接收ip地址块。此外,可以接收新vlan的名称和vlan的被请求的vip。ip地址用于针对每个节点指派一个ip地址。与新vlan相关联的每个ip地址目前无法在集群中使用。为了确保可以创建vlan,可以过滤ip地址块中所有当前使用的ip地址或将其标记为正在使用。然后可以确定未使用的ip地址的数目。如果未使用的ip地址的数目少于集群中的节点的数目,则无法设置vlan。在这种场景下,可以将指示设置vlan需要不同的ip地址块的消息返回给客户端设备。如果ip地址数目大于或等于集群中的节点数目,则vlan的设置可以继续。

支持原子功能的数据库用于以原子方式设置vlan。指派给每个节点的ip地址和该节点的标识符存储在数据库中。这就可以针对集群中的每个节点确定此vlan的ip地址。此原子特征确保如果在添加vlan的同时将节点添加到集群,vlan将使用新节点成功地被设置。如果由于在成功添加vlan之前添加了新节点,最初未成功安装vlan,则可重新尝试添加新的vlan。在这种场景下,只要没有新节点被添加、现有节点被删除或使用一个重复的ip地址,该添加操作就会成功。一旦将vlan添加到数据库,就可以针对每个节点创建网络接口并将网络接口绑定到合适的端口。此外,vlan的vip被绑定到初始节点,并在新vlan上侦听iscsi发现请求。

此配置的另一好处是许多不同的客户端可以使用该存储系统。单个客户端本身可以有多个客户。但是,客户端可能需要确保每个客户的数据彼此分离且安全。这可以通过针对每个客户提供其自己的vlan来实现。如上面所述,一个vlan中的数据与每个其他vlan中的数据隔离。

安全模式vlan

在一个vlan系统中(例如,在上面针对图3实施并在上面讨论的情况下),因为在每个节点或卷使用了通配符地址,所以侦听节点可能会接收对数据(或卷)的任何发现请求,该发现请求来自vlan1客户端202、客户端102和/或vlan2客户端204中的任何一个。如上面所述,接收发现请求的节点还使用getsockname()方法调用来确定用于返回请求结果的正确ip地址。然后,可以将客户端请求的数据/卷的地址返回给客户端,以将客户端重定向到合适的节点,并发起iscsi请求以访问数据。iscsi过程可以防止客户端访问他们无法访问的数据/卷。但是,由于节点可以从多个客户端接收并返回发现请求,因此发现请求响应可能会引用数据/卷,该数据/卷未被批准可以由特定客户端访问。换言之,由于图3中的节点使用监听来自不同客户端的不同请求的单个过程来操作,所以那些节点不限于确定数据/卷的位置以响应对单个客户端的发现请求。即使在答复请求并重定向客户端之后,客户端由于iscsi程序将无法访问不属于它们的数据,但客户端可能可以看到存在它们无权访问的数据/卷以及这类数据的位置。换言之。

图4描述了根据一个说明性实施例的以安全模式支持具有多个vlan的iscsi重定向的方法400的流程图。在替代的实施例中可以执行更少的、额外的和/或不同的步骤。同样,流程图的使用无意于被所执行的步骤的顺序所限制。

在操作402中,在客户端发起对数据/卷的发现请求。作为一个示例,发现请求可以发起自如图3所示和参照图3描述的vlan1客户端202。类似于上面图1、2和3所示和参照图1、2和3描述的顺序,发现请求可以是针对位于第三节点(例如图3的节点314)上的数据/卷。但是,不同的节点(例如图3的节点310)可以是vlan1客户端202的vip。因此,来自vlan1客户端202的发现请求将在操作404中由节点310上的通配符过程来处理。

在操作404中,并且如上面参照图3所述,vip可以确定正确的ip地址以将请求的结果返回到该ip地址。在该示例中,节点310将确定发现请求发起自vlan1客户端202,并且在确定存储了作为请求主题的卷/数据的位置之后,将节点314上的数据/卷的位置发送回vlanl客户端202。此确定发生在操作406中。

但是,在将被请求的数据/卷的位置返回到客户端(并且随后将客户端重定向到第三节点以启动iscsi过程以从第三节点检索数据/卷)之前,在操作408中,第一节点310对照客户端特定卷列表410检查发现请求。客户端特定卷列表410是vlan1客户端202可以访问的每个卷的索引或数据库。一些卷可以是vlan1客户端202专属的,而其他卷可以是vlan1客户端202和其他客户端可访问的。其他卷也可以是其他客户端可访问而vlan1客户端202无法访问的。在这种场景下,这样的卷将不会出现在vlan1客户端202的客户端特定卷列表410上。在替代的实施例中,客户端特定卷列表可以包括发起发现请求时要检查的多个客户端特定卷列表。例如,如果客户端是不同的组/安全域的一部分,该组/安全域授予对不同数据/卷的访问权限,则该客户端可能实质上具有多个特定卷列表。实际上,当授权发现请求时,系统可以组合这些卷列表中的每个卷列表以运行单个检查,或者类似地可以依次检查每个卷列表以确定是否应授权该客户端请求特定数据/卷的位置信息(卷id)。在一些实施例中,系统可以不检查整个或多个客户端特定卷列表。例如,如果系统在客户端特定卷列表上找到匹配项,则不必检查其余的卷列表。这样的方法可以保存系统中的资源。

图4还示出了网络卷列表412。尽管客户端特定卷列表410示出了卷id,该卷id被指派给vlanl客户端202或可以被vlan1客户端202访问,但是网络卷列表示出了存在于存储系统(例如,图1至图3的存储系统104)中的所有卷id。

因此,在网络卷列表中示出了每个卷id,该卷id在存储系统上存储了东西,而不管该卷存储在哪个节点上或存在有多少个节点。卷id是指特定的物理内存位置。因此,存储在特定位置中的任何内容都可以通过卷id来指示。客户端专用卷列表410上的卷id全都出现在网络卷列表412上(例如1、2、3、4、11)。网络卷列表412还包括卷id,该卷id(例如6、7、8、9、10)不在客户端专用卷列表410上,并且未指派给vlan1客户端202或无法被vlan1客户端202访问。但是,由于它们在网络卷列表412上,因此至少一个其他客户端和/或vlan可以访问它们。类似地,出现在网络卷列表412和客户端特定卷列表410上的卷id可以在其他客户端/vlan的卷列表上,并且因此那些其他客户端/vlan可以访问该卷id。这可能在客户端存储相同卷的地方发生,因此,存储系统仅存储数据的一个实例更有效。可以在存储系统中存储数据/卷的其他卷id可能为空,并且目前不包含数据(例如,5)。这样的卷id可能之前已在其中存储数据,但是在确定没有客户端正在连接到特定卷id的数据之后,可能已被垃圾回收器过程删除。例如,如果发现请求包括对卷id5的数据的请求,系统可能返回错误消息、在该卷id动态地存储/创建新数据或运行过程以确定所请求的数据是否实际存储在其他地方(位于不同的卷id)。

如上面所述,在操作408,节点确定发现请求中所请求的数据/卷是否在客户端特定卷列表410上,其中在操作406确定客户端。在操作414确定数据/卷在客户端特定卷列表410上是否发生在客户端被重定向到数据/卷的实际位置之前。操作408在操作414之前发生以确保信息没有被发送到该客户端。该信息是关于卷或关于到客户端未被授权的卷位置的重定向。

此外,在操作414,客户端可以如这里所公开地通过来自节点的信息来重定向,以检索和/或访问发现请求中寻求的数据/卷。例如,操作414可以发起iscsi过程,该iscsi过程用于访问第三节点314以及从第三节点314检索数据。这样的过程可以类似于图1的过程,其中如上面所述,节点310(在操作408进行的验证之后)向vlan1客户端202发送重定向响应,该重定向响应包括接受要访问的卷的iscsi命令的节点314端口的ip地址。该重定向响应,例如,由图1的152演示。一旦收到,vlan1客户端202可以直接执行到节点314的新登录。例如,该直接登录由图1的154演示。

这里公开的系统和方法针对存储系统提供了灵活性和安全性。例如,可以将多个客户端的vlan分组在一起,以使卷能够对不同的vlan可见。例如,客户端的组/安全域可以访问所有相同的卷,该客户端是单个实体的一部分。在另一示例中,客户端的组/安全域的子集可以访问所有相同的卷。因此,在访问如这里所公开的存储系统时,多个分组的客户端可以使用公用vlan,这带来了用于一组客户端的存储系统的安全使用,而不需要针对每个客户端设备要求多个分离的vlan。

此外,可以利用客户端的分组来维护和使用较少的客户端特定卷列表。无论是否将客户端分组在一起以使用公用vlan,这都可能发生。在此示例中,多个分组的客户端将具有发现请求,该发现请求发起自那些对照相同客户端特定卷列表被检查的客户端。这样,该列表可以被更准确地表现为客户端分组特定卷列表或安全域特定卷列表。对多个客户端使用一个卷列表使存储系统能够针对给定数目的客户端存储和维护更少的卷列表(与针对每个客户端有一个卷列表相比,卷列表更少)。在这些分组实施例中,应该在发起发现请求之前将客户端分组(通过公用vlan和/或通过将多个vlan与公用卷列表相关联)。这确保了一旦发起发现请求,系统就会对照合适的卷列表检查发现列表,该卷列表指示是否应向客户端发送与所请求的数据/卷及它们的相应位置有关的信息。

这确保了一旦发出发现请求,系统就会根据适当的卷列表检查发现列表,该卷列表指示是否应向客户端发送与所请求的数据/卷及其各自位置有关的信息。

可以防止节点以向客户端提供有关那些客户端无权访问的数据/卷的信息的方式答复来自客户端的请求。即使不同的客户端可以访问某些公用卷,仍然可以使用此过程,这对于共享某些公用数据的客户端组或安全域特别有用。

跨隔离的网络堆栈的受限线程的智能管理

如前所述,可以对应用编程,以管理跨隔离的网络命名空间的线程,以保持由共享的节点处理的不同vlan的业务隔离。为了管理线程,应用实例维护vlan与网络命名空间之间的相关联,并读取上下文信息,该上下文信息在线程级存储中由线程维护(例如,线程的堆栈/内存空间中的变量)。本说明书将应用实例创建网络命名空间并在网络命名空间中管理线程的功能称为“容器化操作”,因为复制或克隆仅限于网络堆栈,而不是在应用的多个实例上消耗资源。

术语“节点”用于指代过程的集合,这些过程处理客户端请求,并且可以包括也可以不包括主机硬件(例如,计算机、刀片、机器、设备等)。例如,存储节点是协调和/或合作以服务来自客户端的存储请求的过程的集合。节点的过程的集合包括应用实例的一个或多个过程。

术语“网络堆栈实例”用于指代网络相关资源的集合,这些网络相关资源指派给网络命名空间或在网络命名空间内。这些资源的示例包括接口、地址空间、路由表等。当创建网络命名空间时,操作系统可以实例化该网络命名空间的默认网络堆栈(例如,默认虚拟接口、ip地址空间等)。可以将其他资源指派给网络命名空间。

图5是示例应用实例的概念图,该应用实例在网络命名空间中跨多个网络堆栈实例管理线程。主机501托管操作系统503和应用实例511。在图5中,应用实例511已经创建了几个网络命名空间515、517、519,每个网络命名空间都包括一个网络堆栈的实例。此外,应用实例511已经将套接字和vlan指派给网络命名空间。

为了指派套接字,应用实例511调用系统调用以基于每个网络命名空间的地址空间创建具有套接字地址的套接字。例如,应用实例511利用对操作系统503的创建套接字的请求和网络地址的指示来创建套接字541,该网络地址在网络命名空间515中所包含的网络堆栈的地址空间内。应用实例511还调用命令将套接字指派给网络命名空间。应用实例511还调用命令以将套接字指派给网络命名空间。

在创建套接字之后的某个时刻,应用实例511调用事件监视服务514(例如,调用epoll()系统命令)。应用实例511可以将套接字标识符的列表传递给事件监视服务514。参照epoll调用,应用实例511可以执行一个或多个命令以注册用于监视的套接字541、543和545的一组文件描述符。实现可以使用支持操作系统的其他服务或系统调用,该支持操作系统具有对每个隔离的网络堆栈实例中的套接字或缓冲的可见性。

为了指派vlan,应用实例通过vlan标签将每个vlan连接到每个网络命名空间中的接口if0。图5说明了网络堆栈实例的一些示例元素以及vlan到网络命名空间的指派。网络命名空间515包括路由表521、套接字541以及连接到接口if0的vlan100的表示。网络命名空间517包含路由表523、套接字543以及连接到接口if0的vlan101的表示。网络命名空间519包含路由表525、套接字545以及连接到接口if0的vlann的表示。接口if0对应于主机501的物理接口。将不同的vlan连接到接口if0将接口if0逻辑地分割成不同的接口,因为每个vlan表示逻辑地分离的网络或子网络。因此,图5描述了如在操作系统503中所表示的接口if0(例如,操作系统的网络命名空间)以及接口if0与不同网络命名空间515、517、519中的不同vlan标签的组合。

应用实例511执行网络命名空间的创建和对网络命名空间的资源指派来响应命令,该命令提交给应用实例511和/或基于配置文件。例如,配置文件可以指定要创建的若干网络命名空间、网络命名空间的名称以及对网络命名空间的资源指派。在启动时,应用实例511可以读取配置以创建和配置数百个命名空间,从而使得数百个彼此隔离的网络堆栈的实例化。这促进具有足够网络堆栈的应用的有效启动,以安全地大规模处理隔离的数据业务(例如,每秒数百万个输入/输出操作(iops))。

尽管许多网络堆栈可以隔离大规模业务,但是在不耗尽主机501的资源的情况下,线程不能专用于每个网络堆栈。为了在服务大规模业务的同时平衡资源消耗,操作系统503将线程池513指派给应用实例511。线程池513可以被调整以适应来自业务的负载。不管如何调整,线程池513的线程数目小于网络命名空间的数目,并且将进行上下文切换。尽管针对数百个网络命名空间维护数百个线程可能会耗尽资源,但是在处理大规模业务时,对操作系统进行系统调用以针对每个网络事务在网络命名空间之间切换线程也会变得代价高。因此,应用实例511智能地管理从线程池513到网络命名空间515、517、519的线程切换,以避免对操作系统503的切换调用。由应用实例511管理的每个线程在线程本地存储器中维护网络命名空间的指示,线程驻留在该网络命名空间中(即,线程现在正在该网络命名空间中执行(如果处于活动状态)或曾经正在该网络命名空间中执行(如果处于等待状态))。此信息使应用实例511能够确定何时可以在不使用将线程分配给网络命名空间的调用的情况下向线程分配网络处理工作的任务。

图5描绘了三个一般阶段,其具有字母顺序a,b和c。这些阶段中的每个阶段表示一组操作而不是特定的操作。

阶段a表示在主机501的接口if0处的数据业务505的接收。业务505包括来自不同vlan的业务。阶段b表示根据业务单元内的vlan标签和套接字地址将业务写入合适的套接字。对于vlan100的业务,接口if0的设备驱动会将数据写入包括在网络命名空间513中的套接字541。设备驱动将vlan101的数据写入包括在网络命名空间517中的套接字543,并将vlann的数据写入包括在网络命名空间519中的套接字545。阶段c表示执行操作以将线程从线程池513智能地指派给网络命名空间515、517、519以处理不同vlan的业务505的应用实例。在该说明中,线程529最后指派给网络命名空间519。没有线程指派给网络命名空间515、517。网络命名空间517、519之间的省略号表明出于实用性,仅描述了许多网络命名空间中的少数几个。应用实例511读取每个线程的线程本地存储器中的变量,该变量指示网络命名空间或空值。应用实例511确定线程529已经指派给网络命名空间519,并向线程529分配处理套接字545中的数据的任务。例如,应用实例511调用一个函数,以使用参数来唤醒线程529,该参数包括对网络通信协议处理代码和套接字545的套接字标识符的引用。应用实例511确定没有线程指派给网络命名空间515。应用实例511进行系统调用,以从线程池513指派空闲线程527给网络命名空间515,唤醒线程527,并给该线程指派处理套接字541中的数据的任务。应用实例511可以对网络命名空间517的套接字543中的数据执行相同的操作(即,从线程池513指派线程并给其指派任务),或者如果在线程池513中没有剩余的线程,从不同的网络命名空间切换空闲线程。

尽管图5的说明涉及网络命名空间以隔离的网络堆栈实例,但是实施例可以使用其他隔离机制(例如,linux容器或lxc)。不管特定的实现方式如何,网络堆栈实例都是相互隔离的,并由应用实例管理。此外,图5涉及主机或者主机设备,该主机设备托管os、应用实例和网络堆栈实例。但是,主机也可以是虚拟主机。图6和图7是示例操作的流程图,该示例操作用于以比图5中使用的术语更一般的术语处理跨隔离的网络堆栈实例的业务。

图6是示例操作的流程图,该示例操作用于向线程智能地分配任务以针对隔离的网络堆栈实例处理接收的数据。图6涉及执行操作的应用实例。

在框601,应用实例在套接字处检测数据的接收以进行网络处理。应用实例基于来自后台过程或服务的通知来检测数据的接收,该后台过程或服务具有网络堆栈实例的全局视图。该应用实例先前针对监视已经注册套接字以及其他套接字。例如,监视可以使用回调或遍历套接字。

在框603,应用实例标识对应于套接字的网络堆栈实例。应用实例收到的通知标识套接字。应用实例使用套接字标识符读取套接字结构,以确定该套接字结构被指派给的网络堆栈实例,该网络堆栈实例是在创建套接字时设置的。套接字结构可以利用隔离的网络堆栈实例的逻辑封装的标识符(例如,命名空间标识符、容器标识符等)来标识网络堆栈实例。

在框605,应用实例确定在所标识的网络堆栈实例中是否已经存在线程。与套接字一样,应用实例可以访问线程的线程本地存储,该线程是指派给应用实例的。应用实例可以读取每个线程的线程本地存储中的网络堆栈指派变量,直到遇到套接字结构中标识的网络堆栈实例的匹配项或完成线程网络堆栈指派变量的遍历。作为另一示例实现,应用实例可以跟踪其自己的线程指派,因为该应用实例调用系统调用以指派线程。应用实例可以维护线程标识符到网络堆栈实例标识符的指派列表,并检查该列表以确定线程是否已经指派给套接字结构中标识的网络堆栈实例。如果没有线程已经指派给所标识的网络堆栈实例,则该流程流向框607,否则,流程流向框609。

在框607,应用实例将非活动线程指派给所标识的网络堆栈实例。该应用实例进行系统调用(即,调用os功能或os工具的功能),以将非活动线程指派给所标识的网络堆栈实例。该过程持续到框609。

在框609,应用实例向线程分配处理接收的数据的任务。如果线程是一般线程,应用实例可以调用一个函数,该函数将传递指向所标识的套接字的输入流的指针和对网络协议处理程序代码的引用。线程的代码可能已经包含网络协议处理代码,在这种情况下,应用实例将传递输入流指针。在某些情况下,应用实例可以调用单独的函数调用以唤醒非活动线程。

图7是示例操作的流程图,该示例操作用于向线程智能地分配任务以针对来自隔离的网络堆栈实例的传输处理数据。图7还涉及执行这些操作的应用实例。

在框701,应用实例确定要发送的数据并针对该数据确定套接字地址。该应用实例可以正在处理读取请求,该读取请求针对特定的vlan指定特定的卷。在从对应于卷的存储设备获取数据并执行与网络通信协议无关的任何其他处理(例如,加密)之后,应用实例从请求中读取持续存在的套接字标识符。例如,与存储命令一起传输的套接字标识符,该存储命令起因于来自网络堆栈实例的输出。套接字标识符是一个内部标识符,其唯一地标识主机系统的套接字,并且不同于套接字地址。

在框703,应用实例将获得的数据写入对应于套接字标识符的套接字。因此,应用实例将接收通知,该通知来自将在套接字上进行的工作的监视过程/服务,该套接字具有套接字结构中的网络堆栈实例的标识。

在框705,应用实例确定在所标识的网络堆栈实例中是否已经存在线程。应用实例可以访问线程的线程本地存储,该线程是指派给应用实例的。应用实例可以读取每个线程的线程本地存储中的网络堆栈指派变量,直到遇到套接字结构中标识的网络堆栈实例的匹配项或完成线程网络堆栈指派变量的遍历。作为另一示例实现,应用实例可以跟踪其自己的线程指派,因为该应用实例调用系统调用以指派线程。应用实例可以维护线程标识符到网络堆栈实例标识符的指派列表,并检查该列表以确定线程是否已经指派给套接字结构中标识的网络堆栈实例。如果没有线程已经指派给所标识的网络堆栈实例,则该流程流向框707,否则,流程流向框709。

在框707,应用实例将非活动线程指派给所标识的网络堆栈实例。该应用实例进行系统调用(即,调用os功能或os工具的功能),以将非活动线程指派给所标识的网络堆栈实例。该过程持续到框709。

在框709,应用实例向线程分配用于传输处理数据的任务。在某些情况下,应用实例可以调用单独的函数调用以唤醒非活动线程。

仅作为一个示例,容器化操作对于不对系统104或新旧客户端进行重大改变就将额外的客户端集成到图3的存储系统104中可能是有价值的。例如,新客户端当前可能使用本地存储的存储系统。新客户端可能希望集成到基于云和互联网的存储系统。如果系统104已经基于云,则旧本地系统的一些路由过程、ip地址和通信可以与云中已经在使用的旧客户端系统相似,这是可能的。为了不复制管理存储的os或应用就将新客户端集成到系统104中,可以使用这里公开的容器化操作方法来集成新客户端。这样,新客户端和旧客户端两者都可以使用相同的地址和端口(例如,3260)接收并发送到存储系统104。但是,利用这里公开的系统和方法,可以使用容器化操作来隔离业务,该业务与使用不同vlan的客户端相关联。换句话说,即使多个客户端以相同的方式利用相同的存储系统104,与一个vlan相关联的业务也不能被与其他vlan相关联的客户端看到。这还使存储系统104能够更有效地为大量客户端服务,因为存储系统不需要针对其实例化的每个网络堆栈重写其自身的实例。这样的方法可能使用大的内存占用,并且需要大得多的分布式系统来大规模地操作(即,具有许多客户端)。客户端的业务被隔离到不同的容器(以及随后的不同的独立套接字或网络堆栈)中。通过以这种方式布置系统,许多不同的客户端可以使用相同的存储系统502,该存储系统502可以包括公共节点/卷、操作系统(os)和应用(例如,以响应并满足iscsi请求)。通过利用系统的共同方面,可以减少或精简所使用的总系统资源。但是,客户端不会牺牲安全性或私密性,因为存储系统和客户端之间的任何通信都是与其他客户端的业务隔离的。

这里公开的系统和方法的用户可以与一个或多个客户端相关联。这些客户端可能与一个或多个vlan相关联。通过基于vlan的容器化操作,用户可以通过针对它们的客户端设置多个vlan来隔离它们的客户端的业务。例如,用户组织内的不同类型的帐户可以具有对不同信息的不同级别的访问权限,因此可能希望使用不同的vlan分离那些单独帐户的客户端业务,并利用容器化操作来确保那些帐户的业务是隔离的。另外,这里公开的系统和方法的其他用户可以与不同的额外的vlan相关联。因此,不同的用户业务也将使用这里公开的系统和方法隔离。在一些实施例中,系统可以将一个以上的vlan与特定的空间或容器相关联。通过这种方式,当操作与与该容器相关联的vlan中的任何一个相关联时,通信监视模块504可以确定操作是与容器相关联的。

图3示出了所有节点(例如,310、312、314)通过针对iscsi请求指定的端口(例如,3260)侦听来自所有三个客户端(例如,202、102、204)的所有请求。如上面所公开的,此功能有助于使每个节点上正在运行的过程的数目减到最小。此功能还使整个系统能够更有效地运行,而不需要,如参照图3所述的,针对每个节点上的每个位置运行单独的侦听过程。因此,上面参照图5所描述的方法和系统使不同的客户端能够与存储系统的相同端口(例如,3260)通信,而该业务彼此之间不可见。换句话说,这里公开的系统和方法使系统能够将业务隔离到与不同vlan相关的不同容器或命名空间中。此业务可以被适当分离,而不需要将客户端指向不同的端口也不需要创建管理存储系统的软件应用的单独的实例。换句话说,容器化可以复制和容器化的应用的网络组件操作,但是正在运行过程、提交iscsi请求等的整个应用不会被重复或容器化。通过这种方式,每个客户端和/或vlan可以继续指向相同端口(例如,3260),但是根据每个客户端的vlan,通过该端口的业务仍被隔离到不同的容器中。如上面所述,在将客户端的存储移动到云的情况下,这可能是有价值的。如果不同vlan的存储先前是物理地分离的,则业务也是分离的(即使具有不同vlan的不同客户端使用的端口具有相似的如3260的名称)。但是,除非将云网络和/或客户端重新配置,否则将所有数据移动到云中可能使得具有不同vlan的不同客户端将请求/业务定向到相同的目标端口。通过根据vlan容器化网络组件(端口),存储系统中的客户端和数据管理端不必改变。相反,这里公开的容器化网络操作可以实现,使对客户端和存储系统的配置能够保持相同,但仍然根据不同的vlan隔离业务。另一优点是诸如iscsi的某些协议指定要使用某些端口(例如,3260端口)。在不同vlan上的客户端可以继续指向特定端口,而不需要将它们的业务暴露给彼此。这提供了继续使用协议规范的机会,并且避免了重新定义协议规范以分离客户端之间的业务。

可以使用任何合适的介质来传输包含在机器可读介质上的程序代码,包括但不限于无线、有线、光缆、rf等,或前述的任意适当的组合。程序代码/指令还可以存储在机器可读介质中,该机器可读介质可以指导机器以特定方式运行,以使存储在机器可读介质中的指令产生包括指令的制品,该指令实现在流程图和/或框图中一个或多个框中的指定的功能/动作。

图8描述了一个示例计算机系统,该计算机系统具有用于业务隔离保存的线程管理器。计算机系统或主机包括处理器801。计算机系统包括存储器807。存储器807可以是系统或上面已经描述的机器可读介质的可能实现中的任何一个或多个。计算机系统还包括网络接口805。计算机系统还包括线程管理器811。线程管理器811被合并到应用中或由创建和管理多个隔离的网络堆栈的应用使用。应用使用多个隔离的网络堆栈来保持在计算机系统处接收的隔离业务的隔离——每个网络堆栈可以对应于不同的逻辑网络或子网或其分组。线程管理器811考虑到现有的线程指派将线程指派给隔离的网络堆栈,以避免调用底层操作系统来将线程切换/指派给网络堆栈的成本。前述功能中的任何一个都可以部分地(或全部地)在硬件中和/或在处理器801上实现。例如,功能可以用专用集成电路实现在处理器801中、外围设备或卡上的协处理器等中。此外,实现可以包括更少的或额外的组件,这些组件未在图8中示出(例如,视频卡、音频卡、附加网络接口、外围设备等)。处理器801和网络接口805被耦合到总线803。尽管被说明为被耦合到总线803,但是存储器807可以被耦合到处理器单元801。该系统还包括一组存储设备815,该存储设备815可以包括固态存储设备、磁盘存储设备、不同类型的存储设备的混合等。存储设备815可以经由不是网络接口的接口连接到系统,并且可以经由网络接口805连接。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1