基于内容的调度
在基于内容的调度(Content-based Scheduling)中,不同类型的请求会被送到不同的服务器,但是同一类型的请求有多个服务器可以选择,例如,CGI应用往往是CPU密集型的,需要多台CGI服务器去完成,这时需要将请求负载均衡地调度到这些服务器上。其基本算法如下:
while (true) {
get next request r;
extract path from static/dynamic request and set r.target;
if (definedServerSet[r.target] ==∮) then
n = {least connection node in defaultServerSet};
else
n = {least connection node in definedServerSet[r.target]};
send r to n and return results to the client;
}
当请求目标有定义的结点集,即该类型的请求有一些服务器能处理,从该结点集中挑选负载最轻的一个,把当前的请求发到该服务器。当请求目标没有定义好的结点集,则从缺省的结点集中选负载最轻的结点,由它来处理该请求。
在上面的算法中,只考虑了结点间的负载平衡和结点上静态分割好的局部性,没有考虑动态访问时的局部性。我们对该算法改进如下:
while (true) {
get next request r;
r.target = { extract path from static/dynamic request r };
if (definedServerSet[r.target] ==∮) then
staticServerSet = defaultServerSet;
else
staticServerSet = definedServerSet[r.target];
if (serverSet[r.target] == ∮) then {
n = { least connection node in statisServerSet};
add n to serverSet[r.target];
} else {
n = {least connection node in serverSet[r.target]};
if (n.conns > n.high && a node in staticServerSet with
node.conns = 2*n.high then {
n = { least connection node in staticServerSet};
add n to serverSet[r.target];
}
if |serverSet[r.target]| >1
&& time()-serverSet[r.target].lastMod > K then {
m = {most connection node in serverSet[r.target]};
remove m from serverSet[r.target];
}
}
if (r is dynamic request) then
n.conns = n.conns + 2;
else
n.conns = n.conns + 1;
send r to n and return results to the client;
if (r is dynamic request) then
n.conns = n.conns - 2;
else
n.conns = n.conns - 1;
if serverSet[r.target] changed then
serverSet[r.target].lastMod = time();
}