At ultradns.com or on comwired.com you can select multiple A records depending on location;
x.com (United States) 174.1.1.1
x.com (Europe) 65.2.2.2
So requests are routed based on proximity/where they come from.
You can do that as many times as you like, which is a great service for our distributed application needs.
However, we want to manage this on our own servers. Do you know any linux package that does this ?
Wikipedia uses the free (as in free speech, not only as in free beer) software PowerDNS to do so, with a geoip backend.
Just remember that all the GeoIP databases are imperfect and that geographical location is a poor tool to estimate the network distance to a given server. Protocols like ICS are a much better solution.
There are patches available to do GeoIP in various DNS servers.
Bind: http://www.caraytech.com/geodns/
Good writeup of Bind patches, includes RPMs: http://www.devco.net/archives/2006/07/11/location_aware_bind.php
djbdns: http://www.anders.com/cms/276/tinydns.GeoIP.patch/djbdns/Geographically.Aware
Also interesting is this hack, which involves not patching Bind: http://phix.me/geodns/
Also see http://code.google.com/p/ruby-pdns/ for something that lets you do GeoIP and a whole lot more.
I would just like to point out the ip2location BIND ACL file is subscription based, and so costs. The methods described at http://phix.me/geodns/ allow anyone to create their own BIND ACL file free of charge, using the freely downloadable MaxMind CSV file, though granted, the ip2location one is probably more accurate (accuracy is what most people pay for).
On a tangent, if anyone is looking for geo-aware BIND on the IPv6 network, I have updated the page at http://phix.me/geodns/ with further scripts which can process 128 bit numbers within a CSV file. I have just found out today that MaxMind do offer a downloadable GeoIPv6 CSV file, which these scripts will operate over to produce a GeoIPv6.acl file for BIND.