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はカスタムバックエンドをサポートしていると思います(確かではありません)。別のアプローチ(夢を見ているだけ)は、通常のデータベースバックエンドを使用し、常に最小負荷のIPを返すSQLストアドプロシージャを使用することです。また、多くのDNSサーバーはオープンソースであるため、必要に応じてコードを変更できます。また、BIND10はモジュール式であり、拡張機能をサポートする予定です(正確にそれらを呼び出す方法を覚えていません)。この機能は、そのような「拡張機能」として追加できます。しかし、このBIND10機能はまだ準備ができていないと思います。

TTLを忘れないでください。おそらく、あなたのアプローチはTTLが低い場合にのみ意味があります。

いくつかの商用ソリューションにはこの機能があると思いますが、probabl F5にはありますが、それはあなたがしていることではないと思います。

于 2012-07-10T06:53:30.600 に答える