基本上我想做以下事情:
string resolveDns(string host){
string rootId = "SOME_ID";
string id = rootId;
string []zones = host.split('.');
for (int i = zones.count() - 1; i >= 0; i--){
id = getZoneId(id, zones[i]);
}
string []ips = getZoneIps(id);
if (ips.count() == 1){
return ips[0];
} else {
return getLeastLoadedIp(ips);
}
}
string getZoneId(string rootId, string zoneName){
return Sql.prepare("SELECT id FROM zones WHERE parent_id=%s AND name=%s", rootId, zoneName);
}
string getZoneIps(string id){
return Sql.prepare("SELECT ip FROM zones WHERE parent_id=%s", id);
}
string getLeastLoadedIp(string []ips){
if (inMem){
int min = INT_MAX;
string ip = null;
for (int i = 0; i < ips->count(); i++){
int count = HashTable.get(queue_length, ips[i]);
if (count < min){
ip = ips[i];
min = count;
}
}
return ip;
} else {
return Sql.prepare("SELECT ip FROM zones WHERE ip IN (%a) ORDER BY queue_length ASC LIMIT 1", ips);
}
}
什么DNS服务器允许我这样做? (C或C ++很好)
答案 0 :(得分:0)
我认为(不确定)PowerDNS支持自定义后端。另一种方法(只是做梦)可能是使用普通的数据库后端,并使用一些SQL存储过程,这将返回最少加载的IP。此外,许多DNS服务器都是开源的,因此您可以根据需要修改代码。此外,BIND10将成为模块化的东西并且将支持扩展(不记得如何调用它们),mabe这个功能可以作为这样的“扩展”添加。但我认为这个BIND10功能还没有准备好。
不要忘记TTL。可能你的方法只对低TTL有意义。
我认为一些商业解决方案有这个功能,probabl F5可以,但我想这不是你要做的。