0

基本上我想做以下事情:

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++ 都可以)

4

1 回答 1

0

我认为(不确定)PowerDNS 支持自定义后端。另一种方法(只是做梦)可能是使用普通的数据库后端,并使用一些 SQL 存储过程,这些过程总是返回负载最少的 IP。此外,许多 DNS 服务器都是开源的,因此您可以根据需要修改代码。此外,BIND10 将是模块化的,并且将支持扩展(不记得如何准确地调用它们),也许这个功能可以作为这样的“扩展”添加。但我认为这个 BIND10 功能还没有准备好。

不要忘记 TTL。可能您的方法仅对低 TTL 有意义。

我认为一些商业解决方案具有此功能,可能 F5 有,但我想这不是你想要的。

于 2012-07-10T06:53:30.600 回答