基于内容的调度
在基于内容的调度(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(); }