请帮助解决以下问题。
给出了以下实体:
- 应用。应用程序驻留在存储上,它们通过服务节点生成流量。
- 服务。服务分为几个节点。每个节点都可以访问本地或/和共享存储。
- 贮存。这是应用程序所在的位置。它可以是本地的(仅连接到一个服务节点)或由多个节点共享。
规则:
- 每个应用程序都放置在某个特定的存储上。并且无法更改存储。
- 只要新的服务节点可以访问应用程序的存储,就可以将应用程序的服务节点更改为另一个服务节点。
例如,如果 App 驻留在 Node0 的本地存储上,则它只能由 Node0 提供服务。但如果 App 驻留在存储 shared0 上,它可以由 Node0、Node1 或 Node2 提供服务。
考虑到所有应用程序都已放置在它们的数据存储中,问题在于找到在服务节点之间重新平衡应用程序的算法。并尽可能公平地进行这种重新平衡。
如果我们以 shared2 存储为例,解决方案似乎很简单:我们计算 Node3 和 Node4 的应用程序数量,并在它们之间平均分配所有应用程序。但是当涉及到 shared1 时,它变得更加复杂,因为 Node2 也可以访问 shared0 存储。因此,在重新平衡组 [Node2, Node5] 中的应用程序时,我们还必须考虑组 [Node0, Node1, Node2] 中的应用程序。组 [Node2, Node5] 和 [Node0, Node1, Node2] 相交,应立即对所有组执行重新平衡。