用于识别存储空间的分配算法

时间:2013-05-05 07:04:01

标签: sql-server algorithm sql-server-2008 design-patterns allocation

enter image description here

参考图片

我的情景

I1和I2是我的SQL服务器实例,可能位于同一服务器或不同服务器中。 小盒子里面代表sql实例中的数据库。

每个方框附近的数字代表一个人可以存储的数据量。即。具有30的数据库能够存储30个用户的数据。将有n个服务器,实例和数据库,这可以扩展。

I1设计的容量为60(10+20+30)

我们有另一个主数据库,其中包含服务器,实例和数据库的详细信息。使用它我们可以防止使用带有位字段的数据库。因此,如果我停止数据库能够在20个用户中存储I1,则I1的总存储量将为40

我的要求

我们需要一种基于可用空间识别Server实例的算法。这样基础架构团队就可以对流量进行负载均衡。

如果I1的限制为30,则I220I310 用户将按3:2:1的比例分配。如果创建了30个用户,则I1包含15,I2包含10,I3包含5。

我怎么能做到这一点?任何算法。

我需要在SQL Server 2008中实现这一点。

我很抱歉这篇长篇文章描述了我的问题:(。希望有人帮助我。提前致谢。

2 个答案:

答案 0 :(得分:1)

执行此操作的简单算法是使用随机数生成器和if-else块

float db1upper = 10.0 / (10 + 20 + 30)
float db2upper = db1upper + 10.0 / (10 + 20 + 30)

float rand // [0, 1)
if(rand < db1upper)
    Use db1
else if(rand < db2upper)
    Use db2
else
    Use db3

您可以更新每个X分配{/ 1}}和/或每X分钟的值,以反映被释放的用户或反映随机数生成器中的任何偏差

答案 1 :(得分:0)

所有

我通过使用百分比策略解决了这个问题。

这太简单了。

第一次

Instance I1 (10+20+30)  -  60 (60 free spaces - 100% free)
Instance I2 (10+20+30)  -  60 (60 free spaces - 100% free)

新用户,它会选择第一个。

Instance I1 (10+20+30)  -  59(1 space is allocated) So percentage will be around 96%*
Instance I2 (10+20+30)  -  60(0 space is allocated) So percentage will be 100%

其他用户

Selects I2 because of 100% free.

停止I2数据库,可以存储30个用户 因此,I2的总空间将为20 + 10(30),并且可用空间百分比也将减少。 所以另一个用户来,它将选择可用空间实例。

例如:我有两个实例I1可以容纳1000个用户而I2可以容纳2个用户。

算法将首先分配1000I1 999空间可用空间),下一个用户将被分配到I2.所以I2的免费百分比将是50%。因此,当I1到达50%时会发生下一次分配(即500用户将被创建为I1,然后只会再次使用I2